本帖最后由 cjseng 于 2021-9-17 11:25 编辑
如图所示:主机与设备A为用户原配,主机与A通过DB9串口线通讯,一切正常。现需增加设备B,设备B有我方提供,主机只有一个RS232接口,A、B均通过串口与主机通讯,A与B不需要同时工作,为互斥关系,B的优先级大于A。无论是A或B工作时,有其他数据需要向主机发送时,随时发送,无数据发送时,每隔3秒发送一个心跳帧。主机收到数据后,会回复一个应答帧。
客户提供了通讯协议,我方按照客户提供的协议,设计制作了B,因为客户的主机与A早已定型,所以设计有B负责切换继电器:当B工作时,将串口线接至B,当B停止工作时,将串口线接至A。
现在的问题是:当A在对主机发送数据或心跳帧时,可能会因为继电器切换,发送的帧不完整,偶尔也会插入一个干扰码,比如多出一个00,切换后,有B继续对主机发送数据或心跳帧。但是,主机收到不完整的数据后,会断开连接,哪怕之后B继续发送完整的帧,主机也没反应了,有时等上几分钟,主机能恢复连接,有时几十分钟恢复,少数情况下,一直不恢复。当主机断开连接后,只要将主机复位重启,又能恢复连接了。反过来,有B切换到A时,也会发生同样的事,A与主机通讯不上。
跟客户反应,客户表示他们的产品早已定型,无法修改,要修改,只能我方修改,确保不会对主机发送非法的数据。
“断开连接”是客户的说法,此处为引用,我怀疑主机数据都收到了,只是解析出了问题。
附测试数据,发为A或B对主机发,收表示收到主机数据
Step 1:发送 “手控面板发送查询连接状态请求”帧,双方收发正常 [23:06:36.462]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:06:36.501]收←◆C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0242 00 10 41 96 C0 [23:06:39.473]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:06:39.504]收←◆C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0242 00 10 41 96 C0 [23:06:42.486]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:06:42.563]收←◆C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0242 00 10 41 96 C0 [23:06:45.494]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:06:45.523]收←◆C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0242 00 10 41 96 C0 [23:06:48.504]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:06:48.544]收←◆C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0242 00 10 41 96 C0 [23:06:50.205]收←◆C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0309 00 10 41 DC C0 Step 2:在“手控面板发送查询连接状态请求”帧前面加入几个字节乱码,主机不再有应答(红色部分为插入的多余字节,以模拟继电器切换时带来的不完整数据) [23:08:24.074]发→◇C0 20 78 7A 20 FF C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0 □ [23:08:27.081]发→◇C0 20 78 7A 20 FF C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0 □ [23:08:30.096]发→◇C0 20 78 7A 20 FF C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0 □ [23:08:33.102]发→◇C0 20 78 7A 20 FF C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0 □ [23:08:36.114]发→◇C0 20 78 7A 20 FF C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0 □ [23:08:39.123]发→◇C0 20 78 7A 20 FF C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0 □ Step 3:停顿1-2分钟,不发送任何数据 Step 4:重新发送标准“手控面板发送查询连接状态请求”帧等待主机应答,但主机一直不响应了。。。。。 [23:10:15.828]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:18.839]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:21.850]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:24.861]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:27.875]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:30.883]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:33.893]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:36.906]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:39.915]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □ [23:10:42.927]发→◇C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 0103 85 C0 □
|