【发布时间】: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