打印
[技术讨论]

与用户设备串口通讯产生问题

[复制链接]
19787|33
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
cjseng|  楼主 | 2021-9-17 11:21 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 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 □


使用特权

评论回复

相关帖子

沙发
LcwSwust| | 2021-9-17 11:43 | 只看该作者
本帖最后由 LcwSwust 于 2021-9-17 11:47 编辑

所以说,B在切换继电器前要监线A与主机之间的双方通信,在空闲时才能切换。
至于干扰码,由于232输入端为高阻,是极易受干扰的,建议输入端加下拉电阻,或加电容滤波。
由于二者通信时均与电脑共地,所以可以不需要继电器,而是将A与B的TXD串二极管并联电阻再接一起(“或门”的逻辑),二者RXD可直接接在一起,这样应当不会有干扰,除非二者同时发送数据。

使用特权

评论回复
评论
cjseng 2021-9-17 16:13 回复TA
@xmar :如何改进? 
xmar 2021-9-17 15:02 回复TA
对。楼主增加的B通信硬件、软件设计不合理。其实,容易改进。 
板凳
cjseng|  楼主 | 2021-9-17 11:57 | 只看该作者
LcwSwust 发表于 2021-9-17 11:43
所以说,B在切换继电器前要监线A与主机之间的双方通信,在空闲时才能切换。
至于干扰码,由于232输入端为高 ...

试过加10K下拉电阻,无效。RXD是并在一起的,切换的只是TXD。
A与B会同时发数据的,因为不能对A做任何改动,A为定型产品,A不知道B的存在。主机也为早期定型产品,主机也不知道B的存在。B就是冒充A与主机通讯。
从B切换到A,是在串口空闲期间切换的,反过来,从A切换到B不能保证,因为B没有监测A的发送,因为B的串口不够用,要是再多个串口,就可以监测A了。

使用特权

评论回复
地板
LcwSwust| | 2021-9-17 12:05 | 只看该作者
cjseng 发表于 2021-9-17 11:57
试过加10K下拉电阻,无效。RXD是并在一起的,切换的只是TXD。
A与B会同时发数据的,因为不能对A做任何改 ...

监测是否有数据即可,并不一定要使用串口,任一IO定时查询即可,查询频率比波特率高一点即可。

使用特权

评论回复
5
cjseng|  楼主 | 2021-9-17 12:33 | 只看该作者
LcwSwust 发表于 2021-9-17 12:05
监测是否有数据即可,并不一定要使用串口,任一IO定时查询即可,查询频率比波特率高一点即可。
...

用IO监测串口是否有数据不大好使,我这边测试发现了,无论是主机还是A,发送数据时,经常会卡一下,比如一帧数据20个字节,发送到7个字节时,停顿了一下,停顿几十毫秒到几百毫秒不等,然后接着发送剩下的13个字节。如果不接收完整数据并解析,无法判断数据是否发送完成。

使用特权

评论回复
6
LcwSwust| | 2021-9-17 13:10 | 只看该作者
本帖最后由 LcwSwust 于 2021-9-17 13:19 编辑
cjseng 发表于 2021-9-17 12:33
用IO监测串口是否有数据不大好使,我这边测试发现了,无论是主机还是A,发送数据时,经常会卡一下,比如 ...

哦,那就稍微麻烦一点,设备B换一个双串口单片机,串口1接主机,串口2接设备A,三方数据尽在掌控。
若设备B不想改,就加一个三串口单片机,串口1接主机,串口2接设备A,串口3接设备B,专门处理三方通信。
只要协议解析正确,这两种方法都可以保证无乱码、无冲突,只是有一点延时。
补充一下:只要单片机资源充足,可以用普通IO加定时器模拟出新的串口,且是全双工。

使用特权

评论回复
7
cjseng|  楼主 | 2021-9-17 14:20 | 只看该作者
LcwSwust 发表于 2021-9-17 13:10
哦,那就稍微麻烦一点,设备B换一个双串口单片机,串口1接主机,串口2接设备A,三方数据尽在掌控。
若设备 ...

B单片机是双串口,除了要跟主机通讯,还要跟一无线数传通讯。客户的目的就是要用一遥控器代替A手控面板操作,遥控距离100米。
原始设计是用的4串口单片机,可是今年,那玩意儿太贵了,用不起,退而求其次,用了双串口的,有些功能只能阉割掉。
用IO模拟全双工串口是可以的,以前这么用过,甚至有一次,用一个IO模拟了串口收发,本来只接收GPS信号的,后来由于需求变更,接收引脚还要对外发送数据,只能用软件来模拟成TXD,一个IO变成半双工通讯。

但是,话说回来,就算我这里采用了3串口或4串口单片机,也无法完全避免通讯过程中的乱码、冲突问题。
因为这里边有3个MCU,一个主机,一个A,一个B,谁也不知道哪个MCU在某些情况下会被看门狗重启,数据发送一半重启了,照样造成冲突。当然这是小概率事件。
主控、A、B都是户外长期连续运行且无人值守,死机的概率是存在的,实际上经常发生。

使用特权

评论回复
8
cjseng|  楼主 | 2021-9-17 15:06 | 只看该作者
C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0,这是一帧完整的数据,如果发送时,被其它中断打断,只要两个字节之间的间隔超过50us,主机就认为是非法数据,不再应答;
11 22 33 44 55 C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0,在完整数据帧前插入“11 22 33 44 55”,主机可以处理,能正确应答;
C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0 11 22 33 44 55,在完整数据帧后插入“11 22 33 44 55”,主机可以处理,能正确应答;
C0 20 78 7A 20 C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0,在完整数据帧前插入“C0 20 78 7A 20”,主机认为是非法数据,不再应答。

真是个奇怪的问题!

使用特权

评论回复
9
yueguang3048| | 2021-9-17 15:28 | 只看该作者
本帖最后由 yueguang3048 于 2021-9-17 15:30 编辑
cjseng 发表于 2021-9-17 15:06
C0 20 78 7A 20 FF FF FF FF FF 82 F8 00 01 03 85 C0,这是一帧完整的数据,如果发送时,被其它中断打断, ...

个人看法:
1.不能在C0与C0之间插入错误的数据,主机只要解析错1次,可能就不理你了;
2.关于“串口信息卡顿”,建议你是用示波器看下串口波形间隔,是否真的是卡顿?
3.慢慢分析它的协议信息(得知道主机和A之间是如何说话的),一步步验证和记录(找规律),毕竟是Crack嘛(看样子像)。

使用特权

评论回复
10
ningling_21| | 2021-9-17 15:28 | 只看该作者
继电器切换稳定后再收发数据肯定没问题,还没稳定就发数据有可能出错

使用特权

评论回复
11
cjseng|  楼主 | 2021-9-17 15:37 | 只看该作者
yueguang3048 发表于 2021-9-17 15:28
个人看法:
1.不能在C0与C0之间插入错误的数据,主机只要解析错1次,可能就不理你了;
2.关于“串口信息卡 ...

1.主机解析错误一次,一段时间之内不理睬我了,大部分2-3分钟之后就活过来了,好像什么事情都没发生,但偶尔会半个小时活不过来,甚至一直活不过来,此时,只能重启主机;
2.卡顿嘛,我自己改的发送程序测试的,故意在两个字节之间加入延时,慢慢加到50us,主机不再响应;
3.协议有客户提供,就是主机的开发人员提供的,不是我去Crack的。本来就是客户有这个需求,但是他们的研发人员不愿意做,项目外包,找我来做的。

使用特权

评论回复
12
cjseng|  楼主 | 2021-9-17 15:39 | 只看该作者
本帖最后由 cjseng 于 2021-9-17 15:42 编辑
ningling_21 发表于 2021-9-17 15:28
继电器切换稳定后再收发数据肯定没问题,还没稳定就发数据有可能出错

从A切换到B,我加了50ms延时,然后再发送数据的。但是切换瞬间,有可能A在发数据,没发完就被切掉了,导致主机接收到一个错误的帧,然后主机就不理我了。从B切换到A,我是确保B发送完数据后延时10-20ms再切换的。
波特率是19200。

这其中,A、B都不怕错误的帧,半帧数据直接丢弃,只要后续有完整的帧,都可以处理,中间有卡顿,也没问题。

使用特权

评论回复
13
cjseng|  楼主 | 2021-9-17 15:45 | 只看该作者
跟主机的某位研发人员沟通,对方表示,数据接收是linux底层处理的,收到数据产生一个中断,应用程序去读一下数据,然后解析。
出问题时,底层不产生中断了,所以应用程序读不到数据。

使用特权

评论回复
14
ningling_21| | 2021-9-17 15:45 | 只看该作者
主机没有容错,差评

使用特权

评论回复
15
LcwSwust| | 2021-9-17 16:01 | 只看该作者
cjseng 发表于 2021-9-17 14:20
B单片机是双串口,除了要跟主机通讯,还要跟一无线数传通讯。客户的目的就是要用一遥控器代替A手控面板操 ...

例如,你采用了外加三串口单片机的方法,这单片机已完全接管了三方通信,
收到数据、解析、然后转发,或延时一段时间后转发这一帧,非法数据就丢掉。

使用特权

评论回复
16
cjseng|  楼主 | 2021-9-17 16:12 | 只看该作者
LcwSwust 发表于 2021-9-17 16:01
例如,你采用了外加三串口单片机的方法,这单片机已完全接管了三方通信,
收到数据、解析、然后转发,或 ...

这是个办法,不过已经交货了啊,订单已完成。
从接到订单到交货,耗时2个月。

使用特权

评论回复
17
叶春勇| | 2021-9-17 16:24 | 只看该作者
cjseng 发表于 2021-9-17 15:45
跟主机的某位研发人员沟通,对方表示,数据接收是linux底层处理的,收到数据产生一个中断,应用程序去读一 ...

买rs232转485那种头。
主机一个,A设备一个,B设备一个。
不需要继电器了。
你的B设备也是能收发主机的数据的,见机行事

使用特权

评论回复
18
cjseng|  楼主 | 2021-9-17 16:36 | 只看该作者
叶春勇 发表于 2021-9-17 16:24
买rs232转485那种头。
主机一个,A设备一个,B设备一个。
不需要继电器了。

这样就是主机、A、B群聊咯,每个人的发言,另外两方都能听到。
不确定的是:B发给主机的数据,也会被A收到,对于A来说,收到B的数据不符合通讯协议,不知道会怎么样,就怕把A也搞死了。

使用特权

评论回复
19
叶春勇| | 2021-9-17 16:55 | 只看该作者
cjseng 发表于 2021-9-17 16:36
这样就是主机、A、B群聊咯,每个人的发言,另外两方都能听到。
不确定的是:B发给主机的数据,也会被A收 ...

我是看你说了

你说的好像一个操作面板,客户搞无线远程操纵,数据量应该不大的吧

使用特权

评论回复
20
叶春勇| | 2021-9-17 17:10 | 只看该作者
还有双串口服务器转以太网,主机那边装一个虚拟串口。
A和B,都要转一手。出错概率就小一些。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

63

主题

4242

帖子

46

粉丝