![在不打开设备的情况下如何知道串行端口是否确实在传输数据?](https://linux22.com/image/51614/%E5%9C%A8%E4%B8%8D%E6%89%93%E5%BC%80%E8%AE%BE%E5%A4%87%E7%9A%84%E6%83%85%E5%86%B5%E4%B8%8B%E5%A6%82%E4%BD%95%E7%9F%A5%E9%81%93%E4%B8%B2%E8%A1%8C%E7%AB%AF%E5%8F%A3%E6%98%AF%E5%90%A6%E7%A1%AE%E5%AE%9E%E5%9C%A8%E4%BC%A0%E8%BE%93%E6%95%B0%E6%8D%AE%EF%BC%9F.png)
我有一个通过串行线和两个以太网网卡连接的高可用性集群(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 内容的任何文档。我只能假设信号的存在意味着给定信号“现在”处于开启状态(或者是在最近的过去?或者?)。这系列指南表示连接电缆时出现的附加信号(CTS 流量控制信号、DSR“我已准备好通信”、CD“调制解调器已连接到另一个信号”)均位于“输入”方向。所以另一端一定有人还活着。
假设信号的含义与串行 HOWTO 中所述一致,我可以根据是否存在 CD 信号来做出决定。但是我不太确定。
所以问题是:我的方法“正确”吗?还是我有其他我不知道的更好的选择?
编辑: 我做了一些额外的观察,并与我的同事进行了交谈。事实证明,线路末端是否存在信号可以很好地指示两端的串行端口活动。然而,它并不表明电缆的物理存在。每当有程序写入串行端口时,就会出现传出信号 (RTS|DTR)。当另一侧写入时,存在传入信号 (CTS|DSR|CD)。当双方都没有通信时,根本没有信号(这并不一定意味着不存在电缆)。不要忘记,确切的信号取决于电缆的接线(我有“带有部分握手的空调制解调器”)。
答案1
RS232 没有任何类型的“电缆存在”指示器。您只是获得传输或元数据(控制)信号,或者您没有 - 这就是您所知道的。如果您收到传入信号 (CTS|DSR|CD),您就知道电缆已连接。如果您没有收到任何传入信号,则电缆的状态是不确定的,并且如果没有额外的硬件解决方案或与远程设备执行某种交换,则无法确定它是否已插入。
通常的方法是执行某种“保持活动”传输(甚至只是元数据 - 例如暂时设置 DTR 并期望 CTS),但如果电缆两端的软件使用的协议规则禁止这种空闲交换,则您将我们几乎一直坚持使用烙铁来继续。
您可能会尝试的是某种额外的“恶魔”,它设置一个管道,在您的软件和物理设备(两端)之间转发数据,封装它 - 并在管道空闲时执行“连接检查”。
让我添加一个相当常见的解决方案:如果您的端点设备不使用硬件控制,您可以将主机端插头内的 CTS 与 DTR 短接,并在主机端使用“硬件控制”。生成DTR会自动驱动CTS,从而启用传输,如果有电缆,则传输不受影响。同时,如果没有电缆,系统将以适合该事件的方式对缺少 CTS 做出反应,例如生成超时或暂停传输,直到插入电缆。
答案2
有一个存在指示器告诉您有一个设备连接到另一端,但它是可选的,无论有没有存在信号,传输都可以进行。