近期有做一个项目,其中用到了串口操作,期间我遇到了一个问题。
串口为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) |