首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

请问,VB MScomm和单片机通讯,怎么从接收帧中把数据分离显示在TEXT控件上.多谢

2012-02-28 
请教,VB MScomm和单片机通讯,如何从接收帧中把数据分离显示在TEXT控件上.谢谢 通讯协议,ModbusRTU;地址+读

请教,VB MScomm和单片机通讯,如何从接收帧中把数据分离显示在TEXT控件上.谢谢

通讯协议,Modbus   RTU   ;地址+读功能码+寄存器起始号+数据点数+CRC校验
读1号主机起始地址为40000开始的4个寄存器的值(40011-40014)
发送帧:01   03   00   0A   00   04   64   0B
接收帧:01   03   08   00   E3   00   E3   00   E3   00   E3   32   B0  
///////////////////////////
******略去****************
Private   Sub   MSComm1_OnComm()
Dim   i%,   buf$
Dim   nPos
Dim   hexdisp   As   String
Dim   inByte()   As   Byte
Dim   tmp   As   Variant                                                                  
        buf   =   "   "
Select   Case   MSComm1.CommEvent
Case   comEvReceive                                                                    
tmp   =   MSComm1.Input
inByte   =   tmp                                                                                
For   i   =   LBound(inByte)   To   UBound(inByte)
                            buf   =   buf   +   Hex(inByte(i))   +   Chr(32)
                Next   i
                            hexdisp   =   hexdisp   +   buf
End   Select
                            p11   =   Val( "&H "   &   Mid(hexdisp,   8,   4))      
                            p12   =   Val( "&H "   &   Mid(hexdisp,   13,   4))
                            p13   =   Val( "&H "   &   Mid(hexdisp,   18,   4))
                            p14   =   Val( "&H "   &   Mid(hexdisp,   23,   4))

                            Text2.Text   =   str(p11)        
                            Text3.Text   =   str(p12)
                            Text4.Text   =   str(p13)
                            Text1.Text   =   str(p14)
end   sub
*********略去*********************
//////////////////////////////////

上面读四个寄存器地址值的时候,TEXT1-4都可以正确显示收到的数据。
问题是,我改为如果读八个寄存器地址的值时,TEX1-TEXT8都无法得到正确的数据。如下


发送帧:01   03   00   0A   00   08   64   0E
接收帧:01   03   10   00   E3   00   E3   00   E2   00   E2   01   89   01   88   01   88   01   88   08   87  

我是用定时器触发来发送命令的,程序载入时定时器1有效,定时器1每1秒钟发送一帧数据给单片机,
在初始化代码里设MSComm1.RThreshold   =   1,每收到1个字符每产生ONcomm事件来接收数据。我试着将
RThreshold   属性的值改为8或16时,读取4个点时,MSComm1.RThreshold   =   8,接收的数据正确,读取
8个点时,MSComm1.RThreshold   =   16,接收的数据依然无法正确显示在我的TEXT中。我在想是否是因
为接收数据是不定长数据的原因。没有想到比较好的办法,请各位前辈指导。谢谢!
                                     




[解决办法]
你接收的最大数据长度是多少?还有你的数据是定时接受还是不定时接受?
你将MSComm1.RThreshold 设置为1,可能在刚好处理比较短的数据,而接受数据比较长的时候就不行了,建议在发生comEvReceive事件后把MSComm1.RThreshold 设置为0,在接受数据部分做点延时,等数据发送完了再接收数据,加我QQ:23275459

热点排行