Option Explicit
Dim inData As String
Dim a() As Byte Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary '二进制接收
MSComm1.PortOpen = True
End Sub Private Sub MsComm1_OnComm()
Dim intInputLen As Integer
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
'此处添加处理接收的代码
intInputLen = MSComm1.InBufferCount
ReDim a(intInputLen)
a = MSComm1.Input
For i = 0 To UBound(a)
If Len(Hex(a(i))) = 1 Then
inData = inData & "0" & Hex(a(i))
Else
inData = inData & Hex(a(i))
End If
Next
Text2 = inData
End Select
End Sub 问题:既然MSComm1.RThreshold = 1 ,那么每接收一个字节就触发一次oncomm事件,那intInputLen = MSComm1.InBufferCount ,intInputLen不是应该等于1吗?a = MSComm1.Input ,.input不应该也是一个字节吗?那么UBound(a) 不就是0吗?只有a(0)里有数据,应该是8位2进制吧? 那么为什么inData里是很多个字符呢?另外:我每接收一个字节,就把它input出来,这时候.InBufferCount 是不是应该等于0 了,但好象.InBufferCount 并不固定?为什么??
Dim inData As String
Dim a() As Byte Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary '二进制接收
MSComm1.PortOpen = True
End Sub Private Sub MsComm1_OnComm()
Dim intInputLen As Integer
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
'此处添加处理接收的代码
intInputLen = MSComm1.InBufferCount
ReDim a(intInputLen)
a = MSComm1.Input
For i = 0 To UBound(a)
If Len(Hex(a(i))) = 1 Then
inData = inData & "0" & Hex(a(i))
Else
inData = inData & Hex(a(i))
End If
Next
Text2 = inData
End Select
End Sub 问题:既然MSComm1.RThreshold = 1 ,那么每接收一个字节就触发一次oncomm事件,那intInputLen = MSComm1.InBufferCount ,intInputLen不是应该等于1吗?a = MSComm1.Input ,.input不应该也是一个字节吗?那么UBound(a) 不就是0吗?只有a(0)里有数据,应该是8位2进制吧? 那么为什么inData里是很多个字符呢?另外:我每接收一个字节,就把它input出来,这时候.InBufferCount 是不是应该等于0 了,但好象.InBufferCount 并不固定?为什么??
不是接收到N字节,就一定产生N次OnComm事件.
LZ:为1个串口通信的疑问,在CSDN和BAIDU共发了6个贴子.但我感觉LZ思路有问题,你应将网络搜索的代码消化,并依据你自己的实际需求和通信协议和数据帧约定来组织你的代码算法和写出代码.
我知道不是接收N个字节就产生N次OnComm事件,但我每接收一个字节就去处理,读出来。那应该是读出一个字节啊??
建议你将代码如此修改:
Option Explicit
Dim inData As String
Dim a() As Byte Private Sub Form_Load()
MSComm1.Settings = "9600,n,8,1"
MSComm1.RThreshold = 1
MSComm1.InputMode = comInputModeBinary '二进制接收
MSComm1.PortOpen = True
End Sub Private Sub MsComm1_OnComm()
Dim intInputLen As Integer
Dim i As Integer
Select Case MSComm1.CommEvent
Case comEvReceive
'此处添加处理接收的代码
MSComm1.RThreshold = 0 '屏蔽事件触发
intInputLen = MSComm1.InBufferCount
ReDim a(intInputLen)
a = MSComm1.Input
For i = 0 To UBound(a)
If Len(Hex(a(i))) = 1 Then
inData = inData & "0" & Hex(a(i))
Else
inData = inData & Hex(a(i))
End If
Next
Text2 = inData
MSComm1.RThreshold = 1 '打开事件触发
End Select
End Sub 这样做可以避免你再处理OnComm事件是触发该事件。从而带来潜在的一些问题。
MSComm1.RThreshold = 0 '屏蔽事件触发
这里有代码,可以借鉴