我如何知道串行端口实际上是否在不打开设备的情况下传输数据?


10

我有一个通过串行线和两个以太网NIC连接的高可用性群集(Heartbeat)。我想设置一个能够识别断开的串行线的监视脚本(基本上,在SO上回答了相同的问题,但是我对这样的一般回答不满意)。

我不能简单地打开串行设备并自己读取数据,因为串行线是由Heartbeat打开的。

因此,我开始寻找一些间接的线索。到目前为止,我发现的唯一区别是的内容/proc/tty/driver/serial。连接后的样子如下:

# cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:2722759 rx:2718165 brk:1 RTS|CTS|DTR|DSR|CD

当断开连接时:

# cat /proc/tty/driver/serial
serinfo:1.0 driver revision:
0: uart:16550A port:000003F8 irq:4 tx:2725233 rx:2720703 brk:1 RTS|DTR

我没有足够的信心去确定行尾列出的信号具有已连接/已断开电缆的含义,因为我没有找到有关/ proc / tty / driver / serial内容的任何文档。我只能假设信号的存在意味着给定的信号是“现在”(或者是最近的过去?或?)。所述串行HOWTO说,当电缆被连接(CTS流量控制信号,DSR“我准备好进行通信”,CD“调制解调器连接到另一个”)附加信号呈现都在“输入”的方向。因此,另一端必须有人在世。

假设信号的含义如串行HOWTO中所述,我可以根据CD信号的存在来做出决定。但是我不确定。

因此,问题是:我的方法是“正确的”,还是我有不知道的更好的选择?

编辑: 我做了一些其他的观察,并与我的同事进行了交谈。事实证明,在线路的末端是否存在信号,可以很好地指示两端的串行端口活动。但是,这并不表示电缆的物理存在。每当有程序写入串行端口时,就会出现输出信号(RTS | DTR)。当另一侧正在写入时,会出现输入信号(CTS | DSR | CD)。当双方都没有通信时,根本就没有信号(这不一定意味着没有电缆)。不要忘记确切的信号取决于电缆布线(我有“带有部分握手功能的空调制解调器”)。


听起来像是一个原因,并且易于测试。您可能还会在'/ sys / devices / platform / serial8250 / tty / ttyS0 /'下查看,或者在系统上也看到类似内容。
rickhg12hs

Answers:


5

RS232没有任何类型的“电缆存在”指示器。您只是通过传输或获取元数据(控制)信号,或者您没有,这就是您所知道的。如果收到输入信号(CTS | DSR | CD),则表明电缆已连接。如果您没有收到任何输入信号,则电缆的状态不确定,如果没有其他硬件解决方案-或与远程设备进行某种交换,就无法确定电缆是否已插入。

通常的方法是执行某种“保持活动”传输(甚至只是元数据-例如,暂时设置DTR并期望CTS),但是如果电缆两端的软件使用的协议纪律禁止这种空闲交换,则使用电烙铁继续进行的过程非常困难。

您可能会尝试使用某种附加的“守护程序”来建立管道,在软件和物理设备(两端)之间转发数据,对其进行封装-如果管道空闲则执行“连接检查”。

让我添加一个比较常见的解决方案:如果端点设备不使用硬件控制,则可以在主机侧插头内的CTS上使DTR短路,并在主机侧使用“硬件控制”。生成DTR自动驱动CTS,启用传输(如果存在电缆),因此传输不受影响。同时,在没有电缆的情况下,系统将以适合此事件的方式对缺少CTS做出反应,例如,产生超时或暂停传输,直到电缆插入为止。


“守护程序”是一个聪明的主意。但是,我不打算实现它,因为恐怕它将成为稳定性错误的来源。我将坚持从/ proc读取信号,并仅指示是否存在传入/传出的信号。对我而言足够了。
彼得·科瓦奇


0

有一个状态指示符,告诉您您有另一端连接了设备,但这是可选的,无论有无状态信号,传输均有效。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.