最近搞串口下载在板子上实现应用功能,近1个月没有更新部落格。
这个月除了业务流程上的东西外,涉及最多的就是串口通讯编程。串口通讯的基本框架、标准、非标准、非同步方式等内容在网上有很多资料可以查到。这里我只说一下非标准的read超时设定和软件流控的问题。
1. 非标准read超时设定:
由于系统带的定时器使用起来会导致编程很麻烦,所以用read超时来替代。要使read超时一定要将c_lflag设置为0,否则即使设置了VTIME也没有任何反映的:
options.c_lflag = 0;
options.c_cc[VTIME] = 10; /* set default timeout 0.1 seconds */
options.c_cc[VMIN] = 0; /* Update the options and do it NOW */
注意:VTIME是设置超时时间,如上,值为10,意思是10*0.1秒超时,也就是1秒超时。
VMIN是等待多少个字符read才返回。(一般不用,我做了实验,是可行的)。
2. 我在传输elf文件的时候,发现接收到的文件数据有丢失的情况,比较收发的数据发现接收端将0x11,0x13这2个软件流控字符丢弃了,所以如果应用中要传输文件数据的话,不能使用软件流控:
options.c_iflag &= ~(IXON|IXOFF); /* not to set software control */
3. 另外我们可能还会对接收缓冲区进行清空处理,以免出现异常情况。当读完想要的数据后,最好做一次flush:
tcflush(fd, TCIFLUSH);
阅读(2197) | 评论(0) | 转发(0) |