Pet*_*vac 10 linux proc serial-port
我有一个通过串行线和两个以太网 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
Run Code Online (Sandbox Code Playgroud)
当断开连接时:
# 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
Run Code Online (Sandbox Code Playgroud)
我没有足够的信心来决定线路末尾列出的信号是否具有连接/断开电缆的真正含义,因为我没有找到任何关于 /proc/tty/driver/serial 内容的文档。我只能假设信号的存在意味着给定的信号是“现在”(或最近?或?)。所述串行HOWTO说,当电缆被连接(CTS流量控制信号,DSR“我准备好进行通信”,CD“调制解调器连接到另一个”)附加信号呈现都在“输入”的方向。因此,另一端必须有人活着。
假设信号的含义如 Serial HOWTO 中所述,我可以根据是否存在 CD 信号做出决定。不过我不太确定。
所以问题是:我的方法是“正确的”,还是我不知道有更好的选择?
编辑: 我做了一些额外的观察,并与我的同事进行了交谈。结果表明,线路末端是否存在信号是两端串行端口活动的良好指标。但是,它不是电缆物理存在的指标。每当有程序写入串行端口输出信号时,就会出现 (RTS|DTR)。当另一端写入输入信号时,出现 (CTS|DSR|CD)。当双方都没有通信时,根本没有信号(这并不一定意味着没有电缆存在)。不要忘记确切的信号取决于电缆的接线(我有“带部分握手的空调制解调器”)。
RS232 没有任何类型的“电缆存在”指示器。你只是通过传输或元数据(控制)信号,或者你没有 - 这就是你所知道的。如果您收到输入信号 (CTS|DSR|CD),您就知道电缆已连接。如果您没有收到任何传入信号,则电缆的状态是不确定的,如果没有额外的硬件解决方案,则无法确定它是否已插入 - 或与远程设备进行某种交换。
通常的方法是执行某种“保持活动”传输(甚至只是元数据 - 例如暂时设置 DTR 并期望 CTS)但是如果电缆两端的软件使用的协议规则禁止这种空闲交换,你几乎坚持使用烙铁继续。
您可能会尝试使用某种额外的“恶魔”来设置管道,在您的软件和物理设备(两端)之间转发数据,对其进行封装 - 如果管道空闲,则执行“连接检查”。
让我补充一个相当常见的解决方案:如果您的端点设备不使用硬件控制,您可以在主机端的插头内使用 CTS 缩短 DTR,并在主机端使用“硬件控制”。生成 DTR 会自动驱动 CTS,启用传输,如果存在电缆,则传输不受影响。同时,如果没有电缆,系统将以适合此事件的方式对缺少 CTS 做出反应,例如产生超时或暂停传输,直到插入电缆。