gpt4 book ai didi

c++ - 读取 UART 流 - 数据分块

转载 作者:太空宇宙 更新时间:2023-11-04 12:34:09 25 4
gpt4 key购买 nike

我正在通过半双工 RS-485 协议(protocol)以 9600bps 读取连接到 UART 串​​行端口的流,数据:8 位,停止 1 位与嵌入式设备无奇偶校验。

我知道我所连接的系统以 20 毫秒的间隔发送 2 字节到 10 字节长的二进制命令。

我使用以下标志访问流:

 uart0_filestream = open(COM_UART_DEV, O_RDWR | O_NOCTTY | O_NDELAY);

但是,10 字节长的命令经常会被分成两半,从而导致我的应用程序出现校验和错误。我需要每 20 毫秒轮询一次,为此我找到的唯一解决方案是增加轮询之间的 sleep 时间,这是我不想要的。

在读取流缓冲区的内容之前,是否有标志或智能方法可用于确保传输已完成?

最佳答案

好的,我找到了适合我需求的解决方案。由于我不确定何时读取流的内容,所有数据都在那里,而且我不想增加轮询间隔,正如@sawdust 建议的那样,我增加了轮询率:

    unsigned char *pStartBuffer = pRxBuffer;

if(uart0_filestream != -1)
{
int rx_length = 0, rx = 0, elapsed = 0;
bool bCommand = false;
while(rx_length <= 10)//&& elapsed <= 10)
{
rx = read(uart0_filestream, (void*)pRxBuffer, length);
if(rx > 0)
{
rx_length += rx;
pRxBuffer += rx;
if(checksum(pStartBuffer, rx_length) == true)
{
bCommand = true;
break;
}
}
nanosleep(&sleep_rx, NULL);
//elapsed+=2;
}

一开始我将轮询速率提高到 8 毫秒。因为我知道我可以接收的最长命令是 10 个字节长,所以我读取直到校验和有效或者读取的内容是 10 个字节长并且在轮询之间额外休眠 2 毫秒。目前这表现非常好。

关于c++ - 读取 UART 流 - 数据分块,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42448226/

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