Очистка строкового буфера с помощью 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; Я всегда могу просто использовать первый завершающий символ > для разбора команды - но я думаю, что есть более чистое / лучшее решение для очистки буфера, или, по крайней мере, я хотел бы понять, что происходит! Заранее спасибо.

, 👍1

Обсуждение

что значит "\0" в этой строке? memset(received_str, '\0', CMD_LEN*размер(символ));, @Natan Jimenez


2 ответа


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

0

Вместо очистки буферов воспользуйтесь свойством 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"));
  }
,

1

Спасибо за указатель - это сделало свое дело. Применяя его к моему исходному коду, если я обновлю несколько строк вокруг вызова дескриптора с Python до следующего, он будет работать так, как задумано.

    //////////////////////////////////////////////
    // handle call from Python

    myTransfer.rxObj(received_str, CMD_LEN);
    strncpy(buff, received_str, myTransfer.bytesRead);
    buff[myTransfer.bytesRead] = '\0';

    //////////////////////////////////////////////

Еще раз спасибо!

,