DVyacheslavN Опубликовано 17 апреля, 2014 Поделиться Опубликовано 17 апреля, 2014 Здравствуйте в этой теме хотел поговорить о совместной работе пк и контроллера по 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. Может быть кто то по другому делал . все варианты принимаются 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BerZerKku Опубликовано 18 апреля, 2014 Поделиться Опубликовано 18 апреля, 2014 Если хотите работать с текстовыми командами , то можно просто воспользоваться стандартными функциями. Например так: #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; } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
20% скидка на весь каталог электронных компонентов в ТМ Электроникс!Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!Перейти на страницу акции Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849
kobzar Опубликовано 18 апреля, 2014 Поделиться Опубликовано 18 апреля, 2014 Элегантно !!! +1 0 коплю на мечту - Днепр К750 Ссылка на комментарий Поделиться на другие сайты Поделиться
Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>> Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161
DVyacheslavN Опубликовано 19 апреля, 2014 Автор Поделиться Опубликовано 19 апреля, 2014 Ну в общем понятен код только вот при добавлении новой команды придется добавлять еще условия IF а в коде который я выложил только дописать команду в массив . только я еще не довел его до ума. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BerZerKku Опубликовано 21 апреля, 2014 Поделиться Опубликовано 21 апреля, 2014 (изменено) Ниже код проверяет последовательно все команды в массиве. Но в любом случае обработчик для новой команды писать надо. 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; } Изменено 21 апреля, 2014 пользователем BerZerKku 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 21 апреля, 2014 Поделиться Опубликовано 21 апреля, 2014 Элегантно !!! +1 Я так понял, это - сарказм ? BerZerKku, Вы, похоже, "номером ошиблись". Чел прогает для МК, и я не думаю, что на плюсах Какие нафиг cout и cin ? Одумайтесь и не давайте подобных кусков кода... 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 21 апреля, 2014 Автор Поделиться Опубликовано 21 апреля, 2014 Ну в принципе у сишных языков много общего вобше 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 поменять проще будет. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 21 апреля, 2014 Поделиться Опубликовано 21 апреля, 2014 sizeof откуда взял ?? и опять же этой инструкции может и не быть в МК sizeof - стандартная Сишная функция (ну или макрос, кому как удобнее) взятия размера объекта. К ней никакой инклюд не нужен, и тем более никакой подобной инструкции в МК быть не может, это дело компилятора.подправить немного код это не проблемаГромкое заявление, учитывая Ваши посты и код вначале топика Ну чтож, тогда могу только пожелать удачи ! 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BerZerKku Опубликовано 21 апреля, 2014 Поделиться Опубликовано 21 апреля, 2014 (изменено) BerZerKku, Вы, похоже, "номером ошиблись". Чел прогает для МК, и я не думаю, что на плюсах Какие нафиг cout и cin ? Одумайтесь и не давайте подобных кусков кода... Не вижу ничего криминального, это всего-лишь реализация алгоритма. Откуда берутся данные и что находится в обработчиках уже никого волновать не должно. А уж что выбрать для МК С или С++ это отдельная тема для разговора. Изменено 21 апреля, 2014 пользователем BerZerKku 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 21 апреля, 2014 Автор Поделиться Опубликовано 21 апреля, 2014 да не спорю в программировании я не ас но коды четать умею и представлять как они работают. у меня есть вторая тема по повод SD карт и МК может вы бы поделились наработками по этому вопросу. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
BerZerKku Опубликовано 21 апреля, 2014 Поделиться Опубликовано 21 апреля, 2014 ) в этом плане у меня все плохо. Железо для отладки приготовил, но пока реальной необходимости нет и разбираться с программной частью лень. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 22 апреля, 2014 Автор Поделиться Опубликовано 22 апреля, 2014 Сижу мучаю 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 ); } 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 28 апреля, 2014 Автор Поделиться Опубликовано 28 апреля, 2014 к сожалению в коде есть еще ошибки , в МPLAB неудобно проверять программу взялся за освоения Visual Studio. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 1 мая, 2014 Автор Поделиться Опубликовано 1 мая, 2014 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; } все отладил работу своего кода . )) и в протеусе проверил все гуддд 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 26 июня, 2014 Автор Поделиться Опубликовано 26 июня, 2014 #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 многие занют поэтому не стал их выкладывать. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 26 июня, 2014 Поделиться Опубликовано 26 июня, 2014 Это не коды, а издевательство над PIC'ом 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 26 июня, 2014 Автор Поделиться Опубликовано 26 июня, 2014 )))) че думаешь перегреется . и взорвется не думаю что все так плохо . темболее половину я взял из книжных источников. да при моделировании загрузка пика низкая. хотя одно можно исправить обработку usarta в прерывания запихать. да и памяти еще завались )) осталось -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 16 июля, 2014 Автор Поделиться Опубликовано 16 июля, 2014 Подскажите пожалуйста как преобразовать число в строку для МК или скиньте ссылку на материал. -1 Ссылка на комментарий Поделиться на другие сайты Поделиться
marinovsoft Опубликовано 16 июля, 2014 Поделиться Опубликовано 16 июля, 2014 itoa ftoa 1 FAQ по ремонту компьютерного железа FAQ по ремонту жестких дисков Ссылка на комментарий Поделиться на другие сайты Поделиться
Alex Опубликовано 16 июля, 2014 Поделиться Опубликовано 16 июля, 2014 скиньте ссылку на материал. http://os24.org/file...Language-RU.pdfСобственно, эта книга должна быть настольной. В ней быстрее можно найти ответы на многие вопросы, чем ждать пока ответят на форуме. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 29 сентября, 2014 Автор Поделиться Опубликовано 29 сентября, 2014 Книжка интересная ). Только не могу понять почему у меня scanf не работает . библиотеку подключил 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 29 сентября, 2014 Автор Поделиться Опубликовано 29 сентября, 2014 получается что в подключаемой бибилиотеки функции нет а когда я залез в нее то увидил следущее #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); 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 13 октября, 2014 Автор Поделиться Опубликовано 13 октября, 2014 (изменено) вот модифицировал кот проверки строк . теперь можно привязаться к 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; } Изменено 13 октября, 2014 пользователем DVyacheslavN 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
DVyacheslavN Опубликовано 9 февраля, 2015 Автор Поделиться Опубликовано 9 февраля, 2015 Всем , здрасти, решил выложить свою прогу . работает с командами формата # далее номер команды ^-запись в буфер если треб и | - коней команды . жду критику. )) может что подскажете , также вложил фай proteus . чтобы заработал терминал надо набрать команду #15| в слепую . ссылка http://rghost.ru/pri...a9a9a249b55fbcc 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
dosikus Опубликовано 15 февраля, 2015 Поделиться Опубликовано 15 февраля, 2015 Присмотрись к micro readline http://habrahabr.ru/post/127890/ . На пЫк и AVR конечно затратно по ресурсам, но всяко лучше изобреДений лисапедов. 0 Ссылка на комментарий Поделиться на другие сайты Поделиться
Рекомендуемые сообщения
Присоединяйтесь к обсуждению
Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.