可以选择检查 InBufferCount 属性来确定缓冲区中是否已有需要数目的字符。
如果你的返回值字节数(InBuffCount)>2的话,你读两个字节再接收,可能会出错。而且串口传送数据很快,如果设断点的话,数据容易丢失。
可以这样
dim V1 as Variant
do
If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
doevents
if mscomm1.inbuffcount=2 then
v1=mscomm1.inbuff
buff=buff&v1
else
If MSComm1.PortOpen Then MSComm1.PortOpen = false
end if
until do
如果你的返回值字节数(InBuffCount)>2的话,你读两个字节再接收,可能会出错。而且串口传送数据很快,如果设断点的话,数据容易丢失。
可以这样
dim V1 as Variant
do
If Not MSComm1.PortOpen Then MSComm1.PortOpen = True
doevents
if mscomm1.inbuffcount=2 then
v1=mscomm1.inbuff
buff=buff&v1
else
If MSComm1.PortOpen Then MSComm1.PortOpen = false
end if
until do
On Error GoTo Skip
With FrmInterFace.MSC
If .PortOpen = True Then .PortOpen = False
.CommPort = CommNumber'设置使用的段口号
.InBufferSize = 1024'设置缓冲区
.OutBufferSize = 1024
.InputMode = comInputModeBinary
.InputLen = 1
If .PortOpen = False Then .PortOpen = True
End With
Exit Sub
Skip:
SetOnTop FrmChuShiHua.hwnd, False
MsgBox "端口设置错误", vbCritical, "错误"
End Sub
'波特率在控件里直接设的Private Sub TimJieShou_Timer()'定时器定时查询接收
Dim Temp
Static Msg(1024) As Byte
Static MsgLen As Integer
Dim tMsg() As ByteDim I, Test As Integer
Dim J As Integer
Static MsgStr As String
Dim IntTimeOut
TimJieShou.Enabled = False With MSC
If .InBufferCount = 0 Then GoTo Skip TimLinkOk.Enabled = False
TimLinkOk.Interval = 0
FrmMain.LabStatus.BackColor = vbGreen
FrmMain.LabStatus.Caption = "连接正常"
Do While .InBufferCount <> 0
Temp = .Input
On Error GoTo Skip
Select Case Temp(0)
Case 255
Erase Msg
MsgLen = 0
MsgStr = ""
' Msg(MsgLen) = Temp(0)
' MsgLen = MsgLen + 1
Case 254
' Msg(MsgLen) = Temp(0)
' MsgLen = MsgLen + 1
If MsgLen > 1 Then
ReDim tMsg(MsgLen - 1) As Byte
For J = 0 To MsgLen - 1
tMsg(J) = Msg(J)
Next J
MsgHandle tMsg '调用消息处理函数
End If
MsgLen = 0
Erase Msg
With Form1.List1
.AddItem "<--- " & MsgStr, 0
If .ListCount > 100 Then .RemoveItem 100
End With
MsgStr = ""
Case Else
Msg(MsgLen) = Temp(0)
If Msg(MsgLen) <= 15 Then MsgStr = MsgStr & "0"
MsgStr = MsgStr & Hex(Msg(MsgLen)) & " "
MsgLen = MsgLen + 1
End Select
Loop
End With
' NetInit
Skip:
TimJieShou.Enabled = True
If FrmMain.LabStatus.Caption = "连接中断" Then Exit Sub
TimLinkOk.Enabled = True
TimLinkOk.Interval = 2000
End Sub
'这个是我用串口的一段代码,希望对你有帮助
返回接收缓冲区中等待的字符数。该属性在设计时无效。语法object.InBufferCount[ = value ]InBufferCount 属性的语法包括下列部分:部分 描述
object 对象表达式,其值是“应用于”列表中的对象。
value 整型表达式,说明在接收缓冲区中等待的字符数。
说明InBufferCount 是指调制解调器已接收,并在接收缓冲区等待被取走的字符数。可以把 InBufferCount 属性设置为 0 来清除接收缓冲区。注意 不要把该属性与 InBufferSize 属性混淆。InBufferSize 属性返回整个接收缓冲区的大小。数据类型Integer
注意CommEvent这东西
oncomm事件不光是由输入触发的