2012-01-27 31 views
1

我在使用串口的Ubuntu下编写控制台应用程序。它需要以60 Hz的频率读取和写入串行端口。POSIX串行端口上的read()可能会很慢的原因是什么?

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

什么是串口的波特率?也许内核需要读取至少一个完整的字节...... – 2012-01-27 18:29:44

+0

它可能只是您的特定硬件要求(例如,硬件规格这样说)或在OS上施加(例如,不良USB设备)以获得其状态。 – 2012-01-27 18:38:22

+0

@Basile:115200 – amo 2012-01-27 18:42:26

回答

0

这不是select正在做什么,这是系统正在做的事情。您的线程最终会耗尽其时间片,并且系统允许其他代码运行。如果您使用明智的超时,而不是立即返回,系统应该将您的过程视为互动,并且延迟应该消失。

如果有一个指向select ing的单一描述符与0超时,我无法弄清楚它是什么。为什么不尝试操作,看看你是否得到了EWOULDBLOCK错误?

为什么不使用一个合理的超时时间,以便系统在其他任何进程运行时都可以运行?

+0

我删除了select(),因为你是正确的,所以没有必要。你看不到的是我在代码中的其他地方有一个处理器。我正在使用usleep(),但我正在研究高分辨率计时器是否更好。我无法阻止阅读,因为无论有没有东西需要阅读,我都有广播。 – amo 2012-01-27 19:20:16

+0

因此,找出多久,直到你的下一个广播和块在'选择'那么长。这比'usleep'要好得多。 – 2012-01-27 19:28:45

+0

read()调用只要我的睡眠时间长达3倍。 – amo 2012-01-27 22:01:52

相关问题