读取到UART流 - 数据块



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

我知道我连接到的系统以20ms的间隔在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;
        }

我首先将民意调查率提高到8ms。由于我知道我可以收到的最长命令是10个字节长,因此我阅读直到校验和有效,或者内容读取的内容为10个字节长,并且在民意调查之间又有2毫秒。目前,这表现很好。

相关内容

  • 没有找到相关文章

最新更新