为什么串口通讯每次只能接收8个字节?
扫描二维码
随时随地手机看文章
这两天在某嵌入式系统做了个串口通讯程序,遇到了每次只接收8个字节的问题。相信很多人都遇到了。
上网一查资料,找到串口配置结构体struct termios中的c_cc[VTIME] 和 c_cc[VMIN]参数。
c_cc[VTIME]
// 等待时间,单位百毫秒
c_cc[VMIN] // 最小字节数
VMIN自然就是最少接收的字节数了。那不足VMIN的话怎么办呢? VTIME就是经过这么多个百毫秒后,即使不足VMIN定义的最少字节数,也读出。
当VTIME=0,就是一直等待。当然,串口需要设置成阻塞模式。
好,试一下:
程序中 read(fd, buf, 40); // 伪代码
c_cc[VTIME]
= 1;
c_cc[VMIN] = 10;
用串口工具发送字符串“1234567890123456789”
结果分为两次接收
“1234567890123456”
“789”
不是8个字节了,变成了16个字节。
看来,最少接收字节数会被设定为大于VMIN参数的那个8的倍数。
为了测试接收延时,在程序中加入了毫秒级的时间打印信息,然后测试接收长字符串 “123456789012345678901234567890123456789”。
结果接收分成了3条。第一第二条之间的时间间隔约25毫秒,可能是我的其他代码占用了些时间。
第二第三条之间间隔100毫秒。因为第三条不足16个字节,所以等待到VTIME时间才会被读到。
另外测试得出:当VMIN大于read的第三个参数时,以read的第三个参数为准。
总结:
1、嵌入式系统的默认串口缓冲是8个字节,可被配成8的倍数。最大值未验证。
2、VTIME的单位是“百毫秒”,即最小等待100毫秒。对实时性要求较高的场合太长了。
3、为了保证数据接收完整性,串口通讯协议还是应该做的。