我正在用C ++编写Ubuntu Linux上的应用程序来从串口读取数据。它通过我的代码调用select()
然后ioctl(fd,FIONREAD,&bytes_avail)
成功运行,以找出在使用read()
最终获取数据之前可用的字节数。
我的问题是这样:每次select
返回数据时,可用的字节数报告为8.我猜这是一个缓冲区大小设置在某处并且选择返回通知给用户缓冲区已满。
作为开发人员,我不熟悉Linux(但不是C ++的新手),如果有可能改变这个缓冲区的大小,或者确实如果我的假设是真的,我试图研究(没有成功)。在我的应用程序中,时序至关重要,只要读缓冲区中有新字节,我就需要发出警报。这可能,而不深入研究内核代码吗?
答案 0 :(得分:4)
您希望使用串行IOCTL TIOCSSERIAL
,它允许更改接收缓冲区深度和发送缓冲区深度(以及其他内容)。最大值取决于您的硬件,但如果正在使用16550A,则最大缓冲区深度为14。
您可以找到与您想要执行的操作类似的代码here
原始链接变坏了:http://www.groupsrv.com/linux/about57282.html 新的一个必须做,直到我写另一个或找到一个更好的例子。
答案 1 :(得分:0)
您可以尝试使用termios结构的c_cc成员的VMIN和VTIME值。 一些信息here,尤其是3.2节。