我要接收有头和尾的数据,头是35 尾是“H0D”,为什么我把sleep去了就不可以了
MSComm1.InputMode = comInputModeBinary '采用二进制接收
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.InBufferSize = 100 '接收缓冲区大小
MSComm1.OutBufferSize = 100 '发送缓冲区大小
MSComm1.RThreshold = 1 '设置引发OnComm事件的字节长度
MSComm1.InputLen = 1 '设置Input从接收缓冲读取全部数据
MSComm1.PortOpen = True
Private Sub MSComm1_OnComm()
Sleep (500)
Select Case MSComm1.CommEvent
Case comEvReceive
Do While MSComm1.InBufferCount <> 0
indata = MSComm1.Input
If jieshouok Then
arrt(p) = indata(0)
p = p + 1
Else
If jieshouok = False And indata(0) <> 35 Then
Else
jieshouok = True
arrt(p) = indata(0)
p = p + 1
End If
End If
If indata(0) = 13 And jieshouok Then
'获得数据后开始处理
end if
Loop
End Select
end sub
MSComm1.InputMode = comInputModeBinary '采用二进制接收
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.InBufferSize = 100 '接收缓冲区大小
MSComm1.OutBufferSize = 100 '发送缓冲区大小
MSComm1.RThreshold = 1 '设置引发OnComm事件的字节长度
MSComm1.InputLen = 1 '设置Input从接收缓冲读取全部数据
MSComm1.PortOpen = True
Private Sub MSComm1_OnComm()
Sleep (500)
Select Case MSComm1.CommEvent
Case comEvReceive
Do While MSComm1.InBufferCount <> 0
indata = MSComm1.Input
If jieshouok Then
arrt(p) = indata(0)
p = p + 1
Else
If jieshouok = False And indata(0) <> 35 Then
Else
jieshouok = True
arrt(p) = indata(0)
p = p + 1
End If
End If
If indata(0) = 13 And jieshouok Then
'获得数据后开始处理
end if
Loop
End Select
end sub
另请LZ完整叙述通信协议和数据帧构成.
Option Explicit
Dim strRecHex As StringPrivate Sub Form_Load()
MSComm1.CommPort = 1
MSComm1.InBufferSize = 1024
MSComm1.OutBufferSize = 512
MSComm1.Settings = "9600,n,8,1"
MSComm1.InputMode = comInputModeBinary '二进制接收
MSComm1.InputLen = 0
MSComm1.PortOpen = True
MSComm1.RThreshold = 1
End SubPrivate Sub MSComm1_OnComm()
Dim ReceiveFrame() As Byte
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
ReDim ReceiveFrame(MSComm1.InBufferCount)
Debug.Print MSComm1.InBufferCount
ReceiveFrame() = MSComm1.Input 'Input属性:返回并删除接收缓冲区中的数据流
For i = 0 To UBound(ReceiveFrame)
strRecHex = strRecHex & Right("0" & Hex(ReceiveFrame(i)), 2)
Next
If Mid(strRecHex, 1, 2) = "23" And Right(strRecHex, 4) = "0D" Then
Text1 = strRecHex
'写数据处理代码
strRecHex = ""
End If
End Select
End Sub
Private Sub MSComm1_OnComm()
Dim ReceiveFrame() As Byte
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
ReDim ReceiveFrame(MSComm1.InBufferCount)
Debug.Print MSComm1.InBufferCount
ReceiveFrame() = MSComm1.Input 'Input属性:返回并删除接收缓冲区中的数据流
For i = 0 To UBound(ReceiveFrame)
strRecHex = strRecHex & Right("0" & Hex(ReceiveFrame(i)), 2)
Next
If Mid(strRecHex, 1, 2) = "23" And Right(strRecHex, 2) = "0D" Then
Text1 = strRecHex
'写数据处理代码
strRecHex = ""
End If
End Select
End Sub
Option Explicit
Private Sub Form_Load()
MSComm1.InputMode = comInputModeBinary '采用二进制接收
MSComm1.InBufferCount = 0 '清空接受缓冲区
MSComm1.OutBufferCount = 0 '清空传输缓冲区
MSComm1.InBufferSize = 100 '接收缓冲区大小
MSComm1.OutBufferSize = 100 '发送缓冲区大小
MSComm1.RThreshold = 1 '设置引发OnComm事件的字节长度
MSComm1.InputLen = 1 '设置Input从接收缓冲读取全部数据
MSComm1.PortOpen = True
End SubPrivate Sub MSComm1_OnComm()
Dim inData() As Byte
Select Case MSComm1.CommEvent
Case comEvReceive
MSComm1.RThreshold = 0
Sleep (500)
inData = MSComm1.Input
If inData(0) = 13 And inData(UBound(inData)) = &H35 Then
'获得数据后开始处理
End If
MSComm1.RThreshold = 1
End Select
End Sub
由于我不清楚你的下位机上传数据的方式,可能这个程序会有点问题,很希望和你讨论:)
===============================================================并且Sleep (500)
时间太长了。你改短点试试。这个MSCOMM控件 肯定不是省油的灯!!! 问题一堆!!! 控件本身问题太多!!
这个世界上使用MSCOMM控件实现串口通信不知道有多少了.现在就看到LS对MSCOMM控件意见很大!
在这里.InputMode = comInputModeBinary采用二进制接收,和.InputMode =comInputModeText采用文本接受有什么区别啊?
MSComm1.InputLen = 1 '设置Input从接收缓冲读取 1 字节是常见的方法。不过你设置缓冲区为 100 似乎太小,容易溢出。缺省设置是 1024。Private Sub MSComm1_OnComm()
Select Case MSComm1.CommEvent
Case comEvReceive
Do While MSComm1.InBufferCount > 0
indata = MSComm1.Input
If jieshouok Then
If indata(0) = 13 Then
jieshouok = Flase
p = 0
'获得数据后开始处理
Else
arrt(p) = indata(0)
p = p + 1
End If
Else
If indata(0) = 35 Then
jieshouok = True
End If
End If
Loop
End Select
end sub