Я обычно перед началом пакета отправляю идентификатор из 3-х символов
Например: "cm="
Так как пакет может покалечится в силу разных причин и последовательность данных нарушится
Выглядит примерно вот так:
Код взял здесьКод:void loop() { if (UART_ReadByte(inByte)) { if ( packid == 16 ) // контрольная сумма команды cm= { packid=0; switch (inByte) // Смотрим какая команда пришла { case 'U': // Серва поднимается if(i > min_pos) myservo1.write(i -= step_servo); break; case 'J': // Серва опускается if(i < max_pos) myservo1.write(i += step_servo); break; case 'K': // Серва поворачивается вправо if(i2 > min_pos) myservo2.write(i2 -= step_servo); break; case 'H': // Серва поворачивается влево if(i2 < max_pos) myservo2.write(i2 += step_servo); break; case 'C': // Клаксон horn(); break; case ']': // запрос состояния аналоговых датчиков byte2char(A6_Read,A7_Read); break; case 'V': // Включить/Выключить фары D9_Low; break; } else packet_id(inByte); //************************************************** void packet_id(uint8_t inbyte) //проверяем идентификатор пакета "cm=" { switch (inbyte) { case 'c': packid=2; break; case 'm': packid*=2; //packid=packid<<1; break; case '=': packid*=4; //packid=packid<<2; break; default: packid=0; } }
Работает безотказно, проверенно мной




Ответить с цитированием