在POSIX串口上读取()的原因可能是什么?

时间:2012-01-27 18:18:31

标签: linux ubuntu embedded posix embedded-linux

我正在Ubuntu下编写一个使用串口的控制台应用程序。它需要以60 Hz的频率从串口读取和写入。

我发现read()的调用通常但并不总是很慢。我已经设置了O_NDELAY,所以它经常会立即返回(很棒)。有时完成需要50毫秒,这对我的应用来说太慢了。在调用read()之前,我检查可用的字符数,因此它不应该等待数据。

read()做什么需要这么长时间?我怎样才能加快速度?

端口上的选项是:

options.c_cflag |= (CLOCAL | CREAD);
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
options.c_cflag &= ~CSIZE;
options.c_cflag |= CS8;

options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);
options.c_iflag &= ~IXON;

options.c_oflag = 0;

编辑:我之前一直在使用select(),但事实证明它与问题正交。更新了我的最新信息。

2 个答案:

答案 0 :(得分:1)

解决方案是在串口上设置low_latency标志。

参见High delay in RS232 communication on a PXA270http://osdir.com/ml/serial/2003-11/msg00020.html

答案 1 :(得分:0)

这不是select正在做的事情,而是系统正在做的事情。您的线程最终耗尽其时间片,系统允许其他代码运行。如果你使用合理的超时,而不是试图立即返回,系统应该将你的过程视为交互式,延迟应该消失。

如果select0超时的单个描述符有一点意义,我无法弄清楚它是什么。为什么不尝试操作,看看是否收到EWOULDBLOCK错误?

为什么不使用合理的超时,以便系统允许其他进程在您无事可做时运行?