加速/修改tcdrain()函数

时间:2017-05-04 12:24:23

标签: c linux linux-kernel serial-port

我围绕着我们如何到达目前的漫长而乏味的故事,但情况如下:

我们正在使用半双工RS485串行通信和(必要时)驱动TX / RX标志"手动"通过GPIO引脚切换。为了完成这项工作,我们使用tcdrain()等待Tx缓冲区为空,然后再切换回Rx模式。

问题tcdrain()似乎在传输完最后一个字符后等待(阻止)了一段时间,这会给我们带来一些瓶颈。

我已经看到过默认tcdrain()代码只是将波特率乘以该时间段内串行缓冲区({1}} s的(最大)大小然后返回的建议.-我很容易相信。

所以,任何人都可以建议:

  • 可能通过缩短串行缓冲区来加快sleep()
  • 修改tcdrain()(或相关代码/参数)以实际等待硬件发送的最后一个字符,或者等待与缓冲区内容更密切相关的时间段

我已经使用了我们的(嵌入式)内核(2.6.x)代码,并且看不到单个头文件(termios.h)以外的任何引用。

编辑添加:根据this post,如果我们可以使用IOCTL将串行Tx缓冲区减少到1个字节,我假设tcdrain()调用会/可能在写入字符时阻塞,然后返回,这将允许我们避免依赖write()并在切换Tx / Rx引脚之前使用非常短的tcdrain()。我会在获得片刻时进行实验,同时欢迎任何建议/实例。

0 个答案:

没有答案