我用MSComm控件做通信问题。现在我循环往输出缓冲区发命令,应该发一条命令就会有相应的处理事件从输入缓冲区中返回,但是由于我是用For循环发命令,第一条刚发完,即MSComm1.Output = putbyte,没等这个命令触发OnComm事件呢,就进入了循环的下一条命令,即next i 。以至于输入缓冲区里的返回事件都乱了套,我怎么样处理呢?
...全文
31331打赏收藏
MSComm控件的缓冲区问题
我用MSComm控件做通信问题。现在我循环往输出缓冲区发命令,应该发一条命令就会有相应的处理事件从输入缓冲区中返回,但是由于我是用For循环发命令,第一条刚发完,即MSComm1.Output = putbyte,没等这个命令触发OnComm事件呢,就进入了循环的下一条命令,即next i 。以至于输入缓冲区里的返回事件都乱了套,我怎么样处理呢?
'这是延迟程序
Private Sub delay(ii As Integer) '时间延迟,以毫秒为单位
Dim strtemp() As Byte
Dim tt As Long
tt = GetTickCount()
Do
DoEvents
If mscomm1.inbuffercount>0 Then
strtemp = MSComm1.Input '
RefreshDisplay strtemp '显示接收事件
End If
'我觉得问题出在这里,这个循环是很快的,一开始串口没有数据接收到,STRTEMP就总是被赋空值
Loop Until GetTickCount - tt > ii
End Sub
你是在延时的10毫秒内接收,我觉得这样不大好,(只是感觉,如果用起来没问题就OK了)
Private Sub CmdSub_Click()
If MSComm1.PortOpen = False Then
MsgBox ("未打开串口")
Exit Sub
End If
port = SubBlue.MSComm1.CommPort '记录从设备所用的串口号
'从设备初始化Reset和Write_Scan_Enable指令
Dim strt As String
Dim i As Integer, putlen As Integer
'开发包的初始化
tran_buffer(0) = "01 03 0c 00"
tran_buffer(1) = "01 05 10 00"
tran_buffer(2) = "01 05 0C 01 00"
tran_buffer(3) = "01 1A 0C 01 03"
tran_buffer(4) = "01 20 0C 01 00"
tran_buffer(5) = "01 26 0c 02 60 00"
tran_buffer(6) = "01 05 0C 03 02 00 02"
tran_buffer(7) = "01 16 0C 02 00 20"
tran_buffer(8) = "01 18 0C 02 00 30"
tran_buffer(9) = "01 07 FC 01 03"
tran_buffer(10) = "01 09 10 00"
Dim strtemp() As Byte
Dim j As Integer, a As Integer
For j = 0 To 10
strt = Trim(tran_buffer(j))
putlen = Len(strt)
Call cancelblank(strt, putlen)
Call char2hex(strt, putbyte()) '转化为十六进制数
SubBlue.MSComm1.Output = putbyte
delay (10) '延迟
Next j
CmdSub.Enabled = False
CmdMain.Enabled = True
End Sub
'这是延迟程序
Private Sub delay(ii As Integer) '时间延迟,以毫秒为单位
Dim strtemp() As Byte
Dim tt As Long
tt = GetTickCount()
Do
DoEvents
strtemp = MSComm1.Input
RefreshDisplay strtemp '显示接收事件
Loop Until GetTickCount - tt > ii
End Sub
'这是那个显示程序RefreshDisplay
Private Sub RefreshDisplay(buf() As Byte)
Dim i As Integer
Dim hex_str As String
For i = LBound(buf) To UBound(buf)
If (buf(i) >= 10 And buf(i) <= 15) Then
hex_str = "0" + Format(Hex(buf(i)), "0")
Else
hex_str = Format(Hex(buf(i)), "00")
End If
initial_text.Text = initial_text.Text + hex_str + " " + Chr(13)
Next i
If i = 8 Then
initial_text.Text = initial_text.Text + " " + Chr(13) + Chr(10)
Else
initial_text.Text = initial_text.Text + Chr(13) + Chr(10)
End If