加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Linux > 正文

linux – 在没有高CPU使用的情况下读取串行数据

发布时间:2020-12-13 18:56:45 所属栏目:Linux 来源:网络整理
导读:我想在Linux下用简单的C或C程序通过FTDI(串行)接口读取从Arduino发送的消息. Arduino发送一个两个字符的“标题”,一个命令字节,后跟几个字节的数据,具体取决于命令. 我的第一次尝试是使用open()和read()简单地轮询数据,但这样做会导致大约12%的CPU使用率.这

我想在Linux下用简单的C或C程序通过FTDI(串行)接口读取从Arduino发送的消息. Arduino发送一个两个字符的“标题”,一个命令字节,后跟几个字节的数据,具体取决于命令.

我的第一次尝试是使用open()和read()简单地轮询数据,但这样做会导致大约12%的CPU使用率.这似乎不是适当的做事方式.

其次我读了libevent on实现了一个事件循环,当文件描述符上存在数据时触发事件.我的cpu使用率几乎没有,但在调用另一个事件之前我无法读取整个消息.收到整个消息时,事件不会触发,但只要文件描述符上有任何/某些数据可用就会触发.更多地看着它显然不会像我想要的那样工作.这是我的事件代码:http://pastebin.com/b9W0jHjb

第三,我用libevent实现了一个缓冲事件.它似乎工作得更好但仍然分开了一些消息.我的活动代码是:http://pastebin.com/PQNriUCN

第四,我抛弃了libevent并尝试了Boost的ASIO课程.我跟随的例子是http://www.webalice.it/fede.tft/serial_port/serial_port.html.它似乎工作正常,但“事件循环”是“while(1){}”,导致CPU使用率再次上升.循环只检查错误状态,而串行读取发生在另一个线程的回调中.我在while循环中添加了一个usleep(1),它将我的CPU使用率提高到了2%即可,但对于这样的轻量级程序来说仍然很重要.

libevent甚至底层epoll的大多数例子都使用TCP套接字,它似乎与串行端口数据的行为完全不同.

所以我的主要问题是:什么是一个很好的轻量级方法从串口读取消息而不需要大量轮询? (在linux中,使用C或C)

最佳答案
OP可能早已解决了这个问题,但是为了任何通过谷歌来到这里的人:

#include 

确保串行端口以非阻塞模式打开,因为当没有字符等待时,poll()有时会返回.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读