我正在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(),但事实证明它与问题正交。更新了我的最新信息。
答案 0 :(得分:1)
解决方案是在串口上设置low_latency标志。
参见High delay in RS232 communication on a PXA270 和 http://osdir.com/ml/serial/2003-11/msg00020.html
答案 1 :(得分:0)
这不是select
正在做的事情,而是系统正在做的事情。您的线程最终耗尽其时间片,系统允许其他代码运行。如果你使用合理的超时,而不是试图立即返回,系统应该将你的过程视为交互式,延迟应该消失。
如果select
对0
超时的单个描述符有一点意义,我无法弄清楚它是什么。为什么不尝试操作,看看是否收到EWOULDBLOCK
错误?
为什么不使用合理的超时,以便系统允许其他进程在您无事可做时运行?