Последовательный разбор странных данных

У меня есть проект, в котором я использую программное последовательное соединение для считывания последовательных данных со сканера штрих-кода.

Все хорошо. Однако время от времени у меня возникают проблемы с данными, которые я получаю.

Вы сказали: 123456789��?�: @���?���?���?���?���?

Вы сказали: 123456789

Вы сказали: 123456789123456

Вы сказали: 987654321789456123

Мой код похож на приведенный ниже

int count = 0; 
void parseSerial() {
  char ser[20];
  while (Serial.available() > 0) {
    char c = Serial.read();
    if ( c != '\r' && count <= sizeof(ser)) {
      ser[count] = c;
      count++;
    } else {
      Serial.print("You said : ");
      Serial.println(ser);
      for(int i=0; i < sizeof(ser); i++) {
        ser[i] = '\0';
      }
      count = 0;
    }
  }
}

Есть идеи, как мне избавиться от "��?�: @���?���?���?���?���?"?

Спасибо.

, 👍0


2 ответа


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

2

Проблема в том, что буфер изначально не инициализирован. Когда вы вызываете parseSerial(), он содержит мусор, который вы видите на последовательный монитор. Чтобы не распечатывать этот мусор, вы должны правильно завершить строку, т.е. добавить \0 после последнего допустимый символ.

Вы сделали это после печати строки (вы заполнили весь буфер с \0, что излишне), но уже слишком поздно. Последующий хотя распечатки в порядке.

Рекомендуемый способ обработки входящих серийных данных – искать завершающий символ (\r похоже на то, что вы ожидаете) и буфер все входящие байты, пока вы его не увидите. Не забудьте сохранить 1 байт буферное пространство для завершающего \0:

void parseSerial() {
    static char buffer[20];
    static int count = 0;

    while (Serial.available()) {
        int c = Serial.read();
        if (c == '\r') {           // получена полная строка
            buffer[count] = '\0';  // завершаем строку
            Serial.print(F("You said: "));
            Serial.println(buffer);
            count = 0;
        }
        else if (count < sizeof buffer - 1) {
            buffer[count++] = c;
        }
    }
}

Обратите внимание, что буфер здесь статический, поэтому вы можете накапливать частичные сообщения через последовательные вызовы parseSerial(). Только когда сообщение завершено, оно распечатает его обратно.

,

0

Почему вы используете массив символов, когда вы можете использовать String. И используйте Serial.readStringUntil('\r'); вместо Serial.read.

Код:


void parseSerial(){
String read = " ";
int count = 0;
if(Serial.available()>0){ 
while(Serial.available()>0){ 

if(count != 20){ 
read = Serial.readStringUntil('\r');
count++;
}
}

}
Serial.println("You said: ");
Serial.print(read);
}



,