搜索
bottom↓
回复: 5

关于Delphi中的定时问题?请问在Delphi中怎样实现精确定时?【恢复】

[复制链接]

出0入0汤圆

发表于 2008-10-30 10:57:00 | 显示全部楼层 |阅读模式
最近在调一个用Delphi写的程序,程序主要功能是发命令到设备(设备是单片机控制的一个小玩意),设备收到以后并验证通过后作出相应动作并返回命令,程序收到命令后作出提示。发命令给设备是通过串口发的。

现在有个问题是,电脑速度快,设备返回速度慢,如果发完命令立刻去读返回时,会超时。我现在做的是在发完命令后,先延时一段时间在去读返回,这样可以成功。但是,换个电脑快的就不行了。都是超时,如果是速度慢的会等很长时间。

想问一下,在去读返回时,可不可以加入精确定时几秒钟。这个定时不会因为电脑的速度快慢而发生大的改变?

可以吗,望知道的朋友,指点一下了!

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入8汤圆

发表于 2008-12-25 13:07:09 | 显示全部楼层
用定时器不行吗?

出0入0汤圆

发表于 2008-12-25 11:52:21 | 显示全部楼层
我以前做过的一个办法是用一段汇编来延迟,延迟常数根据系统时钟来校准;分辩率可以达到微秒(如果去除系统中断的影响).当时是为了I2C驱动.

出0入0汤圆

 楼主| 发表于 2008-10-30 11:46:30 | 显示全部楼层
采用第二种方法不错,通过获取系统时间,然后比较系统时间,比较其差值不错。经过简单测试,可行。我还需要再测测看,怎样获取系统时间的方法已经找到,现将网址和原文贴过来:http://www.xici.net/b2411/d1289733.htm





在开发应用程序时往往需要获取当前系统时间。尽管Y2K似乎已经平安过去,但在我们新开发的应用程序中还是要谨慎处理“时间”问题。 

  在《融会贯通--Delphi4.0实战技巧》(以下简称“该书”)第89页专门介绍了两种获取当前系统时间的方法,但这两种方法都存在不足或错误,以下就此进行讨论。 



  该书第一种方法是利用Time()函数获得当前系统时间,返回结果是TDateTime结构类型的变量。例如: 



  procedure TForm1.Button2Click(Sender: TObject); 



  var 



  DateTime:TDateTime; 



  begin 



  DateTime:=Time(); 



  Caption:=DateToStr(DateTime)+' '+TimeToStr(DateTime); 



  end; 



  但不论何日期,其结果却都是99-12-30 xx:xx:xx, 显然日期出错了。通过分析Delphi的帮助,Time()用于返回正确的“时间--时分秒”即TimeToStr(DateTime),而不应该用于返回“日期”。事实上,单独用于返回日期的系统函数是Date。 



  那么有什么是既可返回正确的“时分秒”又可返回正确的“年月日”呢? 可以用Now函数,例如: 



  procedure TForm1.Button1Click(Sender: TObject); 



  var 



  mytime: TDateTime; 



  begin 



  mytime:=Now; 



  Caption:=DateToStr(mytime)+' '+TimeToStr(mytime); 



  //或直接用 Caption := DateTimeToStr(Now); 



  end; 



  用Now返回的日期格式中年只有2位,即2000年显示为00, 这似乎不太令人满意. 此外Now和Time都只能获得精确到秒的时间,为了得到更精确的毫秒级时间,可以使用API函数GetSystemTime,它对应的TSystemTime类型的定义为: 



  TSystemTime = record 



  wYear: Word; 



  wMonth: Word; 



  wDayOfWeek: Word; 



  wDay: Word; 



  wHour: Word; 



  wMinute: Word; 



  wSecond: Word; 



  wMilliseconds: Word; 



  end; 



  显然,在程序逻辑中还能够方便地使用其结构成?时---各类时间值,因此使用函数GetSystemTime具有很大优越性。但该书中该函数的用法是错误的,通过查阅Windows SDK帮助可知,该函数原型为: 



  VOID GetSystemTime(LPSYSTEMTIME lpst),参数指针lpst获取系统时间,因此可如以下程序段实现: 



  procedure TForm1.Button3Click(Sender: TObject); 



  var 



  SysTime: TsystemTime; 



  begin 



  GetSystemTime(SysTime); 



  Caption:=IntToStr(SysTime.wYear)+' '+IntToStr(SysTime.wMonth); 



  //if SysTime.wYear>2000 then 



  // ......在程序逻辑中利用获取的各类时间值 



  end; 



  综合以上讨论,获取当前系统时间利用函数GetSystemTime比较方便而且灵活。 

出0入0汤圆

 楼主| 发表于 2008-10-30 11:25:54 | 显示全部楼层
读串口调用的是动态库,动态库内部读串口一次只读一个字节,当读完一个完整的数据包时返回。如果读不到固定的包头,就一直循环读,当超过一定次数时,返回超时。如果读到包头,那么要在设定的循环次数内读到完整的数据包,要不然也返回超时。

我想可不可以,在读之前加入精确定时或者是读之前一直获取系统时间,比较出一个固定的差值后,再去读串口?

那么在Delphi中怎样获取系统时间,与比较系统时间呢?

出0入0汤圆

发表于 2008-10-30 11:00:55 | 显示全部楼层
一般是发送完成后进入等待,等待中通过GETTICCOUNT比较延迟时间,超过没有回应认为失败了
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-5-20 18:41

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表