串口通信类库 通讯范例 大家帮忙看看这样写好不好?
http://blog.csdn.net/yeqi3000/article/details/8236555
串口通信类库 通讯范例 大家帮忙看看这样写好不好?各位牛人们,你们通信的类库都是怎么做的?
------解决方案--------------------我是根据需求 定义出符合自己的类库,然后打包封装成DLL,
------解决方案--------------------
我这个是基础通信类,然后其他通信设备继承这个类再拓展功能,但收发数据都是用这个基类里的方法。
------解决方案--------------------就没有大牛来给点意见么。求提高!
------解决方案--------------------最后一次人工置顶,求意见。
------解决方案--------------------存在很大的误导。。
你认为一次通讯肯定就能接收完数据
if (DataCount >= _FullCmdCount)//接收到数据位数量正确
如果一条完整的数据被分成多次收到的话,你永远不能得到一个正确的结果。因为你丢弃了原本一条完整报文的另一部分。
还是赶紧先从blog中拿下来吧。以免误导别人。
------解决方案--------------------
请看清楚好吗?这个是一个异步数据接收。在发送数据的方法里有时间超时判断。
接收数据里面不是一次性接收完的。触发了RSSerialPort_DataReceived之后,是要做一些判断。一个是不是SendBytes中已经认为超时不再需要你接收数据了,一个是判断接收的数据位数是否达到的预定的正确数据位数。若数据位数还没达到,那么下一次触发RSSerialPort_DataReceived时将再次判断数据位数是否达到预定数据位数。如果在一段时间内都未能达到。这个时候SendBytes就认为接收超时返回false了。
不过还是很感谢你进来回帖。
------解决方案--------------------当_IsAllowReceiveData 为true时根本不会丢弃任何数据。
------解决方案--------------------
还有一点,我想你并不清楚,不执行
this.Read(ReCMD, 0, _FullCmdCount);//读取数据
这一句的话,数据是还在缓存里的。所以根本不存在多次接收一条完整报文就会丢弃其中一部分的情况。
------解决方案--------------------为了谨慎,我又仔细看了一下你的代码。
首先一个问题是:在很多项目中,你不能预计串口可以返回多少字节的固定长度的数据。就是说一条完整的报文的长度是未知的。
下面讨论先前的问题:
设你发送0x01 0x02到串口,你期望串口可以返回 0x01 0x02 0x03......0x10
共10个字节。
理论上,你往串口写入数据后,就有可能马上接收到数据。
假设你第一次这样:
int DataCount = this.BytesToRead
接收到1个长度的字节,即0x01
显然DataCount小于_FullCmdCount(期望的10个字节的长度)
接着该事件再次引发,假设这次接收到0x02 0x03共二个长度的字节
显然,DataCount小于 _FullCmdCount (期望的10个字节的长度)
接着继续上面的事件引发。
10个长度的字节返回被分成N次接收到。
而你的代码总是没有办法去处理这一个完整的报文 。
假设一共分成了5次接收完,花费2秒。而你的超时设置为1秒,因为超时的原因,你的代码也不会有正确的结果。
------解决方案--------------------
请弄清楚 this.BytesToRead 和this.Read(ReCMD, 0, _FullCmdCount);的区别再行讨论
------解决方案--------------------显然你也并没有仔细看我上面给您的回复。跟您解释了为什么多次接收数据不会出现丢失数据的原理。
------解决方案--------------------