Chinaunix首页 | 论坛 | 博客
  • 博客访问: 191391
  • 博文数量: 38
  • 博客积分: 2010
  • 博客等级: 大尉
  • 技术积分: 424
  • 用 户 组: 普通用户
  • 注册时间: 2009-06-19 12:41
文章分类

全部博文(38)

文章存档

2017年(2)

2016年(1)

2010年(8)

2009年(27)

我的朋友

分类: LINUX

2009-10-27 20:12:51

最近搞串口下载在板子上实现应用功能,近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) |
给主人留下些什么吧!~~