| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 423 人关注过本帖
标题:循环延时问题
只看楼主 加入收藏
本帖由 apull 于 2022-7-16 17:00 移动
aabb7711
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-9-20
收藏
 问题点数:0 回复次数:9 
循环延时问题
请求老师帮忙:
需要延时循环给串口发送16进制字符串,先发送1A A9 8C 22 D5 1B 6A 55 3F 2D 0D 2A 延时800MS再发送1F 29 88 3D 6A 22 2B 1C 3E 延时800MS后再发送1A A9 8C 22 D5 1B 6A 55 3F 2D 0D 2A一直循环。
Private Sub Timer1_Timer()
If MSComm1.PortOpen = False Then MSComm1.PortOpen = True
If MSComm1.PortOpen = False Then
MsgBox "选取的COM端口无效或被占用,请关闭软件重选!"
End If
 Dim Data(11) As Byte
 Data(0) = &H1A
 Data(1) = &HA9
 Data(2) = &H8C
Data(3) = &H22
 Data(4) = &D5
 Data(5) = &H1B
Data(6) = &H6A
 Data(7) = &H55
 Data(8) = &H3F
Data(9) = &H2D
 Data(10) = &H0D
 Data(11) = &H2A
MSComm1.Output = Data
End Sub
interval  设置小于1000就无效了,这2段字符循环发送要怎么实现?谢谢老师!
搜索更多相关主题的帖子: Data 循环 发送 If 延时 
2022-07-16 00:15
apull
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:三体星系
等 级:版主
威 望:133
帖 子:1203
专家分:7155
注 册:2010-3-16
收藏
得分:0 
串口发送时间间隔不要太快了,发送,应答都需要时间的。

程序代码:

Dim cnt As Integer

Private Sub Form_Load()
    cnt = 1
    Timer1.Interval = 800
    Timer1.Enabled = True
End Sub

Private Sub Timer1_Timer()
    s1 = "data1"
    s2 = "data2"
    If cnt = 1 Then
        Debug.Print s1
        cnt = cnt + 1
    Else
        Debug.Print s2
        cnt = 1
    End If
End Sub


[此贴子已经被作者于2022-7-16 17:11编辑过]

2022-07-16 17:10
约定的童话
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:37
帖 子:139
专家分:873
注 册:2021-8-1
收藏
得分:0 
Public Sub Delay(HowLong As Date)    '延时程序
    TempTime = DateAdd("s", HowLong, Now)
    While TempTime > Now
        DoEvents    '控制权交给windows
    Wend
End Sub
延时: Delay 0.8
2022-07-16 17:54
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:29
帖 子:1519
专家分:2337
注 册:2009-12-22
收藏
得分:0 
单片机都是用这个函数

程序代码:
Private Sub Delay(ByVal Sec As Single) '延迟毫秒
    Dim sgnThisTime As Single, sgnCount As Single
    Sec = Sec / 1000
    sgnThisTime = Timer
    Do While sgnCount < Sec
        sgnCount = Timer - sgnThisTime
        DoEvents
    Loop
End Sub

心生万象,万象皆程序!
2022-07-16 21:46
aabb7711
Rank: 1
等 级:新手上路
帖 子:11
专家分:0
注 册:2007-9-20
收藏
得分:0 
感谢各位热心的老师,我之前没有描述清楚,我实际是要模拟延时循环发送以下字符串,他们的间隔时间812、889、827、973、843、889、827、904,我们取个中间值循环发送这2组16进制字符。烦请帮看看怎么写代码?谢谢!

【2022-07-15 20:49:10:143】3E 5A 6F 05 63 35 94 BC 2D BA F5 EF C3 B3 7C 54 95 96 66 C5 07 98 C5 80 71 C1 B9 5E 7C 84 02 CB 46 60 27 9E 81 55 F0        
【2022-07-15 20:49:10:955】3E 6A 75 7E 08 1E FB 78 12 15 DE        
【2022-07-15 20:49:11:844】3E 5A 6F 05 63 35 94 BC 2D BA F5 EF C3 B3 7C 54 95 96 66 C5 07 98 C5 80 71 C1 B9 5E 7C 84 02 CB 46 60 27 9E 81 55 F0        
【2022-07-15 20:49:12:671】3E 6A 75 7E 08 1E FB 78 12 15 DE        
【2022-07-15 20:49:13:544】3E 5A 6F 05 63 35 94 BC 2D BA F5 EF C3 B3 7C 54 95 96 66 C5 07 98 C5 80 71 C1 B9 5E 7C 84 02 CB 46 60 27 9E 81 55 F0        
【2022-07-15 20:49:14:387】3E 6A 75 7E 08 1E FB 78 12 15 DE        
【2022-07-15 20:49:15:276】3E 5A 6F 05 63 35 94 BC 2D BA F5 EF C3 B3 7C 54 95 96 66 C5 07 98 C5 80 71 C1 B9 5E 7C 84 02 CB 46 60 27 9E 81 55 F0        
【2022-07-15 20:49:16:103】3E 6A 75 7E 08 1E FB 78 12 15 DE        
【2022-07-15 20:49:17:007】3E 5A 6F 05 63 35 94 BC 2D BA F5 EF C3 B3 7C 54 95 96 66 C5 07 98 C5 80 71 C1 B9 5E 7C 84 02 CB 46 60 27 9E 81 55 F0        

2022-07-17 00:51
yuma
Rank: 11Rank: 11Rank: 11Rank: 11
来 自:银河系
等 级:贵宾
威 望:29
帖 子:1519
专家分:2337
注 册:2009-12-22
收藏
得分:0 
do....loop

心生万象,万象皆程序!
2022-07-17 07:27
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:340
帖 子:4800
专家分:29613
注 册:2008-10-15
收藏
得分:0 
三种方案
一、单任务模式
创建任务后,使用 楼上的 Delay 延时,然后发送。在这过程中,无法继续创建新任务,或者说创建新任务导致发送队列混乱。
这种时间精确度稍高一些

二、定时发送模式
创建一个发送队列,可以使用一个结构体数组来。如,包括下面三个元素
数据()   as byte
延时  as long
开始时间 as date
定义一个定时器,可以使用VB6自带的定时器(误差比较大),也可以使用API提供的高精度定时器(精度非常高)
如果使用VB6自带定时器,精度约50ms,每次根据当时时间与开始时间计算,是否达到了延时。
达到,发送数据,没达到,继续等待下一个定时器响应。 也许可以开始任务时修改定时器 定时时间,需要测试哪种精度更高一些。
发送数据后,把数组元素依次向前移一位,最后一个元素清空。
优点,任务是压入定时器任务中,任务可以继续再创建任务,时间到了后台就自动发出。

三、多线程定时发送
子线程,只负责发送数据。数据结构定义为上面。
为了数据安全,需要使用临界。
子线程:记录循环开始时间,取任务
计算时间,达到,发数据。取时间,任务数组移动数据,再取时间,计算下次任务时间,休眠线程指定时间,重新循环。
未达到,再次取时间,计算剩余多少毫秒,线程休眠指定的时间,重新循环。
优点:任务也是压入数组中,不影响前台继续再创建任务。仔细计算和校正后时间,精度非常高。
计算和校正时间,就是把子线程的循环里计算休眠的过程在程序初始化过程中,计算一下耗时,校正休眠时间。

---------------
初学者和任务简单,建议一
进阶版, 建议二
资深,建议三

方案三,需要参考VB6 多线程技术,百度有。


[此贴子已经被作者于2022-7-17 12:49编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
2022-07-17 12:32
cwa9958
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:49
帖 子:204
专家分:1121
注 册:2006-6-25
收藏
得分:0 
Private Sub Timer1_Timer()
    Static Flg As Boolean
    Flg = Not Flg
    If Flg Then
        MSComm1.Output = Dat1
      Else
        MSComm1.Output = Dat2
    End If
   
End Sub
2022-07-20 09:33
wds1
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:45
帖 子:374
专家分:1931
注 册:2016-3-10
收藏
得分:0 
如果是单片机模拟延时,你要查询nop,mov等指令的执行时间格式多少us,之后编写循环代码。

[此贴子已经被作者于2022-7-20 16:52编辑过]

2022-07-20 16:49
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:340
帖 子:4800
专家分:29613
注 册:2008-10-15
收藏
得分:0 
单片机模拟,也要分 单任务 和多任务
如同时显示,这边同时发送数据。
那就要用中断,大体上按方案二去设计,需要看你显示部分、键盘部分是怎设计的

授人于鱼,不如授人于渔
早已停用QQ了
2022-07-23 23:20
快速回复:循环延时问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.059874 second(s), 9 queries.
Copyright©2004-2022, BCCN.NET, All Rights Reserved