10

我正在用 C++ 在 Ubuntu Linux 上编写一个应用程序来从串行端口读取数据。它通过我的代码调用成功运行select(),然后ioctl(fd,FIONREAD,&bytes_avail)在最终使用read().

我的问题是:每次select返回数据时,可用字节数报告为 8。我猜这是在某处设置的缓冲区大小,当该缓冲区已满时,select 会向用户返回通知。

作为开发人员,我是 Linux 的新手(但对 C++ 并不陌生),我曾尝试研究(但没有成功)是否可以更改此缓冲区的大小,或者我的假设是否正确。在我的应用程序中,时间很关键,只要读取缓冲区上有新字节,我就需要收到警报。在不深入研究内核代码的情况下,这可能吗?

4

2 回答 2

4

您想使用TIOCSSERIAL允许更改接收缓冲区深度和发送缓冲区深度(除其他外)的串行 IOCTL。最大值取决于您的硬件,但如果使用 16550A,则最大缓冲区深度为 14。

您可以在此处找到与您想要执行的操作类似的代码

原来的链接坏了:http ://www.groupsrv.com/linux/about57282.html 在我写另一个或找到更好的例子之前,新的将不得不做。

于 2012-05-30T13:42:56.443 回答
1

您可以尝试使用 termios 结构的 c_cc 成员的 VMIN 和 VTIME 值。这里有一些信息,尤其是在第 3.2 节中。

于 2012-07-03T09:04:36.987 回答