一个按钮控件想完成2个嵌套循环,牵扯到time控件,急求高手指点

qiangshou2301 2009-11-12 10:20:04
我想用一个按钮控件与单片机通信,发送单个0xXX协议,但是是要循环的发送数据,大循环里还有个小循环,如下:
大循环:0x66 0x7E 0x67 0x6A 0x6C--0x66 0x7E 0x67 0x6A 0x6C--大循环结束是0x66 0x7E 0x67 0x6A 0x6C 0x67 0x7E 小循环:其中0x66 0x7E 是小循环,即0x66 0x7E ---0x66 0x7E ---
大循环除了最后的0x7E 其他各个0xXX的发送次数,即各个0xXX的工作时间可以设定修改
小循环的0x66和0x7E的工作时间可以设定修改,小循环的循环次数即小循环的工作时间可以设定修改
大循环的时间,即总的工作时间可以设定修改

我现在只能完成小循环的0x66和0x7E的工作时间可以设定修改
代码如下:
Private Sub Timer2_Timer()
Dim buff_out5() As Byte
If Dir("13.txt") <> "" Then
Dim Temp13 As String
Open App.Path & "\13.txt" For Input As #13
Line Input #13, Temp13
Close #13
End If
If Dir("14.txt") <> "" Then
Dim Temp14 As String
Open App.Path & "\14.txt" For Input As #14
Line Input #14, Temp14
Close #14
End If
If m_bytBuffOut5 = &H66 Then
m_bytBuffOut5 = &H7E
Me.Timer2.Interval = Temp14 * 1000
Else
m_bytBuffOut5 = &H16
Me.Timer2.Interval = Temp13 * 1000
End If
ReDim buff_out5(8)
MSComm1.Settings = "9600,N,8,1"
MSComm1.InputLen = 0
buff_out5(0) = &HAA
buff_out5(1) = &HAA
buff_out5(2) = &HFF
buff_out5(3) = &H5
buff_out5(4) = m_bytBuffOut5 '不直接赋值,而从模块级变量得到经过Timer2设置的正确的值
buff_out5(5) = &H0
buff_out5(6) = &H0
buff_out5(7) = &H0
buff_out5(8) = &HFF
MSComm1.Output = buff_out5
End Sub

'定时器对此次微球筛选进行定时
Private Sub Timer3_Timer()
If Now() < m_StopTime Then Exit Sub '增加这个判断,对应command7里的Now
If MSComm1.PortOpen = False Then
Label1.Caption = "您的串口现在是关闭状态,请先打开串口"
Else
Label1.Caption = ""
If Shape5.BackColor = &HFF Then
Shape5.BackColor = &H80FF80
Command7.Caption = "关"
Me.Timer2.Enabled = True '加上这句
If Dir("13.txt") <> "" Then
Dim Temp13 As String
Open App.Path & "\13.txt" For Input As #13
Line Input #13, Temp13
Close #13
End If
Me.Timer2.Interval = Temp13 * 1000
m_bytBuffOut5 = &H66
Else
Shape5.BackColor = &HFF
Command7.Caption = "开"
Me.Timer2.Enabled = False '加上这句
Timer3.Enabled = False
Dim buff_out6() As Byte
Dim lngP6 As String
ReDim buff_out6(8)
MSComm1.Settings = "9600,N,8,1" ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.InputLen = 0 ' 当输入占用时,告诉控件读入整个缓冲区。
buff_out6(0) = &HAA
buff_out6(1) = &HAA
buff_out6(2) = &HFF
buff_out6(3) = &H5
buff_out6(4) = &H7E
buff_out6(5) = &H0
buff_out6(6) = &H0
buff_out6(7) = &H0
buff_out6(8) = &HFF
MSComm1.Output = buff_out6
lngP6 = GetTickCount 'API函数
Do
DoEvents
Loop Until GetTickCount - lngP6 > 100 Or MSComm1.InBufferCount > 10 '当等待时间超过100毫秒或串口接受缓冲区的数据达到10个字节时退出等待循环,这就是一个通信等待的过程。
End If
End If
Timer3.Enabled = False
End Sub

Private Sub Command7_Click()
If MSComm1.PortOpen = False Then
Label1.Caption = "您的串口现在是关闭状态,请先打开串口"
Else
Label1.Caption = ""
If Dir("15.txt") <> "" Then
Dim Temp15 As String
Open App.Path & "\15.txt" For Input As #15
Line Input #15, Temp15
Close #15
End If
Timer3.Interval = 500
m_StopTime = DateAdd("s", Val(Temp15 * 60), Now)
Timer3.Enabled = True
If Shape5.BackColor = &HFF Then
Shape5.BackColor = &H80FF80
Command7.Caption = "关"
Me.Timer2.Enabled = True '加上这句
If Dir("13.txt") <> "" Then
Dim Temp13 As String
Open App.Path & "\13.txt" For Input As #13
Line Input #13, Temp13
Close #13
End If
Me.Timer2.Interval = Temp13 * 1000
m_bytBuffOut5 = &H66
Else
Shape5.BackColor = &HFF
Command7.Caption = "开"
Me.Timer2.Enabled = False '加上这句
Me.Timer3.Enabled = False
Dim buff_out6() As Byte
Dim lngP6 As String
ReDim buff_out6(8)
MSComm1.Settings = "9600,N,8,1" ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
MSComm1.InputLen = 0 ' 当输入占用时,告诉控件读入整个缓冲区。
buff_out6(0) = &HAA
buff_out6(1) = &HAA
buff_out6(2) = &HFF
buff_out6(3) = &H5
buff_out6(4) = &H7E
buff_out6(5) = &H0
buff_out6(6) = &H0
buff_out6(7) = &H0
buff_out6(8) = &HFF
MSComm1.Output = buff_out6
lngP6 = GetTickCount 'API函数
Do
DoEvents
Loop Until GetTickCount - lngP6 > 100 Or MSComm1.InBufferCount > 10 '当等待时间超过100毫秒或串口接受缓冲区的数据达到10个字节时退出等待循环,这就是一个通信等待的过程。
End If
End If
End Sub
...全文
179 28 打赏 收藏 转发到动态 举报
写回复
用AI写文章
28 条回复
切换为时间正序
请发表友善的回复…
发表回复
qiangshou2301 2009-11-16
  • 打赏
  • 举报
回复
有高手在吗?
qiangshou2301 2009-11-15
  • 打赏
  • 举报
回复
貌似不行呢 dingyun兄 其实就是这样的:66 7E 66 7E 66 7E 66 7E.... 67 6A 6C 66 7E 66 7E 66 7E 66 7E ....67 6A 6C 66 7E 66 7E 66 7E 66 7E ......67 6A 6C.....66 7E 66 7E 66 7E 66 7E .....67 6A 6C 67 7E。比如发送66采用
buff_out6(0) = &HAA
buff_out6(1) = &HAA
buff_out6(2) = &HFF
buff_out6(3) = &H5
buff_out6(5) = &H66
buff_out6(6) = &H0
buff_out6(7) = &H0
buff_out6(8) = &HFF
这样的协议。
时间控制的这样的:66 7E分别要控制,66 7E 这个小循环时间需要控制,然后是67 6A 6C分别要控制 整个大循环到 67 7E完成需要控制。
非常感谢dingyun哥了。
qiangshou2301 2009-11-14
  • 打赏
  • 举报
回复
66和7E的小循环呢
zdingyun 2009-11-14
  • 打赏
  • 举报
回复
Option Explicit
Dim buff_out6() As Byte
Private Sub Form_Load()
Timer1.Interval = 1000
MSComm1.PortOpen = True
Timer2.Interval = 10000
ReDim buff_out6(8)
buff_out6(0) = &HAA
buff_out6(1) = &HAA
buff_out6(2) = &HFF
buff_out6(3) = &H5
buff_out6(5) = &H0
buff_out6(6) = &H0
buff_out6(7) = &H0
buff_out6(8) = &HFF
End Sub

Private Sub Timer1_Timer() '小循环
Static xunhuan As Long
xunhuan = xunhuan + 1
If xunhuan = 1 Then
buff_out6(4) = &H66
ElseIf xunhuan = 2 Then
buff_out6(4) = &H7E
ElseIf xunhuan = 3 Then
buff_out6(4) = &H67
ElseIf xunhuan = 4 Then
buff_out6(4) = &H6A
ElseIf xunhuan = 5 Then
buff_out6(4) = &H6C
End If
If xunhuan Mod 5 = 0 Then xunhuan = 0
MSComm1.Output = buff_out6
End Sub

Private Sub Timer2_Timer() '大循环
Static Dxunhuan As Long
Dxunhuan = Dxunhuan + 1
If Dxunhuan = 1 Then
buff_out6(5) = &H1
ElseIf Dxunhuan = 2 Then
buff_out6(5) = &H7E
ElseIf Dxunhuan = 3 Then
buff_out6(5) = &H67
ElseIf Dxunhuan = 4 Then
buff_out6(5) = &H6A
ElseIf Dxunhuan = 5 Then
buff_out6(5) = &H6C
End If
If Dxunhuan Mod 5 = 0 Then Dxunhuan = 0
End Sub
zdingyun 2009-11-14
  • 打赏
  • 举报
回复
修改错误:
Option Explicit
Dim buff_out6() As Byte
Private Sub Form_Load()
Timer1.Interval = 1000
MSComm1.PortOpen = True
End Sub

Private Sub Timer1_Timer()
Static xunhuan As Long
ReDim buff_out6(8)
buff_out6(0) = &HAA
buff_out6(1) = &HAA
buff_out6(2) = &HFF
buff_out6(3) = &H5
buff_out6(5) = &H0
buff_out6(6) = &H0
buff_out6(7) = &H0
buff_out6(8) = &HFF
xunhuan = xunhuan + 1
If xunhuan = 1 Then
buff_out6(4) = &H66
ElseIf xunhuan = 2 Then
buff_out6(4) = &H7E
ElseIf xunhuan = 3 Then
buff_out6(4) = &H67
ElseIf xunhuan = 4 Then
buff_out6(4) = &H6A
ElseIf xunhuan = 5 Then
buff_out6(4) = &H6C
End If
If xunhuan Mod 5 = 0 Then xunhuan = 0
MSComm1.Output = buff_out6
End Sub
zdingyun 2009-11-14
  • 打赏
  • 举报
回复
按16楼的小循环代码:
Option Explicit
Dim buff_out6() As Byte
Private Sub Form_Load()
Timer1.Interval = 1000
MSComm1.PortOpen = True
End Sub

Private Sub Timer1_Timer()
Static xunhuan As Long
ReDim buff_out6(8)
buff_out6(0) = &HAA
buff_out6(1) = &HAA
buff_out6(2) = &HFF
buff_out6(3) = &H5
buff_out6(5) = &H0
buff_out6(6) = &H0
buff_out6(7) = &H0
buff_out6(8) = &HFF
If xunhuan = 0 Then
buff_out6(4) = &H66
ElseIf xunhuan = 1 Then
buff_out6(4) = &H7E
ElseIf xunhuan = 2 Then
buff_out6(4) = &H67
ElseIf xunhuan = 3 Then
buff_out6(4) = &H6A
ElseIf xunhuan = 4 Then
buff_out6(4) = &H6C
End If
MSComm1.Output = buff_out6
xunhuan = xunhuan + 1
End Sub
zdingyun 2009-11-14
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 qiangshou2301 的回复:]
dingyun哥在吗
[/Quote]
你在16楼描述的与问贴处描述的不一致.
qiangshou2301 2009-11-14
  • 打赏
  • 举报
回复
dingyun哥在吗
贝隆 2009-11-13
  • 打赏
  • 举报
回复
研究研究。。。。
舉杯邀明月 2009-11-13
  • 打赏
  • 举报
回复
楼主的代码看起来晕..............
qiangshou2301 2009-11-13
  • 打赏
  • 举报
回复
上面可能会误解,看这里:
现在是想:发送0x66、接着发送0x7E、接着发送0x67 、接着发送0x6A、接着发送0x6C--发送0x66、接着发送0x7E、接着发送0x67 、接着发送0x6A、接着发送0x6C这样的一个大循环--大循环结束是0x66 0x7E 0x67 0x6A 0x6C 0x67 0x7E
里面还有个小循环,即发送0x66、接着发送0x7E-----发送0x66、接着发送0x7E--发送0x66、接着发送0x7E
总之,即:送0x66、接着发送0x7E、发送0x66、接着发送0x7E、发送0x66、接着发送0x7E.....然后发送0x67 、然后发送0x6A、然后发送0x6C.......发送0x66、接着发送0x7E、发送0x66、接着发送0x7E、发送0x66、接着发送0x7E.....然后发送0x67 、然后发送0x6A、然后发送0x6C.....大循环快结束发送得多2组协议,即最后一次是0x66、0x7E、0x67、0x6A、0x6C、0x67、0x7E

大循环除了最后的0x7E 其他各个0xXX的发送次数,即发送各个0xXX的工作时间可以设定修改
小循环分别发送0x66与0x7E的个数即工作时间可以设定修改,小循环的能循环多少次数即小循环的工作时间可以设定修改
大循环的时间,即总的工作时间可以设定修改,到了总的时间就不发送任何数据了。
qiangshou2301 2009-11-13
  • 打赏
  • 举报
回复
dingyun兄 好久不见 最近修改下东西 这个地方卡住了 就是往下位机发送数据 如:发送0x66,采用的是
buff_out6(0) = &HAA
buff_out6(1) = &HAA
buff_out6(2) = &HFF
buff_out6(3) = &H5
buff_out6(4) = &H66
buff_out6(5) = &H0
buff_out6(6) = &H0
buff_out6(7) = &H0
buff_out6(8) = &HFF
MSComm1.Output = buff_out6

这样一个协议
现在是想发送0x66、接着发送0x7E、接着发送0x67 、接着发送0x6A、接着发送0x6C--发送0x66、接着发送0x7E、接着发送0x67 、接着发送0x6A、接着发送0x6C这样的一个大循环--大循环结束是[color=#008000]0x66 0x7E 0x67 0x6A 0x6C 0x67 0x7E[/color]
里面还有个小循环,即发送0x66、接着发送0x7E-----发送0x66、接着发送0x7E--发送0x66、接着发送0x7E
总之,,即:发送0x66、接着发送0x7E、发送0x66、接着发送0x7E、发送0x66、接着发送0x7E.....然后发送0x67 、然后发送0x6A、然后发送0x6C.......发送0x66、接着发送0x7E、发送0x66、接着发送0x7E、发送0x66、接着发送0x7E.....然后发送0x67 、然后发送0x6A、然后发送0x6C.....大循环快结束发送得多2组协议,即最后一次是0x66、0x7E、0x67、0x6A、0x6C、0x67、0x7E
zdingyun 2009-11-13
  • 打赏
  • 举报
回复
LZ:你问贴的文字说明没说清楚.
qiangshou2301 2009-11-13
  • 打赏
  • 举报
回复
高手在吗 可以不按照我的代码思路
qiangshou2301 2009-11-13
  • 打赏
  • 举报
回复
不用按照我这个代码 比较乱 就是完成完成小循环的0x66和0x7E的工作时间的设定与修改
qiangshou2301 2009-11-13
  • 打赏
  • 举报
回复
还是没有看明白
chillystar 2009-11-13
  • 打赏
  • 举报
回复
将小循环放到一个timer控件中,timer时间间隔为100毫秒(可以设更小,但要注意运行一次所需时间不要超过最小值,设置4个局部参数,要在timer事件外:
rpTimer=99 需要重复发送所需的步长,实际是99*100毫秒,可自己调整
isRun=false 在本时间段是否执行
nowTimer=0 现在的步长

timer的事件代码:
if isRun=false then
isRun=True
if nowTimer=rpTimer then
nowTimer=0
'这里之后写你要发送的代码
else
nowTimer=nowTimer+1
end if
isRun=false
end if
调整时间的方法有2点:1是调整timer的时间间隔(调整到最小的适用范围就好),2是调整rpTimer的步长。
qiangshou2301 2009-11-13
  • 打赏
  • 举报
回复
自己顶下
qiangshou2301 2009-11-13
  • 打赏
  • 举报
回复
等待啊 弄不出来 郁闷
qiangshou2301 2009-11-13
  • 打赏
  • 举报
回复
对,还是那个,现在需要改进,要做这样子的循环嵌套,通信协议还是这样的:
&HAA &HAA &HFF &H5 &HXX &H0 &H0 &H0 校验和(或&HFF)
下面是一个发送0x66的例子:
           buff_out6(0) = &HAA
buff_out6(1) = &HAA
buff_out6(2) = &HFF
buff_out6(3) = &H5
buff_out6(4) = &H66
buff_out6(5) = &H0
buff_out6(6) = &H0
buff_out6(7) = &H0
buff_out6(8) = &HFF
MSComm1.Output = buff_out6
加载更多回复(8)

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧