刚学习C#,关于C#串口通信有几点不明白的地方想请教一下,具体如下:
Port.Write("数据1"); //查询当前电流
Port.Write("数据2"); //查询当前电压
Port.Write("数据3"); //查询当前频率
假设有一个Button控制串口发送三个数据,那DataReceived事件BytesToRead也会返回对应三个数据的结果,正常返回数据顺序应该是:当前电流值→当前电压值→当前频率值,那会不会出现返回的数据顺序跟我发送的顺序不一样的问题呢?因为下位机返回的数据格式是:起始码|站号|指令代码(Read/Write)|数据|BCC|终止符,从返回的指令格式来看是没办法判断收到的数据到底是谁,如果返回的数据顺序不对那不就乱套了嘛,想请教一下有没有可能会发生这种情况,如果有的话有什么好的办法解决吗?
一般来说串口通信数据封装 都会有一个指令的回执,保留指令头,表示这是回复对应指令的内容 然后你上位机 解包就好
那就不要用事件监听数据咯
设置ReadTimeout
发送数据后直接 Read() ;
这是对应的指令格式
您好,我有两个思路希望能帮助您。
思路A(简单方式):
1.假设,您3此数据的报文长度是一致的 长度确定。则可以设置C#中串口接受数据的触发中断,port.ReceivedBytesThreshold = length(数据长度),
然后再来读,相当于每次到达一条指令的数据时,会触发一次返回数据,然后马上加入到存储队列中。
2.如果设置的波特率是115200 ,可以每次发送后,延时20ms,这样给数据接收缓冲留有时间,这样一次按钮下3次发送每次间隔20ms,但可以触发接收中断3次。顺序和发送顺序一致。
思路B(编码思想)
1.不管接收的顺序如何,若您需要在一个站点上读取3种不同的数据,就要舍弃应答数据的最大可表示范围,用两个bit来区分3个数据。4字符原本为16bit,用了两个bit表示3种变量后,它的精度就变为 14bit了, 您按照需求定义自己的数据解析即可。