我现在移植一个单片机程序到Linux下,主要是操作一个串口模块进行操作,需要在发送AT命令数据后读取串口接收,并且也要一直监听串口去读取透传过来的数据。
在单片机中,是通过串口接收中断实现的,每一位数据都存放在一个buf中。只要每次发送AT后等待一段时间即可。
现在在Linux下,我本来是想每次串口发送结束后,去read串口。但是这样的话感觉要实现一个长时间的监听透传的数据不太好。或者有好的,但我不知道。。。
现在我是准备开一个线程,去模拟串口接收中断,我在想是写无限阻塞读取1位,还是每次读取的位数多一些比较好?
或者有没有更好的实现方式,大佬们提点一下;-)
离线
用阻塞+线程没有问题
离线
用阻塞+线程没有问题
OK 谢谢指导
离线
谢谢晕哥指导:-)
离线
楼主,移植好了吗?
离线
一个线程 非阻塞模式 select + write/read 就可以啦。
离线
前几天我正好也遇到这样一个需求,感觉每次read 1byte的系统调用overhead太大了,于是在StackOverflow上问了这个问题,得到了一个相当详尽的解答,结论是有办法控制阻塞模式下串口一次read的最小数据量。答者还指出使用select()或poll()+非阻塞模式是非常不可取的方法:
If your program uses non-blocking mode but does not perform useful work while waiting for data, and instead uses select() or poll() (or even worse calls sleep()), then your program is unnecessarily complex and ineffecient.
不想读大段的英文也没关系,我正准备写一篇文章来分享自己读完那个答案之后的心得
离线
他这个说的是有前提的,如果有多个串口,一个线程同时处理多个串口的读和写,不用poll你是怎么实现的。而且对于读+写的场景,阻塞的方式真的是最高效的么?
前几天我正好也遇到这样一个需求,感觉每次read 1byte的系统调用overhead太大了,于是在StackOverflow上问了这个问题,得到了一个相当详尽的解答,结论是有办法控制阻塞模式下串口一次read的最小数据量。答者还指出使用select()或poll()+非阻塞模式是非常不可取的方法:
If your program uses non-blocking mode but does not perform useful work while waiting for data, and instead uses select() or poll() (or even worse calls sleep()), then your program is unnecessarily complex and ineffecient.
不想读大段的英文也没关系,我正准备写一篇文章来分享自己读完那个答案之后的心得
离线