Сбор данных из UART на основе нескольких завершающих символов

Я использую подобную 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

1

Решение

Поскольку вы получаете своих персонажей по одному, вам нужно запомнить состояние: демонстрация

#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

Я надеюсь, что это помогает.

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector