Последовательные данные анализируются неправильно
Код, который у меня есть, по большей части работает, но когда я слишком быстро отправляю данные через Bluetooth, полученные через последовательный порт программного обеспечения, они не анализируются правильно.
Я немного запутался в том, что можно сделать, чтобы отменить неправильное форматирование, поскольку это работает правильно, если я отправляю данные медленно.
Я мог бы иметь буфер, который бы не отправлял данные более одного раза за установленный промежуток времени, но предпочтительнее более быстрое реагирование.
Я отправляю строку «center:255,0,255;» он сохраняет команду в массиве символов до тех пор, пока не увидит «:», затем сохраняет красный цвет в массиве символов, разбиваясь на «», затем то же самое для синего и зеленого. когда он достигает ";" он отправляет четыре массива на печать на консоль. Позже эти данные будут использоваться для включения определенных светодиодов на основе команды, но когда я отправляю данные слишком быстро, они анализируются неправильно, например:
command: center
red:195
green:0
blue:255
command: center
red:208
green:0center:221
blue:0,255
command: center
red:246
green:0
blue:255
Зеленый:0center:221 неверен: либо не виден ", либо не виден ";" слишком рано. Не знаю, как этого избежать.
#include <SoftwareSerial.h>
SoftwareSerial mySerial(6,7); // прием, передача
void setup() {
Serial.begin(9600);
mySerial.begin(57600); //требуется при использовании hm-10 с Arduino Nano
mySerial.listen();
}
void loop() {
while (mySerial.available () > 0) {
processIncomingByte (mySerial.read ());
}
}
const unsigned int MAX_INPUT = 50;
void processIncomingByte (const byte inByte) {
static int parse_the_string = 0;
static char command [MAX_INPUT];
static char red [MAX_INPUT];
static char green [MAX_INPUT];
static char blue [MAX_INPUT];
static unsigned int input_pos = 0;
switch (parse_the_string) {
case 0:
switch (inByte) {
case ':':
command [input_pos] = 0; // завершающий нулевой байт
input_pos = 0;
parse_the_string ++;
break;
default:
if (input_pos < (MAX_INPUT - 1))
command [input_pos++] = inByte;
break;
}
break;
case 1:
switch (inByte) {
case ',': // конец текста
red [input_pos] = 0; // завершающий нулевой байт
input_pos = 0;
parse_the_string ++;
break;
default:
if (input_pos < (MAX_INPUT - 1))
red [input_pos++] = inByte;
break;
}
break;
case 2:
switch (inByte) {
case ',': // конец текста
green [input_pos] = 0; // завершающий нулевой байт
input_pos = 0;
parse_the_string ++;
break;
default:
if (input_pos < (MAX_INPUT - 1))
green [input_pos++] = inByte;
break;
}
break;
case 3:
switch (inByte) {
case ';': // конец текста
blue [input_pos] = 0; // завершающий нулевой байт
// терминатор достигнут! обработать input_line здесь...
process_data (command, red, green, blue);
input_pos = 0;
parse_the_string = 0;
break;
case '\r': // отбрасываем возврат каретки
break;
default:
if (input_pos < (MAX_INPUT - 1))
blue [input_pos++] = inByte;
break;
} // конец переключателя
break;
default:
break;
}
}
void process_data (const char * command, const char * red, const char * green, const char * blue)
{
// пока просто отображаем это
Serial.print ("command: ");
Serial.println (command);
Serial.print ("red:");
Serial.println (red);
Serial.print ("green:");
Serial.println (green);
Serial.print ("blue:");
Serial.println (blue);
}
@Jordan Klaers, 👍0
1 ответ
Лучший ответ:
Установите более высокую скорость передачи данных для последовательного порта и в последовательном мониторе. Это замедляет обработку и переполняет буфер mySerial.
- Ошибка 'Serial' was not declared in this scope
- Serial.availableForWrite против Serial.flush
- Повреждение данных SoftwareSerial - поиск предложений
- Какой лучший способ объявить Serial при создании библиотеки Arduino?
- Термопринтер Adafruit печатает слабо
- Последовательная связь, если инструкция не работает
- Проблемы при использовании SoftwareSerial
- Найдите ОК или ОШИБКУ в последовательной строке
как неловко, как просто >_< Спасибо большое, @Jordan Klaers