Chinaunix首页 | 论坛 | 博客
  • 博客访问: 5014935
  • 博文数量: 1198
  • 博客积分: 12961
  • 博客等级: 上将
  • 技术积分: 14416
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 11:25
  • 认证徽章:
个人简介

偷得浮生半桶水(半日闲), 好记性不如抄下来(烂笔头). 信息爆炸的时代, 学习是一项持续的工作.

文章分类

全部博文(1198)

文章存档

2019年(175)

2018年(81)

2017年(80)

2016年(70)

2015年(52)

2014年(41)

2013年(51)

2012年(85)

2011年(45)

2010年(231)

2009年(287)

分类: LINUX

2011-07-12 12:02:57

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

串口为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 是不能作为控制终端使用的。这样就不会造成一个串口两个客户端操作的问题了。

阅读(1402) | 评论(0) | 转发(1) |
给主人留下些什么吧!~~
评论热议
请登录后评论。

登录 注册