POSIX串行端口上的read()可能较慢的原因是什么



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

我发现对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;

edit:我之前一直在使用select(),但结果发现它与问题正交。更新了我的最新信息。

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

请参阅PXA270上RS232通信的高延迟和http://osdir.com/ml/serial/2003-11/msg00020.html

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

如果在0超时的单个描述符上有点select,我不知道它是什么。为什么不试试这个操作,看看是否会出现EWOULDBLOCK错误呢?

为什么不使用合理的超时,这样系统就可以在你无所事事的时候让其他进程运行呢?

最新更新