读书人

请问VB MScomm和单片机通讯怎么从

发布时间: 2012-02-28 13:06:35 作者: rapoo

请教,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

读书人网 >VB

热点推荐