Последовательный разбор странных данных
У меня есть проект, в котором я использую программное последовательное соединение для считывания последовательных данных со сканера штрих-кода.
Все хорошо. Однако время от времени у меня возникают проблемы с данными, которые я получаю.
Вы сказали: 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;
}
}
}
Есть идеи, как мне избавиться от "��?�: @���?���?���?���?���?"?
Спасибо.
@Paul Dumitru, 👍0
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()
. Только когда
сообщение завершено, оно распечатает его обратно.
Почему вы используете массив символов, когда вы можете использовать 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);
}
- Печать массива с помощью функции печати и последовательной записи в Arduino Uno
- Как создать массив из serial.read?
- массив в последовательный порт
- Как преобразовать строку в шестнадцатеричный массив
- Ввод строки в массив символов
- Матричный дисплей с Arduino UNO (ПРОБЛЕМА)
- Самый быстрый способ прочитать массив чисел из python
- Самый прямой способ назначить байты Serial.read() массиву?