gpt4 book ai didi

linux - 无需高 CPU 使用率即可读取串行数据

转载 作者:IT王子 更新时间:2023-10-29 01:06:24 25 4
gpt4 key购买 nike

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

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

其次,我阅读了有关 libevent 的内容,了解实现了一个事件循环,该事件循环在文件描述符上存在数据时触发一个事件。我的 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 可能早就解决了这个问题,但为了所有通过 google 来到这里的人:

#include <sys/poll.h>

struct pollfd fds[1];
fds[0].fd = serial_fd;
fds[0].events = POLLIN ;
int pollrc = poll( fds, 1, 1000);
if (pollrc < 0)
{
perror("poll");
}
else if( pollrc > 0)
{
if( fds[0].revents & POLLIN )
{
char buff[1024];
ssize_t rc = read(serial_fd, buff, sizeof(buff) );
if (rc > 0)
{
/* You've got rc characters. do something with buff */
}
}
}

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

关于linux - 无需高 CPU 使用率即可读取串行数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7035526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com