Linux上如何做硬件DTR/DSR流控(串口编程)?

nlu*_*cas 5 linux serial-port c

可以使用带有 RTS/CTS 引脚(tcsetattr 的 CRTSCTS 标志)的硬件流控制来设置串行端口通信,但无法以可靠和有效的方式使用 DTR/DSR 引脚进行流控制。

可以使用 TIOCMGET ioctl() 来检查引脚状态,但是我们需要一次发送一个字节,这使得它非常慢!

没有更好的办法吗?制作我们自己的电缆无法扩展,市场上有许多仅使用 DTR/DSR 流量控制的 POS 串行打印机。

PS-忘记 XON/XOFF,我需要可靠的 8 位通信。

nlu*_*cas 3

回答我自己的问题,感谢 @ktf 的提示,我发现至少从 2.6.28 [1] 开始,有 IOCTL(TCGETX、TCSETX、TCSETXF 和 TCSETXW)来设置扩展属性。

它们似乎已于 2008 年 10 月 13 日添加到上游内核 [2]。

这些额外的 IOCTL(与 SYS5 兼容)允许单独配置每个额外的引脚处理。

请参阅原始 RHEL 补丁 [3] 的链接,并查看随附的测试用例以获取如何使用它的示例。

IOCTL 定义位于“asm-generic/ioctls.h”文件中,结构和标志常量在“linux/termios.h”中定义(当然在“/usr/include”中)。

更新

进一步的研究表明,对该 IOCTL 的通用串行支持并未合并到上游内核源中。RHEL 5.3 有它,但上游 3.0.6 内核没有。
这意味着对于任何其他未移植 RHEL 补丁的内核,ioctl() 调用都会失败 [4]。

[1] http://lxr.free-electrons.com/ident?v=2.6.28;i=TCGETX
[2] https://lkml.org/lkml/2008/10/13/120
[3] https ://bugzilla.redhat.com/show_bug.cgi?id=445211
[4] https://bugzilla.redhat.com/attachment.cgi?id=315300&action=diff