C++ 基于多个终止字符从UART收集数据

C++ 基于多个终止字符从UART收集数据,c++,arduino,serial-port,uart,esp8266,C++,Arduino,Serial Port,Uart,Esp8266,我正在使用WiFi模块ESP8266上类似Arduino的库。代码看起来很像Arduino 我正在从UART收集数据并将它们放入缓冲区。当前,终止字符是'\n'。换句话说,来自UART的传入数据流存储在缓冲区命令\u buffer中,该传入数据的结尾由'\n'标识。这是相关代码 void onDataCallback(Stream& stream, char arrivedChar, unsigned short availableCharsCount) { if (arrive

我正在使用WiFi模块ESP8266上类似Arduino的库。代码看起来很像Arduino

我正在从UART收集数据并将它们放入缓冲区。当前,终止字符是
'\n'
。换句话说,来自UART的传入数据流存储在缓冲区
命令\u 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++;
        }
    }
}
void onDataCallback(流&流、字符arrivedChar、无符号短可用字符计数)
{
if(arrivedChar=='\n')//让我们显示数据!
{
Serial.println(“”);
while(stream.available())
{
char cur=stream.read();
charl++;
串行打印(cur);
命令缓冲区[索引]=cur;
buf_索引++;
}
}
}
onDataCallback()
是一个回调函数,当从UART接收到传入数据时调用该函数

这是我的问题。如果终止字符不是单个字符,该怎么办?如果它是由多个二进制字符组成的,比如

类似Arduino的库来自SMING框架。

由于一次只能获得一个字符,因此必须记住一个状态:


希望有帮助。

谢谢。向上投票。看起来不错。我在寻找一个更适合Arduino的答案。我不确定字符串函数
push_back
erase
clear
是否有等效函数。不管怎样,你的回答给了我一个很好的开端。谢谢!如果
std::string
没有完全实现,您仍然可以使用老式的字符缓冲区。祝你好运
#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