Очистка строкового буфера с помощью memset после последовательного чтения
Используя библиотеки SerialTransfer.h / pySerialTransfer для отправки команд между моим ноутбуком и Arduino Mega, я посылаю несколько последовательных строк между устройствами. Однако у меня возникли проблемы с "очисткой" приемного буфера на стороне Arduino - он никогда не сжимается, несмотря на несколько различных попыток очистить строку (memset; цикл for).
Я посылаю строку в Arduino формата , где есть где-то от 1 до 5 звездочек. Затем Arduino просто отправляет точно такую же строку обратно, без какой-либо обработки (пока что). И в терминале python я распечатываю все это; вот что я получаю:
SENT (17 bytes): <rand_len_str=**>
RECD (17 bytes): <rand_len_str=**>
SENT (18 bytes): <rand_len_str=***>
RECD (18 bytes): <rand_len_str=***>
SENT (19 bytes): <rand_len_str=****>
RECD (19 bytes): <rand_len_str=****>
SENT (17 bytes): <rand_len_str=**>
RECD (19 bytes): <rand_len_str=**>*>
SENT (18 bytes): <rand_len_str=***>
RECD (19 bytes): <rand_len_str=***>>
SENT (18 bytes): <rand_len_str=***>
RECD (19 bytes): <rand_len_str=***>>
Пока строка растет, все хорошо - но посмотрите на ошибку в 4-й паре, с лишними символами *> и т. Д.
Ниже приведен мой код Arduino; Я пытался сбросить принимающую строку с помощью memset, но это, похоже, не работает.
#include "SerialTransfer.h"
SerialTransfer myTransfer;
const int CMD_LEN = 200;
char buff[CMD_LEN];
char received_str[CMD_LEN];
void setup()
{
Serial.begin(115200);
myTransfer.begin(Serial);
}
void loop()
{
if(myTransfer.available())
{
//////////////////////////////////////////////
// вызов из Python
memset(received_str, '\0', CMD_LEN*sizeof(char));
myTransfer.rxObj(received_str, CMD_LEN);
sprintf(buff, "%s", received_str);
//////////////////////////////////////////////
//////////////////////////////////////////////
// отправить ответ
myTransfer.txObj(buff, strlen(buff));
myTransfer.sendData(strlen(buff));
//////////////////////////////////////////////
}
else if(myTransfer.status < 0)
{
Serial.print("ОШИБКА: ");
if(myTransfer.status == -1)
Serial.println(F("CRC_ERROR"));
else if(myTransfer.status == -2)
Serial.println(F("PAYLOAD_ERROR"));
else if(myTransfer.status == -3)
Serial.println(F("STOP_BYTE_ERROR"));
}
}
Я ничего не видел в SerialTransfer.h об очистке rxObj; Я всегда могу просто использовать первый завершающий символ > для разбора команды - но я думаю, что есть более чистое / лучшее решение для очистки буфера, или, по крайней мере, я хотел бы понять, что происходит! Заранее спасибо.
@David W, 👍1
Обсуждение2 ответа
Лучший ответ:
Вместо очистки буферов воспользуйтесь свойством bytesRead. Посмотрите, как они печатают полученную строку в примере кода из библиотеки, используя цикл for. Я не знаю, что это нулевое завершение или что-то в этом роде.
Пример со страницы библиотеки на github:
#include "SerialTransfer.h"
SerialTransfer myTransfer;
void setup()
{
Serial.begin(115200);
Serial1.begin(115200);
myTransfer.begin(Serial1);
}
void loop()
{
if(myTransfer.available())
{
Serial.println("New Data");
for(byte i = 0; i < myTransfer.bytesRead; i++)
Serial.write(myTransfer.rxBuff[i]);
Serial.println();
}
else if(myTransfer.status < 0)
{
Serial.print("ERROR: ");
if(myTransfer.status == -1)
Serial.println(F("CRC_ERROR"));
else if(myTransfer.status == -2)
Serial.println(F("PAYLOAD_ERROR"));
else if(myTransfer.status == -3)
Serial.println(F("STOP_BYTE_ERROR"));
}
Спасибо за указатель - это сделало свое дело. Применяя его к моему исходному коду, если я обновлю несколько строк вокруг вызова дескриптора с Python
до следующего, он будет работать так, как задумано.
//////////////////////////////////////////////
// handle call from Python
myTransfer.rxObj(received_str, CMD_LEN);
strncpy(buff, received_str, myTransfer.bytesRead);
buff[myTransfer.bytesRead] = '\0';
//////////////////////////////////////////////
Еще раз спасибо!
- Проблема с очисткой строки, считанной из последовательного буфера
- Очистка последовательных данных для новых входящих значений
- Как разделить входящую строку?
- Как вывести несколько переменных в строке?
- форматирование строк в Arduino для вывода
- Очень простая операция Arduino Uno Serial.readString()
- Arduino Преобразование std:string в String
- Как прочитать входящие ШЕСТНАДЦАТИРИЧНОЕ значение из serial метод read ()?
что значит "\0" в этой строке? memset(received_str, '\0', CMD_LEN*размер(символ));, @Natan Jimenez