Option ExplicitPrivate Const LenRxd = 5 '接受的字节长度Private mChannel As Integer '串口号 Private mTxd As Integer '发送的一个命令字'设置串口 Private Sub IniComm() On Error Resume Next MSComm1.InputMode = comInputModeBinary '以二进制方式接受 MSComm1.InputLen = 0 MSComm1.OutBufferCount = 0 MSComm1.InBufferCount = 0 '自己查询串口 MSComm1.SThreshold = 1 MSComm1.RThreshold = 0 MSComm1.CommPort = mChannel MSComm1.Settings = "2400,n,8,1" End Sub'打开串口 Private Sub OpenComm() If Not MSComm1.PortOpen Then MSComm1.PortOpen = True End Sub'发送一个命令字 Private Sub TxdComm() On Error Resume Next Dim byTxd(0) As Byte MSComm1.InBufferCount = 0 byTxd(0) = CByte(mTxd) MSComm1.Output = byTxd End Sub'接受字节数组 Private Sub RxdComm() On Error Resume Next Dim byRxd() As Byte Dim i As Integer byRxd = MSComm1.Input For i = 0 To LenRxd - 1 Debug.Print byRxd(i) Next i MSComm1.InBufferCount = 0 End Sub'进行通讯 Private Sub Comming() On Error GoTo ErrHere Dim idelay As Integer '一次通讯最大等待时间 Dim imax As Integer '允许的最大通讯次数 Dim iwrong As Integer '通讯不正常的次数 Dim t1 As Singleidelay = 2 imax = 5'发送一个命令字 Call TxdComm'下面是查询输入缓存 '如果没有正常通讯的话 '可以比较及时和灵活的采取措施 t1 = Timer Do While MSComm1.InBufferCount < LenRxd '加上DoEvents,虽然是不断的查询,但是并不影响其他工作 DoEvents If Timer - t1 > idelay Then iwrong = iwrong + 1 If iwrong >= imax Then MsgBox "出错了" GoTo ErrHere Else '有的时候由于种种原因造成通讯无反应 '这时候关掉串口重来一次就可能会成功 Call CloseComm Call IniComm Call OpenComm Call TxdComm t1 = Timer End If End If Loop'接受通讯数据并显示 Call RxdCommGoTo Sub_ExitErrHere: Sub_Exit: End Sub'关闭串口 Private Sub CloseComm() If MSComm1.PortOpen Then MSComm1.PortOpen = False End Sub
我在里面有回答
Private mTxd As Integer '发送的一个命令字'设置串口
Private Sub IniComm()
On Error Resume Next
MSComm1.InputMode = comInputModeBinary '以二进制方式接受
MSComm1.InputLen = 0
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0 '自己查询串口
MSComm1.SThreshold = 1
MSComm1.RThreshold = 0
MSComm1.CommPort = mChannel
MSComm1.Settings = "2400,n,8,1"
End Sub'打开串口
Private Sub OpenComm()
If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
End Sub'发送一个命令字
Private Sub TxdComm()
On Error Resume Next
Dim byTxd(0) As Byte
MSComm1.InBufferCount = 0
byTxd(0) = CByte(mTxd)
MSComm1.Output = byTxd
End Sub'接受字节数组
Private Sub RxdComm()
On Error Resume Next
Dim byRxd() As Byte
Dim i As Integer
byRxd = MSComm1.Input
For i = 0 To LenRxd - 1
Debug.Print byRxd(i)
Next i
MSComm1.InBufferCount = 0
End Sub'进行通讯
Private Sub Comming()
On Error GoTo ErrHere
Dim idelay As Integer '一次通讯最大等待时间
Dim imax As Integer '允许的最大通讯次数
Dim iwrong As Integer '通讯不正常的次数
Dim t1 As Singleidelay = 2
imax = 5'发送一个命令字
Call TxdComm'下面是查询输入缓存
'如果没有正常通讯的话
'可以比较及时和灵活的采取措施
t1 = Timer
Do While MSComm1.InBufferCount < LenRxd
'加上DoEvents,虽然是不断的查询,但是并不影响其他工作
DoEvents
If Timer - t1 > idelay Then
iwrong = iwrong + 1
If iwrong >= imax Then
MsgBox "出错了"
GoTo ErrHere
Else
'有的时候由于种种原因造成通讯无反应
'这时候关掉串口重来一次就可能会成功
Call CloseComm
Call IniComm
Call OpenComm
Call TxdComm
t1 = Timer
End If
End If
Loop'接受通讯数据并显示
Call RxdCommGoTo Sub_ExitErrHere:
Sub_Exit:
End Sub'关闭串口
Private Sub CloseComm()
If MSComm1.PortOpen Then MSComm1.PortOpen = False
End Sub