Последовательные данные анализируются неправильно

Код, который у меня есть, по большей части работает, но когда я слишком быстро отправляю данные через 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);
  }

, 👍0


1 ответ


Лучший ответ:

0

Установите более высокую скорость передачи данных для последовательного порта и в последовательном мониторе. Это замедляет обработку и переполняет буфер mySerial.

,

как неловко, как просто >_< Спасибо большое, @Jordan Klaers