【问题标题】:Is there any way to control uart rx fifo size in linux programmaticaly有没有办法以编程方式控制linux中的uart rx fifo大小
【发布时间】:2019-06-14 03:00:03
【问题描述】:

我正在编写软件来与设计不佳的硬件进行通信。此硬件可以通过 RS485 线(9600 8N1)与 linux pc(内核 4.15)通信,并且时间很短:pc 应在收到设备请求后 2ms 内回复。

我能够使用 LOW_LATENCY 标志和 /sys/class/tty/ttySx/rx_trig_bytes 文件解决此任务。

打开端口后“rx_trig_bytes”文件内容变为“14”,所以我需要在打开端口后写入“1”以获得良好的回复延迟。

有什么方法可以通过 API 调用或在系统启动/驱动程序加载后修复它?当前的实现看起来很丑:(

【问题讨论】:

  • 当您在代码中将“1”写入文件 /sys/class/tty/ttySx/rx_trig_bytes 时会发生什么?
  • 写入“1”后,接收和发送之间的延迟变为亚毫秒。 “1”表示当一个或多个字节在 uart rx fifo 时产生中断。所以“14” - 当从 uart 接收到 14 个或更多字节并放置到 fifo 时产生中断。
  • 那么你是问如何将 1 写入文件?
  • 没有。看。我使用 open("/dev/ttyS2") 然后 ioctl(fd, TIOCGSERIAL...) 然后 tcgetattr()/cfsetospeed()/cfsetispeed()/tcsetattr()/tcflush 然后我在 /sys/ 打开文件并写入“1”在那里。这很难看,所以我想知道有什么方法可以使用 API 控制 rxfifo 吗?或者可能这个“1”可以在系统启动期间设置为端口的默认值?
  • API /sys 中的文件。

标签: c linux uart low-latency rs485


【解决方案1】:

有趣的是,你觉得这种方式很难看,考虑到 Unix 中的一切都是一个文件,它应该是聪明的方式。

我猜你有权拥有自己的审美意识。

如果您想将另一个缓冲区大小设为默认值,您可以随时在驱动程序中更改它并按照建议 here 重新编译内核。

【讨论】:

  • 好吧。我正在使用单个文件 /dev/ttyS2,它的所有参数都是使用它的 fd 和 ioctl/tcsetattr/etc 设置的。现在我需要打开另一个文件来设置这个文件。我认为这不正常:(但看起来这是最好的方法。感谢您的回答。
  • 不客气。我认为重新编译的优点是您不需要更改用户空间的任何内容,而编写文件需要 root。如果这是一台机器上的一次性事情,我想重新编译是值得的......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-04-30
  • 2010-09-09
  • 1970-01-01
  • 1970-01-01
  • 2017-01-09
  • 1970-01-01
  • 2018-10-25
相关资源
最近更新 更多