gpt4 book ai didi

c++ - 根据多个终止字符从 UART 收集数据

转载 作者:行者123 更新时间:2023-11-30 05:33:54 25 4
gpt4 key购买 nike

我在 WiFi 模块 ESP8266 上使用类似 Arduino 的库。代码看起来非常像 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

最佳答案

由于您一次获得一个角色,因此您必须记住一个状态: Demo

#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

希望对你有帮助。

关于c++ - 根据多个终止字符从 UART 收集数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34526720/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com