问题描述
各位前辈:我是一个刚接触VB.NET8.0的菜鸟,现在做一个串口通讯程序,测试MODBUS协议的程序,遇到一些问题,还望各位前辈不吝赐教:串口接收数据时,如果回复的报文稍长,就要接收两次以上才能接收完:发送报文:010300000016C404接收报文:01032C00550055003F0063005C001E004900630020003A001300640001032C00550055003F0063005C001E004900630020003A001300640047000B003E0013001300520023000E0024002C7F37我的串口接收事件如下:'************************************'串口接收事件'************************************PrivateSubPortCom_DataReceived(ByValsenderAsObject,ByValeAsSystem.IO.Ports.SerialDataReceivedEventArgs)HandlesPortCom.DataReceivedDimLAsShort=0DimUBAsShort=0DimTmpByte()AsByteDimiAsShort=0UB=UBound(RevByte)Thread.Sleep(18)L=PortCom.BytesToReadReDimTmpByte(L-1)PortCom.Read(TmpByte,0,L)ReDimPreserveRevByte(UB+L)Fori=0ToUBound(TmpByte)RevByte(UB+i+1)=TmpByte(i)NextiCallShowRev()EndSub不知道错在哪里,还望前辈们多多赐教!急等!谢谢!
解决方案
解决方案二:
如果知道返回数据的长度,就设定事件产生的字节数,或者不要用事件,发送指令后用循环语句等待查询串口受到的字节数,到了指定的字节数或超时在退出循环,如果不超时再读取返回的字节数。如果不知道到返回的字节数,就要看协议了,返回的数据头部分应该定义应该返回的字节数,如果没有定义,就是你的协议有问题,没法收。
解决方案三:
先的时候我也想到过这个问题,但是后来我又发现,如果这个软件只要串口是打开的,别的通讯软件发送数据,这时本软件就不知道到底应该接收多少字节的数据,也就无法设定指定的字节数了!
解决方案四:
llsus:如果不知道到返回的字节数,就要看协议了,返回的数据头部分应该定义应该返回的字节数,如果没有定义,就是你的协议有问题,没法收。返回的数据头部分应该怎么定义返回的字节数呢?
解决方案五:
你用串口通讯,收数据,又不可能乱收,总要有个协议吧?协议的规定的通讯数据长度一般分为定长和不定长两种,这两种都是常用的例如:定义一个主机,一个从机主机发送10个字节,从机回复20个字节这就是定长不定长就要在接收的数据中定义长度,例如:发送5字节头,头中,前2字节为前导字节,第三字节是数据长度,第四字节是目标机号....这样接受方就可以通过第三字节来判断后面还有多少字节需接收。如果以上你看不懂,那么建议你再去学习学习,我帮不了你。
解决方案六:
经过几天的琢磨,现在我已经解决了这个问题,不过还是谢谢llsus前辈!真的谢谢!
解决方案七:
学习
解决方案八:
支持搂主,收藏