使用MSCOMM控件是mscomm1.inptu就可以接收串口中的数了。 如: Private Sub Form_Load() Dim receivedata As vaviant Dim loop1 As Integer MSComm1.PortOpen = 1 Do loop1 = loop1 + 1 MSComm1.Input = receivedata If loop1 = 500 Then Exit Sub Loop While receivedata = "" strgood = Asc(receivedata) End Sub
http://www.ccw.com.cn/htm/app/aprog/01_2_26_3.asp
'通过串口向一个仪表发送数据,为4个字节,然后仪表会反馈给我一个8个字节的数据,每隔200ms发送一次 '注: 有两个协议,分别应用于两种仪表 ' 协议一:发送时,为4个字节,接收数据为8个字节。 ' 协议二:发送时,为8个字节,接收数据为10个字节。 Private arrSend(8) As Byte Private arrSendRead(4) As Byte Private strFlag As String Private Sub Form_Load() With MSComm1 .CommPort = 1 .Settings = "9600,n,8,2" '设置通信口参数 .InBufferSize = 640 '设置MSComm1接收缓冲区为100字节 .OutBufferSize = 512 '设置MSComm1发送缓冲区为80字节 .InputMode = comInputModeBinary '设置接收数据模式为二进制形式 .InputLen = 1 '设置Input 一次从接收缓冲读取字节数为1 .SThreshold = 0 '设置Output 一次从发送缓冲读取字节数为1 .RThreshold = 10 '设置接收一个字节产生OnComm事件 .InBufferCount = 0 '清除接收缓冲区 .OutBufferCount = 0 '清除发送缓冲区 If .PortOpen = False Then '判断通信口是否打开 .PortOpen = True '打开通信口 If Err.Description Then '错误处理 MsgBox "串口通信无效!" Exit Sub End If End If End With strFlag = "1" '协议一 strFlag = "2" '协议二 Timer1.Enabled = True End Sub
Exit Sub errhandle: If Err.Number = 8018 Then MsgBox "端口已经被其它应用程序打开,系统不能正常运行!", vbOKOnly + vbCritical, "端口错误" End If End Sub Private Sub MSComm1_OnComm() Dim arrReceive(10) As Byte Dim lngData As Variant '用来从接收缓冲区读取数据 On Error Resume Next With MSComm1 Select Case MSComm1.CommEvent Case comEvReceive RThreshold = 0 '关闭OnComm事件接收 lngData = .Input '读取一个接收字节 arrReceive(0) = lngData(0) lngData = .Input arrReceive(1) = lngData(0) lngData = .Input arrReceive(2) = lngData(0) lngData = .Input arrReceive(3) = lngData(0) lngData = .Input arrReceive(4) = lngData(0) lngData = .Input arrReceive(5) = lngData(0) lngData = .Input arrReceive(6) = lngData(0) lngData = .Input arrReceive(7) = lngData(0) If strFlag = "1" Then lngData = .Input arrReceive(8) = lngData(0) lngData = .Input arrReceive(9) = lngData(0) End If End Select End With End Sub
楼上的,上面好像有一句有点问题。 If Err.Description Then '错误处理 应该改成:If Err.Description <>"" Then '错误处理 因为Err.Description是string型的而不是Boolean型的。 OK,应该就是这样了。
如:
Private Sub Form_Load()
Dim receivedata As vaviant
Dim loop1 As Integer
MSComm1.PortOpen = 1
Do
loop1 = loop1 + 1
MSComm1.Input = receivedata
If loop1 = 500 Then
Exit Sub
Loop While receivedata = ""
strgood = Asc(receivedata)
End Sub
'注: 有两个协议,分别应用于两种仪表
' 协议一:发送时,为4个字节,接收数据为8个字节。
' 协议二:发送时,为8个字节,接收数据为10个字节。
Private arrSend(8) As Byte
Private arrSendRead(4) As Byte
Private strFlag As String
Private Sub Form_Load()
With MSComm1
.CommPort = 1
.Settings = "9600,n,8,2" '设置通信口参数
.InBufferSize = 640 '设置MSComm1接收缓冲区为100字节
.OutBufferSize = 512 '设置MSComm1发送缓冲区为80字节
.InputMode = comInputModeBinary '设置接收数据模式为二进制形式
.InputLen = 1 '设置Input 一次从接收缓冲读取字节数为1
.SThreshold = 0 '设置Output 一次从发送缓冲读取字节数为1
.RThreshold = 10 '设置接收一个字节产生OnComm事件
.InBufferCount = 0 '清除接收缓冲区
.OutBufferCount = 0 '清除发送缓冲区
If .PortOpen = False Then '判断通信口是否打开
.PortOpen = True '打开通信口
If Err.Description Then '错误处理
MsgBox "串口通信无效!"
Exit Sub
End If
End If
End With
strFlag = "1" '协议一
strFlag = "2" '协议二
Timer1.Enabled = True
End Sub
Private Sub Timer1_Timer() '200ms触发一次
sendReadDec
End Sub
Private Sub sendReadDec()
On Error GoTo errhandle
MSComm1.OutBufferCount = 0
MSComm1.InBufferCount = 0
If strFlag = "1" Then '协议一
arrSend(0) = &H80 + Hex(1)
arrSend(1) = &H80 + Hex(1)
arrSend(2) = &H52
arrSend(3) = &HC
arrSend(4) = &H0
arrSend(5) = &H0
arrSend(6) = CByte("&H" & Right(CStr(Hex(arrSend(3) * 256 + 82 + 1)), 2))
arrSend(7) = (arrSend(3) * 256 + 82 + 1 - arrSend(6)) \ 256
MSComm1.RThreshold = 10
MSComm1.Output = arrSend
Else '协议二
arrSendRead(0) = &H80 + Hex(1)
arrSendRead(1) = &H80 + Hex(1)
arrSendRead(2) = &H52
arrSendRead(3) = &HC
MSComm1.RThreshold = 8
MSComm1.Output = arrSendRead
End If
Exit Sub
errhandle:
If Err.Number = 8018 Then
MsgBox "端口已经被其它应用程序打开,系统不能正常运行!", vbOKOnly + vbCritical, "端口错误"
End If
End Sub
Private Sub MSComm1_OnComm()
Dim arrReceive(10) As Byte
Dim lngData As Variant '用来从接收缓冲区读取数据
On Error Resume Next
With MSComm1
Select Case MSComm1.CommEvent
Case comEvReceive
RThreshold = 0 '关闭OnComm事件接收
lngData = .Input '读取一个接收字节
arrReceive(0) = lngData(0)
lngData = .Input
arrReceive(1) = lngData(0)
lngData = .Input
arrReceive(2) = lngData(0)
lngData = .Input
arrReceive(3) = lngData(0)
lngData = .Input
arrReceive(4) = lngData(0)
lngData = .Input
arrReceive(5) = lngData(0)
lngData = .Input
arrReceive(6) = lngData(0)
lngData = .Input
arrReceive(7) = lngData(0)
If strFlag = "1" Then
lngData = .Input
arrReceive(8) = lngData(0)
lngData = .Input
arrReceive(9) = lngData(0)
End If
End Select
End With
End Sub
If Err.Description Then '错误处理
应该改成:If Err.Description <>"" Then '错误处理
因为Err.Description是string型的而不是Boolean型的。
OK,应该就是这样了。