• Объявления

    • admin

      Просьба всем принять участие!   24.11.2017

      На форуме разыгрывается спектроанализатор Arinst SSA-TG LC (цена 18500 руб). Просьба всем перейти по ссылке ниже и принять участие!
DVyacheslavN

Usart И Терминал Пк . Общение Пк С Контроллером.

41 сообщение в этой теме

Здравствуйте в этой теме хотел поговорить о совместной работе пк и контроллера по RS485. Задача следующая пояснить как организовать список команд в контроллере которые выполняли бы определенные действия после посылки через терминал Имя этой команды. и получение ответа в конце выполнения. Для начало привожу пример кода

/************************Сравнение массивов************/

bit ArrayCompare (char x[10], char ref[10] ) {

//

char i=0;

char bt=1;

if (x!=0) {

while (ref != '\0') {

if (x==ref) bt=1&&bt;

else bt=0&&bt;

i++;

}

}

if (bt) return 1 ;

if(bt!=1)return 0;

}

/*********** сравниваемые переменные***************** */

char VariableCompare (char x [50]) {

char Bstp=0;

const char

vari[30]={"|WRITE||READ|!"}; команды которые которые доступны через терминал

char numComm=0;

char ty[10];

char i=0;

do {

if (vari=='|' && vari[i+1]=='|') { если || то +1 к счетчику

numComm++;

}

if (vari=='|' && vari[i+1]!='|') { если |W (короче если после символа | появляется текст то присвоить этот тест строковому массиву ty[10])

i++;

while (vari!='|'){

ty[10]=vari;

i++;

}

}

if (vari=='\0'){ если |! конец архива команд вернет 255

Bstp=1;

numComm=255;

}

i++;

}while (ArrayCompare(x[10], ty[10]) || Bstp ); Пока Сравниваемые массивы (тобиш одна из команд контроллера и команда терминала не совпадут или не дастигнут конец массива команд делать выше сказанную хренатень. )))

return numComm;

}

он не совсем правильно работает .

Логика следующая я получил какую то текстовю переменную (команду) например "WRITE" из буфера при запуске функциии Variable Compare эту текстовую команду я должен найти в "vari[30]" при этом команды в строковом массиве разделены || а конец массива |! сравнивать естественно я должен по буквам начиная с 2 символа в массиве |WRITE||READ|! также должен быть счетчик команд. если команда WRITE есть то возвращает 1 если команда READ есть то возвращает 2 то есть || при переходе этих двух символов счетчик должен увеличиваться на 1 и если сравнение удачно то вернет 2. Может быть кто то по другому делал . все варианты принимаются

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Быстрый заказ печатных плат

Полный цикл производства PCB по низким ценам!

  • x
    мм
Заказать Получить купон на $5.00
BerZerKku    1

Если хотите работать с текстовыми командами , то можно просто воспользоваться стандартными функциями. Например так:

#include <iostream>
using namespace std;
int main() {
char comWrite[] = "WRITE";
char comRead[] = "READ";
char comExit[] = "EXIT";
char *com = new char[10];
while(1) {
 cout << "Введите команду: ";
 cin >> com;

 if (!strcmp(com, comWrite)) {
  cout << 1 << endl;
 } else if (!strcmp(com, comRead)) {
  cout << 2 << endl;
 } else if (!strcmp(com, comExit)) {
  cout << 3 << endl;
  break;
 } else {
  cout << 0 << endl;
  break;
 }
}
return 0;
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну в общем понятен код только вот при добавлении новой команды придется добавлять еще условия IF а в коде который я выложил только дописать команду в массив . только я еще не довел его до ума.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BerZerKku    1

Ниже код проверяет последовательно все команды в массиве. Но в любом случае обработчик для новой команды писать надо.

int main() {
char comText[] [10] = {
"WRITE",
"READ",
"EXIT"
};

char *comName = new char[10];
char com = 0;

while (1) {

cout << "Введите команду:";
cin >> comName;

for(com = 0; com < sizeof(comText)/sizeof(comText[0]); com++) {
cout << comName << " , " << (com+'0') << " , " << comText[com] << endl;
if (!strcmp(comName, comText[com])) {
com++;
break;
}
}

cout << (com+'0') << endl;

if (com == 1) {
cout << 1 << endl;
} else if (com == 2) {
cout << 2 << endl;
} else if (com == 3) {
cout << 3 << endl;
break;
} else {
cout << 0 << endl;
break;
}
}
return 0;
}

Изменено пользователем BerZerKku

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    524

Элегантно !!!

+1

Я так понял, это - сарказм ? :)

BerZerKku, Вы, похоже, "номером ошиблись". Чел прогает для МК, и я не думаю, что на плюсах :)

Какие нафиг cout и cin ? Одумайтесь и не давайте подобных кусков кода... :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ну в принципе у сишных языков много общего вобше ANSI C, подправить немного код это не проблема. как говориться на безрыбье и рак рыба.

Ниже код проверяет последовательно все команды в массиве. Но в любом случае обработчик для новой команды писать надо.

int main() {
char comText[] [10] = {
"WRITE",
"READ",
"EXIT"
};

char *comName = new char[10];
char com = 0;

while (1) {

cout << "Введите команду:";
cin >> comName;

for(com = 0; com < sizeof(comText)/sizeof(comText[0]); com++) {
cout << comName << " , " << (com+'0') << " , " << comText[com] << endl;
if (!strcmp(comName, comText[com])) {
com++;
break;
}
}

cout << (com+'0') << endl;

if (com == 1) {
cout << 1 << endl;
} else if (com == 2) {
cout << 2 << endl;
} else if (com == 3) {
cout << 3 << endl;
break;
} else {
cout << 0 << endl;
break;
}
}
return 0;
}

Только вот include не написал sizeof откуда взял ?? и опять же этой инструкции может и не быть в МК

if (com == 1) {

cout << 1 << endl;

} else if (com == 2) {

cout << 2 << endl;

} else if (com == 3) {

cout << 3 << endl;

break;

} else {

cout << 0 << endl;

break;

}

}

return 0;

}

вот этот кусок кода можно на Switch поменять проще будет.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    524
sizeof откуда взял ?? и опять же этой инструкции может и не быть в МК
sizeof - стандартная Сишная функция (ну или макрос, кому как удобнее) взятия размера объекта. К ней никакой инклюд не нужен, и тем более никакой подобной инструкции в МК быть не может, это дело компилятора.
подправить немного код это не проблема
Громкое заявление, учитывая Ваши посты и код вначале топика :)

Ну чтож, тогда могу только пожелать удачи ! :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BerZerKku    1

BerZerKku, Вы, похоже, "номером ошиблись". Чел прогает для МК, и я не думаю, что на плюсах :)

Какие нафиг cout и cin ? Одумайтесь и не давайте подобных кусков кода... :)

Не вижу ничего криминального, это всего-лишь реализация алгоритма. Откуда берутся данные и что находится в обработчиках уже никого волновать не должно. А уж что выбрать для МК С или С++ это отдельная тема для разговора. Изменено пользователем BerZerKku

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

да не спорю в программировании я не ас но коды четать умею и представлять как они работают. у меня есть вторая тема по повод SD карт и МК может вы бы поделились наработками по этому вопросу.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
BerZerKku    1

) в этом плане у меня все плохо. Железо для отладки приготовил, но пока реальной необходимости нет и разбираться с программной частью лень.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Сижу мучаю Borland C++ нашёл ошибку в коде который выложил .

if (vari=='|' && vari[i+1]!='|') { если |W (короче если после символа | появляется текст то присвоить этот тест строковому массиву ty[10])

i++;

while (vari!='|'){

ty[10]=vari; место этого должно быть ty[i-1]=vari;

i++;

теперь VariableCompare работает так ка нужно . позже попробую скомпилировать для МК.

проблема то была в том что массив ty[10 ] должен был быть заполнен строкой и отправлен в ArrayCompare а он у меня не заполнялся вот код который правлеьно заполняет массив ty[10 ] без символа |

#include <iostream>

void main () {

char x[] ="";

char Bstp=0;

const char

vari[30]={"|WRITE||READ|!"};

char numComm;

char ty[10]="12";

char i=0;

do {

numComm=0;

cout << "VVedite komandy" ;

cin >> x ;

if (vari=='|' && vari[i+1]=='|' ) {

}

if (vari=='|' && vari=='|') {

numComm++;

}

if (vari=='|' && vari[i+1]!='|') {

i++;

while (vari!='|'){

ty[i-1]=vari;

i++;

}

}

if (vari=='\0'){

Bstp=1;

numComm=4;

}

i++;

cout << ty << endl ;

cout << numComm << endl ;

}while ( 1 );

}

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

к сожалению в коде есть еще ошибки , в МPLAB неудобно проверять программу взялся за освоения Visual Studio.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

void print (int x);

char ArrayCompare (char x[10] , char ref[10]);

char VariableCompare (char x [50]);

int main () {

char x[20]={"READ"} ;

print (VariableCompare(x));

}

char ArrayCompare (char x[10], char ref[10] ) {

//

char i=0;

char bt=0;

if (x!=0 && ref!=0) {

bt=1;

while (ref != '\0') {

if (x==ref) bt=1&&bt;

else bt=0&&bt;

i++;

}

}

if (bt) return 1 ;

if(bt!=1)return 0;

}

char VariableCompare (char x [50]) {

char Bstp=0;

const char vari[30]={"||WRITE||READ||END||"};

char numComm=0;

char ty[10]={""};

char skbt=0;

char i=0;

do {

if (vari=='|' && vari[i+1]=='|') {

numComm++;

i++;

skbt=1;

}

if (vari=='|' && vari[i+1]!='|' && !skbt) {

i++;

char g=0;

while (ty[g]!='\0' ){

ty[g]='\0';

g++;

}

g=0;

while (vari!='|' ){

ty[g]=vari;

g++;

i++;

}

}

if (vari[i+1]=='\0'){

Bstp=1;

numComm=4;

}

skbt=0;

}while ((ArrayCompare(x, ty) || Bstp)==0 );

return numComm;

}

void print (int x) {

std::cout << x << std:: endl;

}

все отладил работу своего кода . ))

и в протеусе проверил все гуддд

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

#include <pic.h>
#include <InitWriteRead.c>
#include <compare_text.c>
#include <Usart_terminal_Un.c>
char SPI (char d);
//********************************************************************
char SPI(char d) // Передача по SPI-интерфейсу
{
SSPBUF=d;
while (!BF); // Ожидание окончания передачи
return SSPBUF; // и одновременно принимаем
}
//**********************************************************************
void main(void)
{
INTCON=0; // Отключить прерывания
ADCON1=0x6; // PortA как цифровые выходы
TRISC=0b11010011; // sck rc3-0, sdo rc5-0, CS rc2-0.
TRISB=0b00000010; // RB2>TX, RB1>RX
InitUSART(); // Инициализация последовательной передачи данных
SerString("Ich bin ON "); // Стартовое сообщение
if (MMC_Init()) SerString("MMC ON "); // Инициализация MMC и сообщение, если всё нормально!
while (1){
if (RCIF || TXIF ) RCp();
switch (Ncommand) {
case 1 :
SerString ("...WRITE...");
break;
case 2 :
SerString ("...READ...");
break;
case 3 :
SerString ("...END...");
break;
case 4 :
SerString ("error command");
TXREG ='\r','\n','\0';
break;
}
Ncommand =0;
}
}

 
#include <pic.h>
unsigned char CharOutIndex = 0;
unsigned char CharInIndex = 3;
unsigned char SingleCharFlag = 0;  //Для передачи одного символа строки
extern void write (char x);
char StringOut[10] = "fds";
void SerString(const char *str);
char Ncommand =0;
void RCp (void);
char Srav (char x[10]);
void RCp (void) {
unsigned char temp;
if (RCIF) { //если запрос на прерывание получен от приемника:
 if ((temp = RCREG) < 0x020) // получен управляющий символ
  if (temp == 0x008) //этот символ backspace
if (CharInIndex > 0) {

}else;
  else if (temp == 0x0d) { //enter -конец строки

 StringOut[CharInIndex++] = '\r';	
 StringOut[CharInIndex++] = '\n';
 StringOut[CharInIndex] = '\0'; 
 CharInIndex = 0;
 CharOutIndex = 0;
TXREG='\r','\n','\0';
//SerString (StringOut);
Ncommand = VariableCompare (StringOut);
StringOut[10]="";
}
else;
 else {	    // Обычные символы ASII
  if ((temp >= 'a') && (temp <= 'z'))
 temp -= ('a' - 'A');
  if (CharInIndex < 23) { //отправить назад
StringOut[CharOutIndex = CharInIndex] = temp;
StringOut[++CharInIndex] = '\0';
   // Символ конца строки
TXIF = 1;
SingleCharFlag = 1;
if ((temp = StringOut[CharOutIndex]) == '\0'){
TXIF = 0;

}
else {
  TXREG = temp;	  //вывод очередного символа
  CharOutIndex++;  //передвинуть указатель к следующему символу
}}}
RCIF = 0;    //сбросить флаг прерывания.
}}
void SerString(const char *str)
{
char ps;
ps=*str;
while (ps>0)
{
*str++;
if (ps==0) break;
while (!TXIF);
TXREG=ps;
ps=*str;
}
}

 

/************************Сравнение массивов************/
char ArrayCompare (char x[10], char ref[10] ) {
char i=0;
char bt=0;
if (x[i]!=0 && ref[i]!=0) {
bt=1;
while (ref[i] != '\0') {
if (x[i]==ref[i]) bt=1&&bt;
else bt=0&&bt;
i++;
}}
if (bt) return 1 ;
if(bt!=1)return 0;
}
/*********** сравниваемые переменные*****************/

char VariableCompare (char x [50]) {
const char CompComm[30]={"||WRITE||READ||END||"};
char Bstp=0;

char numComm=0;
char ty[10]={""};
char skbt=0;
char i=0;
do {
if (CompComm[i]=='|' && CompComm[i+1]=='|') {
numComm++;
i++;
skbt=1;
}
if (CompComm[i]=='|' && CompComm[i+1]!='|' && !skbt) {
i++;
char g=0;
while (ty[g]!='\0' ){
ty[g]='\0';
g++;
}
g=0;
while (CompComm[i]!='|' ){
ty[g]=CompComm[i];
g++;
i++;
}
}
if (CompComm[i+1]=='\0'){
Bstp=1;
numComm=4;
}

skbt=0;
}while ((ArrayCompare(x, ty) || Bstp)==0 );
return numComm;
}

Выложил коды программы для общения микроконтроллера и компютера , будет полезно комунебудь . настройки usart многие занют поэтому не стал их выкладывать.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    524

Это не коды, а издевательство над PIC'ом :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

))))

че думаешь перегреется . и взорвется :bomb: не думаю что все так плохо . темболее половину я взял из книжных источников. да при моделировании загрузка пика низкая. хотя одно можно исправить обработку usarta в прерывания запихать.

да и памяти еще завались )) осталось

  • Не одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Подскажите пожалуйста как преобразовать число в строку для МК или скиньте ссылку на материал.

  • Не одобряю 1

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Alex    524
скиньте ссылку на материал.
http://os24.org/file...Language-RU.pdf

Собственно, эта книга должна быть настольной. В ней быстрее можно найти ответы на многие вопросы, чем ждать пока ответят на форуме.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Книжка интересная ). Только не могу понять почему у меня scanf не работает . библиотеку подключил

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

получается что в подключаемой бибилиотеки функции нет а когда я залез в нее то увидил следущее

#if defined(_PIC16)
extern unsigned char  sprintf(far char *, const char *, ...);
#else /* _PIC16 */
extern unsigned char  sprintf(char *, const char *, ...);
#endif
#if defined(_PIC18)
extern int printf(const char *, ...);
#else
extern unsigned char printf(const char *, ...);
#endif
#else /* _MPC_ */
extern char * gets(char *);
extern int puts(const char *);
extern int scanf(const char *, ...);
extern int sscanf(const char *, const char *, ...);
extern int  vprintf(const char *, va_list);
extern int vsprintf(char *, const char *, va_list);
extern int vscanf(const char *, va_list ap);
extern int vsscanf(const char *, const char *, va_list);

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

вот модифицировал кот проверки строк . теперь можно привязаться к i и вперед . ))

#include <stdio.h>
#include <stdlib.h>
#include <pic.h>
#include <string.h>
#define _HOSTED =1
#define MAXLINE 15
extern void init_comms();
int getline(char s[], int lim);
char comTEXT[5] [10]= {"INIT", "WRITE", "READ"};
/*
*
*/
int main(int argc, char** argv) {
int gdd, fg = 255;
char text[MAXLINE] = {""};
int d = 0;
init_comms();
while (1) {

 while ((d = getline(text, MAXLINE)) > 0) {
	 if (text[d--] == '\r') {
		 text[d] = '\0';

int i;
		 for ( i=0;(fg=strcmp(comTEXT[i], text))!=0 && i<3; i++);
		 printf ("%d %d", fg , i);
	 }
 }
}
return (EXIT_SUCCESS);
}
int getline(char s[], int lim) {
int c, i = 0;
while (--lim > 0 && (c = getchar()) != EOF && c != '\r')
 s[i++] = c;
if (c == '\r')

 s[i++] = c;
s[i] = '\r';
return i;
}

Изменено пользователем DVyacheslavN

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Всем , здрасти, решил выложить свою прогу . :umnik2: работает с командами формата # далее номер команды ^-запись в буфер если треб и | - коней команды . жду критику. )) может что подскажете , также вложил фай proteus . чтобы заработал терминал надо набрать команду #15| в слепую :bomb: . ссылка http://rghost.ru/pri...a9a9a249b55fbcc

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте аккаунт или войдите в него для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать аккаунт

Зарегистрируйтесь для получения аккаунта. Это просто!

Зарегистрировать аккаунт

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас