Я использую подобную Arduino библиотеку на модуле WiFi ESP8266. Код очень похож на Arduino.
Я собираю данные из UART и помещаю их в буфер. В настоящее время завершающий символ '\n'
, Другими словами, поток входящих данных из UART хранится в буфере command_buffer
и конец этих входящих данных идентифицируется '\n'
, Вот соответствующий код;
void onDataCallback(Stream& stream, char arrivedChar, unsigned short availableCharsCount)
{
if (arrivedChar == '\n') // Lets show data!
{
Serial.println("<New line received>");
while (stream.available())
{
char cur = stream.read();
charReceived++;
Serial.print(cur);
command_buffer[index] = cur;
buf_index++;
}
}
}
onDataCallback()
является функцией обратного вызова, которая вызывается при получении входящих данных от UART.
Это моя проблема. Что делать, если завершающий символ не является одним символом '\n'
? Что делать, если он состоит из нескольких двоичных символов, таких как <0xFF><0xFE><0xFA>
?
Подобные Arduino библиотеки происходят из среды SMING.
https://github.com/SmingHub/Sming
Поскольку вы получаете своих персонажей по одному, вам нужно запомнить состояние: демонстрация
#include <iostream>
#include <string>
namespace
{
const char uart_endl[] = "\xff\xfe\xfa";
const size_t uart_endl_len = sizeof(uart_endl) - 1;
}
class DataReceiver
{
const char* state;
std::string buffer;
public:
DataReceiver() : state(&uart_endl[0]) {}
void onDataCallback(char arrivedChar)
{
buffer.push_back(arrivedChar);
if (*state == arrivedChar)
{
state++;
if (*state == '\0')
{
state = &uart_endl[0];
buffer.erase(buffer.end() - uart_endl_len, buffer.end());
std::cout << buffer << std::endl;
buffer.clear();
}
}
else
{
state = &uart_endl[0];
}
}
};
int main()
{
DataReceiver buffer;
buffer.onDataCallback('a');
buffer.onDataCallback('b');
buffer.onDataCallback('\xff');
buffer.onDataCallback('\xfe');
buffer.onDataCallback('\xfa');
buffer.onDataCallback('c');
buffer.onDataCallback('\xff');
buffer.onDataCallback('d');
buffer.onDataCallback('\xff');
buffer.onDataCallback('\xfe');
buffer.onDataCallback('e');
buffer.onDataCallback('\xff');
buffer.onDataCallback('\xfe');
buffer.onDataCallback('\xfa');
return 0;
}
Выход:
ab
c�d��e
Я надеюсь, что это помогает.
Других решений пока нет …