我围绕着我们如何到达目前的漫长而乏味的故事,但情况如下:
我们正在使用半双工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()
。我会在获得片刻时进行实验,同时欢迎任何建议/实例。