Chinaunix首页 | 论坛 | 博客
  • 博客访问: 434062
  • 博文数量: 247
  • 博客积分: 185
  • 博客等级: 入伍新兵
  • 技术积分: 1005
  • 用 户 组: 普通用户
  • 注册时间: 2012-09-10 10:39
文章分类

全部博文(247)

文章存档

2015年(3)

2014年(21)

2013年(53)

2012年(170)

分类:

2012-09-18 00:06:19

原文地址:串口问题 作者:iibull

近期有做一个项目,其中用到了串口操作,期间我遇到了一个问题。

串口为block mode。

在pthread 中使用 select,然后read的方式取到的数据第一个字节会丢掉。

在pthread 中直接用阻塞读, 不会丢。

而这个程序在pc上运行就OK, 在arm上运行就不行。

后面发现问题。 

pc 上跑的时候是前台程序, 程序有一个默认的控制终端。
arm上跑的时候是后台程序,没有一个控制终端和程序对应, 当open串口的时候,系统默认把此串口作为控制终端,这样便造成系统对此控制终端对应的串口进行读操作,程序也同时对此串口进行读操作的现象。 

当在pthread 中直接用阻塞读时,因为阻塞读一直监控串口的接受缓冲区,并且其优先级比控制终端的优先级别高,故不会丢失数据。 而在pthread 中使用 select的方式则不同。 select是检测缓冲区字节数量并不是直接取出。 串口有数据来临时,系统唤醒select系统调用,等我们的程序从select被唤醒 到 使用read操作获取数据的过程中,系统已经从控制终端上把用于唤醒的那个或多个字符已经取走了,等我们的程序 read时只能取到后面的数据了。

解决办法: open(串口, O_RDWR | O_NOCTTY | ...);
打开串口的时候通知系统,此 tty 是不能作为控制终端使用的。这样就不会造成一个串口两个客户端操作的问题了。

阅读(350) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~