读取 UART 流 - 数据分块

Reading to UART stream - Data chunked

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

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

我使用以下标志访问流:

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

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

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

好的,我找到了适合我需要的解决方案。因为我不能确定我什么时候读取流的内容,所有数据都会在那里,而且我不想增加我的轮询间隔,正如@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 毫秒。这目前表现非常好。