【问题标题】:Linux serial port reading - can I change size of input buffer?Linux 串口读取 - 我可以更改输入缓冲区的大小吗?
【发布时间】:2012-05-30 11:57:52
【问题描述】:

我正在用 C++ 在 Ubuntu Linux 上编写一个应用程序来从串行端口读取数据。通过我的代码调用select() 然后ioctl(fd,FIONREAD,&bytes_avail) 可以成功运行,以找出在最终使用read() 获取数据之前有多少字节可用。

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

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

【问题讨论】:

  • 我不明白?据我所知,在 select() 返回之前我什么都做不了,此时我从缓冲区读取数据。此时 8 个字节已经到达,我想在 1 个字节后收到通知。我错过了什么吗?

标签: c++ linux serial-port


【解决方案1】:

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

您可以找到与您想做的事情类似的代码here

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

【讨论】:

  • 这对我很有用,因为我不知道 TIOCSSERIAL 但不幸的是,serial_struct 中唯一似乎有用的项目是我已设置为 1 的 xmit_fifo_size 整数,但不幸的是仍然只在之后提醒我接收到 8 个字节。哦,好吧....
  • 向你道歉 JimR - 只要我禁用硬件控制设置 CRTSCTS,它就可以工作。 Linux dev 对我来说是一个新世界,而且很难走!!非常感谢您的帮助。
  • 我以前从未听说过TIOCSSERIAL。它是否适用于一般的 Linux 串行支持,还是仅适用于特定的驱动程序?它在各种 Linux 串行驱动程序中的实施范围有多广? TIOCSSERIAL 和其他 ioctls 文档的好位置在哪里?
  • @CraigMcQueen:自从串行端口连接的调制解调器(拨号 ISP、拨号信用卡/支票终端等)过时以来,我已经好几年没有使用它了,所以我的知识还达不到任务。 man ioctl 和 man ioctl_list 加上挖掘头文件并提出问题是我如何让事情工作的方式。有一个名为 minicom 的基于文本的通信终端,它有可用的源代码。我从中学到了一点。
  • 我认为链接坏了。
【解决方案2】:

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

【讨论】:

  • 我看不出这与被问到的问题有什么关系。我查看了第 3.2 节,但不清楚它如何帮助他。也许你可以解释更多你的想法。此外,复制您正在讨论的部分代码以防链接中断,这绝不是一个坏主意。
  • 参见this 页面上的第 9 节。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多