如何在Linux上进行硬件DTR/DSR流控制(串口编程)?

如何在Linux上进行硬件DTR/DSR流控制(串口编程)?

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

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

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

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

答案1

回答我自己的问题,感谢@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

相关内容