环境: 一个串口管理多个设备,每一个设备都单独有一个‘机号’
数据格式:1、首先选择机号,发送控制码过去,但是此处不返回数据
2、然后发送返回数据的控制码,返回固定格式的数据(长度为10个字节)
要求:如何循环取出每一个设备的数据,用循环好,还是时间控件好
这是我做的程序(桌面上有2个按钮,“开始巡检“,“停止巡检“)
'------------------------------------------------------------------------------------
'基础设置
'------------------------------------------------------------------------------------
MSComm1.Settings = "9600,e,8,1"
MSComm1.RThreshold = 10 '设置接收10个字节就产生OnComm事件
MSComm1.InputLen = 0 '一次从缓冲区接受所有字节
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.InputMode = comInputModeBinary '设置接受数据的类型是二进制类型数据
MSComm1.PortOpen = True '---------------------------------------------------------------------------
'“开始巡检“程序如下
'---------------------------------------------------------------------------
Private Sub Command1_Click()
Dim senddata5(1 To 6) As Byte
ls_xj = "开始巡检" '此处设置为死循环,什么时候,点击了“停止巡检”按钮,则退出巡检
Do While 2 > 1
'选择机号 1
If ls_xj = "停止巡检" Then
Exit Sub
else
'选择机号
senddata5(1) = &HFE
senddata5(2) = &HFD
senddata5(3) = &H01
senddata5(4) = &HFE
senddata5(5) = &HFD
senddata5(6) =&H01
MSComm1.Output = senddata5 MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
'返回当前机号 的数据
Dim senddate7(1 To 6) As Byte
senddate7(1) = &HFC
senddate7(2) = &HFC
senddate7(3) = &HFC
senddate7(4) = &H34
senddate7(5) = &H1
senddate7(6) = &H35
MSComm1.Output = senddate7
ls_dd="开始等待"
zcx_dd '子程序_等待
End If
'选择机号 1
........
........
'选择机号4
..... DoEvents
Loop
End Sub'---------------------------------------------------------------------------
'“停止巡检“程序如下
'---------------------------------------------------------------------------
Private Sub Command1_Click()
ls_xj = "停止巡检"
ls_dd= "停止等待"
End Sub'------------------------------------------------------------------------
'子程序_等待
'------------------------------------------------------------------------
Public Sub zcx_dd()
Do While ls_dd = "开始等待"
DoEvents
Loop
End Sub
'-------------------------------------------------------------------------
'接收数据缓冲区满10个字节,便激活此程序
'-------------------------------------------------------------------------
Private Sub MSComm1_OnComm()
'此处为接收到数据后的处理,略过
' ls_dd = "停止等待"
End Sub
'*************************************************************
'程序有时候正常工作,但是有时候经常进入zcx_dd() 死循环,不知道为何?
'是否返回的过程中,丢失数据(这样的话,就不激活mscomm的OnComm事件了,那么ls_dd 就不会变化,那么就“子程序_等待”死循环了)'我想问下,这种方法合理吗,如果改的话怎么改, 用什么方法更好?怎么实现?
数据格式:1、首先选择机号,发送控制码过去,但是此处不返回数据
2、然后发送返回数据的控制码,返回固定格式的数据(长度为10个字节)
要求:如何循环取出每一个设备的数据,用循环好,还是时间控件好
这是我做的程序(桌面上有2个按钮,“开始巡检“,“停止巡检“)
'------------------------------------------------------------------------------------
'基础设置
'------------------------------------------------------------------------------------
MSComm1.Settings = "9600,e,8,1"
MSComm1.RThreshold = 10 '设置接收10个字节就产生OnComm事件
MSComm1.InputLen = 0 '一次从缓冲区接受所有字节
MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
MSComm1.InputMode = comInputModeBinary '设置接受数据的类型是二进制类型数据
MSComm1.PortOpen = True '---------------------------------------------------------------------------
'“开始巡检“程序如下
'---------------------------------------------------------------------------
Private Sub Command1_Click()
Dim senddata5(1 To 6) As Byte
ls_xj = "开始巡检" '此处设置为死循环,什么时候,点击了“停止巡检”按钮,则退出巡检
Do While 2 > 1
'选择机号 1
If ls_xj = "停止巡检" Then
Exit Sub
else
'选择机号
senddata5(1) = &HFE
senddata5(2) = &HFD
senddata5(3) = &H01
senddata5(4) = &HFE
senddata5(5) = &HFD
senddata5(6) =&H01
MSComm1.Output = senddata5 MSComm1.OutBufferCount = 0 '清空发送缓冲区
MSComm1.InBufferCount = 0 '清空接收缓冲区
'返回当前机号 的数据
Dim senddate7(1 To 6) As Byte
senddate7(1) = &HFC
senddate7(2) = &HFC
senddate7(3) = &HFC
senddate7(4) = &H34
senddate7(5) = &H1
senddate7(6) = &H35
MSComm1.Output = senddate7
ls_dd="开始等待"
zcx_dd '子程序_等待
End If
'选择机号 1
........
........
'选择机号4
..... DoEvents
Loop
End Sub'---------------------------------------------------------------------------
'“停止巡检“程序如下
'---------------------------------------------------------------------------
Private Sub Command1_Click()
ls_xj = "停止巡检"
ls_dd= "停止等待"
End Sub'------------------------------------------------------------------------
'子程序_等待
'------------------------------------------------------------------------
Public Sub zcx_dd()
Do While ls_dd = "开始等待"
DoEvents
Loop
End Sub
'-------------------------------------------------------------------------
'接收数据缓冲区满10个字节,便激活此程序
'-------------------------------------------------------------------------
Private Sub MSComm1_OnComm()
'此处为接收到数据后的处理,略过
' ls_dd = "停止等待"
End Sub
'*************************************************************
'程序有时候正常工作,但是有时候经常进入zcx_dd() 死循环,不知道为何?
'是否返回的过程中,丢失数据(这样的话,就不激活mscomm的OnComm事件了,那么ls_dd 就不会变化,那么就“子程序_等待”死循环了)'我想问下,这种方法合理吗,如果改的话怎么改, 用什么方法更好?怎么实现?
do while 数据有返回
next下一个设备
loop