软件中进行多线程串口通信时,用Modbus通信协议。
当线程A下发:01 03 00 00 00 01 84 0A读取X值。机器回文是:01 03 02 02 11 79 28
线程B下发:01 03 00 01 00 01 D5 CA 读取Y值。 机器回文是:01 03 02 05 15 7A DB
第一条下发命令含义是前两位01 03区分命令功能为读取,后面两位00 00是寄存器地址,再后面是寄存器位长00 01,再后面校验码占两位。
机器第一条回文: 01 03也是区分读取的回文。后面的02是数据长度,02 11 是内容,79 28是校验码。
这样回文只能靠前两位01 03来区分,现遇到问题是由于线程A是轮询式不断发送,当线程B发时有可能收到的是A的回文,叫硬件同事改协议,说改不了, 是Modbus通信协议,全球通用,Modbus通信协议是不是有问题?
现遇到的问题是:不改协议,软件上应该如何区分收到的是A还是B的回文?
建议用锁的方式去做处理,等待发送接收到数据了,再做下一次的轮询
把指令全部放到一个队列里去,每个指令加个callback或者标志,收到回应后,交给对应的callback去处理. 然后再处理下一条指令.
不是Modbus的问题,是你使用方式的问题。
必须使用串行的方式处理,发一条读一条。
建议重新整理一下你的逻辑,将串口发-收的功能放入临界区,或者放在同一个线程中。
串口只有一个是不可能并行发送的,如果不是发一条收一条的模式处理,挨着发送两条命令的话,接收时分析数据会很麻烦,甚至可能是混乱的数据完全无法分析(取决于硬件处理方式)。
Modbus通信协议本身是一种通用的工业通信协议,可以在各种设备和系统中使用。在您描述的情况下,由于线程A和线程B一起发送和接收Modbus命令和回复时可能会出现混淆的问题。
为了确保正确地区分收到的是线程A还是线程B的回复,在软件层面可以采取以下方法: