我正在通过在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毫秒。目前,这表现很好。