vb串行通信接受一串字节数是,如何一个字节一个字节的全部接受出来
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = 1 '每次接受(inputlen的值)个字符
MSComm1.RThreshold = 1 '当接收缓冲区接收的字符数=RThreshold的值时 触发oncome中的comEvReceive
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case 2 '当接收到RThreshold个字符时触发该事件
Dim ij%, buf
buf = ""
getbyte = MSComm1.Input
For ij = LBound(getbyte) To UBound(getbyte)
buf = LTrim(buf) & getbyte(ij)
Next
data(s) = buf
Text15.Text = Text15.Text & ", " & data(s)
end select
end sub
vb 用串口1 ,将串口调试元件设置串口2 ,串口1和串口2连接
我在串口调试发这样的数据(十六进制):c7 08 01 11 1a c8(十进制为:199 8 1 17 26 200)
text15接收到得的内容为“199,8,” 后面的接受不到了
后来我把 MSComm1.InputLen = 1 改成:MSComm1.InputLen = mscomm1.inbuffercount
还是用串口调试发上面同样的数据,text15接收到得内容变成“199811726200,”(注意text15里有一个逗号) 是 全部接受了,但是没有一个字节一个字节的分开
用串口调试软件一个字节数,点一次发送,肯定能接受正确(因为每次发送之间有足够时间),但是如果我的下位机程序发一个数组(a(1)=199,a(2)=8...),大家知道程序执行是很快的,如果用MSComm1.InputLen = 1方式,不能一次接收全部数据,如果用
MSComm1.InputLen = mscomm1.inbuffercount方式,数据一团排,不会自动分开,根本分辨不了。如果每个数组元素之间加一个延时delay_ms(5)也是可以的,但是我的队友不想用延时,请问各位大侠vb方面有什么方法当下位机发一排字节数过来的,我的vb既能一次全部接受,而且每一个字节每一个字节分开,然后显示出来。
问题已解决,我把lbound和ubound的意思搞错了,程序改成:
MSComm1.CommPort = 1
MSComm1.Settings = "9600,N,8,1"
MSComm1.PortOpen = True
MSComm1.InputMode = comInputModeBinary
MSComm1.InputLen = Mscomm1.inbuffercount '每次接受(inputlen的值)个字符
MSComm1.RThreshold = 1 '当接收缓冲区接收的字符数=RThreshold的值时 触发oncome中的comEvReceive
Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case 2 '当接收到RThreshold个字符时触发该事件
Dim ij%, buf
buf = ""
getbyte = MSComm1.Input
For ij = LBound(getbyte) To UBound(getbyte)
buf = LTrim(buf)&getbyte(ij)&","
data(s) = getbyte(ij)
s=s+1
Next
Text15.Text = buf
end select
end sub
就可以了!
下面这位朋友用command 和 定时器timer控制接收串行数据,每接收一次数据就在text1里输出:时间+数据,并规定text的容量,满了自动清空,我看明白了,虽然没有切中我的问题,不过我还是要感谢你的回答!! 展开
试试我下面的程序,前提是你按规范发送数据。
Private Sub Command1_Click()
Timer1.Enabled = True
Command1.BackColor = vbGreen
End Sub
Private Sub Command2_Click()
Text1.Text = ""
End Sub
Private Sub Form_Load()
'通讯口初始化:
With MSComm1
.Settings = "9600,n,8,2"
.CommPort = 3
.InputMode = comInputModeBinary
.InBufferCount = 0
.OutBufferCount = 0
.RThreshold = 0
.SThreshold = 0
.PortOpen = True
End With
Text1.Text = ""
End Sub
Private Sub Text1_Change()
If Len(Text1.Text) > 10000 Then Text1.Text = ""
End Sub
Private Sub Timer1_Timer()
'采用轮循法采集数据
Dim inx() As Byte
Dim strTemp As String
Dim strTemp1 As String
Dim ReceivedLen As Integer
Timer1.Enabled = False '关闭定时器
If MSComm1.InBufferCount > 0 Then
ReceivedLen = MSComm1.InBufferCount
inx = MSComm1.Input
For i = 0 To UBound(inx)
strTemp1 = Hex(inx(i))
If Len(strTemp1) > 1 Then
strTemp = strTemp & strTemp1 & " "
Else
strTemp = strTemp & "0" & strTemp1 & " "
End If
Next i
Text1.Text = Text1.Text & Format(Second(Now), "00") & Right(Format(Str(Timer), "0.00"), 3) & " " & strTemp & vbCrLf
Text1.SelStart = Len(Text1.Text)
End If
Timer1.Enabled = True '打开定时器
Label1.Caption = Now()
End Sub