привет всем.. кто подскажет как написать код ?, что бы ардуинка сидела и слушала Uart на предмет прохождения пакета к примеру 0x55 0x04 0xe4 0x04 0x03 выдала бы вот ответ пакет 0x55 0x04 0xe4 0x01
Код (C++): byte GetData[] = {0x02,0x12,0x00} byte DataOtvet[] = {0x02,0x06,0x06,0x06,0x06,0x06}; void setup(){ Serial.begin(115200); } void loop(){ if(Serial.available() > 5) { for(int i=0;i<6;i++){ if(GetData[i]!=Serial.read()){ Serial.write(DataOtvet[]); } } } } что то типа такого?
Код (C++): byte GetData[] = {0x55,0x04,0xe4,0x04,0x03}; byte DataOtvet[] = {0x55,0x04,0xe4,0x01}; byte InData[5]; void setup(){ Serial.begin(115200); } void loop(){ if(Serial.available() > 5) { Serial.readBytesUntil('0',InData,5); for(int i = 0;i<5;i++){ if(GetData[i]=InData[i])Serial.write(DataOtvet,sizeof(DataOtvet)); } } } поправь плз если где то накосячил) в итоге имеем ..еcли прилетает пакет 0x55,0x04,0xe4,0x04,0x03 то ардуинка тут же шлет в ответ 0x55,0x04,0xe4,0x01
правильней все же будет без цикла if GetData[1]==InData[1] && GetData[2]==InData[2] ...и по аналогии если длинна фиксированная конечно
так мы сравниваем каждый байт в отдельности и если правильные все тогда отвечаем а так мы будем отправлять пакет при каждом совпадении...
такс... а как написать если мне нужна проверка пакета длинной 20 байт?)) что все 20= писать что ль?) .. может есть програмистский ход конем что красиво все было ?
Код (C++): byte GetData[] = {0x55,0x04,0xe4,0x04,0x03}; byte DataOtvet[] = {0x55,0x04,0xe4,0x01}; byte InData[5]; int state=0; void setup(){ Serial.begin(115200); } void loop(){ if(Serial.available() > 5) { Serial.readBytesUntil('0',InData,5); for(int i = 0;i<5;i++){ if(GetData[i]=InData[i]) { state=1; }else { break; } ; if (state=1)Serial.write(DataOtvet,sizeof(DataOtvet)); state=0; } } }
Код (C++): byte GetData[] = {0x55, 0x04, 0xe4, 0x04, 0x03}; byte DataOtvet[] = {0x53, 0x65, 0x6e, 0x64, 0x31, 0x32}; bool correct_byte; byte InData[sizeof(GetData)]; void setup() { Serial.begin(115200); } void loop() { if (Serial.available()) { Serial.readBytes(InData, sizeof(GetData)); for (int i = 0; i < sizeof(InData); i++) { if (GetData[i] == InData[i]) correct_byte = true; else { correct_byte = false; break; } } if (correct_byte) { correct_byte = false; Serial.write(DataOtvet, sizeof(DataOtvet)); } } } тогда уж так и то не лишено недостатков
спасибо огромное за помощь.. но получив сей код.. понял еще дальше по своей задаче.. в итоге имею: есть девять массивов байт при получении ардуинкой которых, она должна дать в ответ 1 из 9 других массиво данных.. Код (C++): byte GetData1[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0xDF}; byte DataOtvet1[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A}; byte GetData2[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x92}; byte DataOtvet2[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x01,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0xAA,0x5B}; byte GetData3[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x44}; byte DataOtvet3[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x02,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xAC}; byte GetData4[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x09}; byte DataOtvet4[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x03,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0x17,0xED}; byte GetData5[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x8E}; byte DataOtvet5[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A}; byte GetData6[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x01,0x00,0x40,0x00,0x01,0xC3,0x41}; byte DataOtvet6[] = {0x55,0x2B,0x04,0x58,0x0c,0x03,0x01,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x9f,0x01,0x04 надо дописать crc}; byte GetData7[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x02,0x00,0x40,0x00,0x01,0xC3,0x41}; byte DataOtvet7[] = {0x55,0x2B,0x04,0x58,0x2c,0x03,0x02,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x59,0x01,0x04 надо дописать crc}; byte GetData8[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x03,0x00,0x40,0x00,0x01,0xC3,0x41}; byte DataOtvet8[] = {0x55,0x2B,0x04,0x58,0x4c,0x03,0x03,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0xE2,0x01,0x04 надо дописать crc}; byte GetData9[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x04,0x00,0x40,0x00,0x01,0xC3,0x41}; byte DataOtvet9[] = {0x55,0x2B,0x04,0x58,0x6c,0x03,0x04,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x38,0x01,0x04 надо дописать crc}; byte InData[5]; int state=0; void setup(){ Serial.begin(115200); } void loop(){ if(Serial.available() > 50) { } } как бы правильнее это написать? .. не писать же case везде ? на каждый GetData .. может быть только один ответ DataOtvet
Код (C++): byte GetData10[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD3,0xDF}; byte GetData11[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xa8,0x8e}; byte DataOtvet1[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A}; byte GetData20[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x2e,0x92}; byte GetData21[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x55,0xc3}; byte DataOtvet2[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x01,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0xAA,0x5B}; byte GetData30[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x29,0x44}; byte GetData31[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x52,0x15}; byte DataOtvet3[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x02,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x16,0xAC}; byte GetData40[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xD4,0x09}; byte GetData41[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x40,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xaf,0x58}; byte DataOtvet4[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x03,0x13,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0x2F,0x00,0x00,0x00,0x00,0x17,0xED}; byte GetData50[] = {0x55,0x12,0x00,0xA6,0xA0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xA8,0x8E}; byte DataOtvet50[] = {0x55,0x1C,0x00,0x7A,0xA0,0x01,0x00,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xAB,0x1A}; byte GetData60[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x01,0x00,0x40,0x00,0x01,0xC3,0x41}; byte DataOtvet60[] = {0x55,0x2B,0x04,0x58,0x0c,0x03,0x01,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x9f,0x01,0x04,0x4d,0x8c}; byte GetData70[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x02,0x00,0x40,0x00,0x01,0x6f,0xd9}; byte DataOtvet70[] = {0x55,0x2B,0x04,0x58,0x2c,0x03,0x02,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x59,0x01,0x04,0xae,0x53}; byte GetData80[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x03,0x00,0x40,0x00,0x01,0x9a,0x55}; byte DataOtvet80[] = {0x55,0x2B,0x04,0x58,0x4c,0x03,0x03,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0xE2,0x01,0x04,0x57,0x0a}; byte GetData90[] = {0x55,0x0D,0x04,0x33,0x03,0x0c,0x04,0x00,0x40,0x00,0x01,0x26,0xe0}; byte DataOtvet90[] = {0x55,0x2B,0x04,0x58,0x6c,0x03,0x04,0x00,0xc0,0x00,0x01,0x00,0x10,0x57,0x4d,0x33,0x32,0x30,0x5f,0x45,0x53,0x43,0x5f,0x56,0x39,0x00,0x00,0x00,0x00,0x02,0x02,0x00,0x01,0x00,0x00,0x0a,0x01,0xad,0x38,0x01,0x04,0x05,0x38}; byte InData[5]; int state=0; void setup(){ Serial.begin(115200); } void fnDataOtvet1() { for (int i=0;i<28;i++){ Serial.write(DataOtvet1[i],28); } }
длина пакета (массива) к примеру GetData90[], или любого другого пакета содержится в втором байте по сути.. мне кажется надо так 1. получаем данные с UART 2. как только встречаем пакет 0x55 , делаем начало сбора пакета 3. получаем второй пакет, переводим в десятичную, на выходе получаем длину пакета также добавляем егов массив 4. на основании длины пакета, получаем с UART остальные пакеты, пока i не станет равно длине пакета 5. как только пакеты все получены и массив сформирован 6. сверяем его с одним из 13 пакетов и при нахождении соответсвия выдает определенный пакет в ответ. я правильно описал логику работы? или надо не ждать конца пакета а побайтно сравнивать со всеми 13 массивами и если при окончании вхождение найдено . тут же выдать ответ. или как ?)
че то нигде нет описания толкового на ReadByteUntil, каким макаром она дожидается окончания пакета?.. вобщем совсем зарылся.. логика понятна а синтаксис хромает
ну просто когда не оч понимаю) могу наделать ошибок .. Код (C++): bool compareArrays(byte Array_1[],byte Array_2[],bool Size){ int minSize; if(sizeof(Array_1)!=sizeof(Array_2)&&!Size)return(false); if(sizeof(Array_1)>sizeof(Array_2))minSize = sizeof(Array_2); else minSize = sizeof(Array_1); for(int i = 0; i < sizeof(minSize); i++) if(Array_1[i]!=Array_2[i])return(false); return(true); } void setup(){ Serial.begin(115200); } void loop() { 1. сначала ловим байт 0х55.. что бы не нарваться на остатки прошлого пакета 2. как только находим байт, ставим флаг что начало пакета найдена 3. слушаем второй байт , он определяет длинну будущего пакета, формируем переменную lengthTemp 4. начинаем дальше слушать и записываьб байты в массив пока не i!=(lengthTemp-2) -2 потому что первые два байта ушли на пакет и байт длины 5. ставим флаг endPacketFlag=1 что сборка пакета завершена 6. если флаг endPacketFlag=1, то запускаем цикл сравнения двух массивов 7. при нахождении соответствия, запускаем функцию выдачи в порт массива значений. 8. дальше опять ловим байт 0х55 } алгоритм то хоть правильный ? какие команды или куски кода использовать? ..оч нужно а сам не могу (
ооо нашел ответ . мож кому пригодиться Код (C++): struct CMsg { const byte * const In; const byte * const Out; const int SizeIn; const int SizeOut; CMsg ( byte * in, int size_in, const byte * out, int size_out ) : In ( in ) , SizeIn ( size_in ) , Out ( out ) , SizeOut ( size_out ) {} }; CMsg Messages [] = { CMsg ( GetData10, sizeof (GetData10), DataOtvet1, sizeof (DataOtvet1) ), CMsg ( GetData11, sizeof (GetData11), DataOtvet1, sizeof (DataOtvet1) ), CMsg ( GetData20, sizeof (GetData20), DataOtvet2, sizeof (DataOtvet2) ), CMsg ( GetData21, sizeof (GetData21), DataOtvet2, sizeof (DataOtvet2) ), CMsg ( GetData30, sizeof (GetData30), DataOtvet3, sizeof (DataOtvet3) ), CMsg ( GetData31, sizeof (GetData31), DataOtvet3, sizeof (DataOtvet3) ), CMsg ( GetData40, sizeof (GetData40), DataOtvet4, sizeof (DataOtvet4) ), CMsg ( GetData41, sizeof (GetData41), DataOtvet4, sizeof (DataOtvet4) ), CMsg ( GetData50, sizeof (GetData50), DataOtvet5, sizeof (DataOtvet5) ), CMsg ( GetData60, sizeof (GetData60), DataOtvet6, sizeof (DataOtvet6) ), CMsg ( GetData70, sizeof (GetData70), DataOtvet7, sizeof (DataOtvet7) ), CMsg ( GetData80, sizeof (GetData80), DataOtvet8, sizeof (DataOtvet8) ), CMsg ( GetData90, sizeof (GetData90), DataOtvet9, sizeof (DataOtvet9) ) }; /* * Test std::vector */ void setup() { Serial.begin(115200); } void loop() { // put your main code here, to run repeatedly: byte cur; do { cur = Serial.read(); } while ( cur != 0x55); byte msg_len = Serial.read (); byte Buffer [ 256 ]; for ( int i = 0; i != msg_len; ++i ) { Buffer [ i ] = Serial.read (); } for ( int i = 0; i != sizeof ( Messages ) / sizeof ( CMsg); ++i ) { if ( Messages [ i ].SizeIn != msg_len ) continue; bool Valid = true; for ( int j = 0; j != msg_len; ++j ) { if ( Messages [ i ].In [ j ] != Buffer [ j ] ) { Valid = false; break; } } if ( Valid ) { for ( int j = 0; j != Messages [ i ].SizeOut; ++j ) Serial.write ( Messages [ i ].Out [ j ] ); return; // reply sent } } }