我的程序在执行读串口操作时,如果没有读到数据,它就在停留在以下语句上,执行不下去,整个程序就死了。
flag:=readfile(Hcomm,Re,1,nsend,nil); {读串口操作}
好象听说可以设置某个参数,让它等待一段时间,如果读不到数据也往下执行别的语句。
请问一下这个参数是在哪里设置,怎么设置的?谢谢

解决方案 »

  1.   

    UP
    关注能不能
    if not readfile(Hcomm,Re,1,nsend,nil) then
      

  2.   

    to:mrtxc(阿春) 
    这样好象不行,因为程序一执行该语句如果读不到数据就死了,没法执行下去!!
      

  3.   

    try 
    except 
    没遇到过
    你的什么控件
    ???
      

  4.   

    没有用控件,我是直接用API做的。
      

  5.   

    1 串口有设置超时的API
    2 这样的读取方式在Win9X中可以,在Win2K/XP/NT下不行
    3 建议使用SPCOMM控件,或参考其源代码
      

  6.   

    have a try:
      Application.ProcessMessage;
      

  7.   

    用一TIMER控件随时监测串口,没有数据就强行退出
      

  8.   

    用控件多好:http://218.56.11.178:8020/web/technology.aspx-》串口通讯应用程序的解决方案
      

  9.   

    哈,终于找到了!
    setcommtimeouts
      

  10.   

    procedure TalSPComm._SetCommTimeout;
    var
       commtimeouts:   TCommTimeouts;
    begin
         GetCommTimeouts( hCommFile, commtimeouts );     // The CommTimeout numbers will very likely change if you are
         // coding to meet some kind of specification where
         // you need to reply within a certain amount of time after
         // recieving the last byte.  However,  If 1/4th of a second
         // goes by between recieving two characters, its a good
         // indication that the transmitting end has finished, even
         // assuming a 1200 baud modem.     commtimeouts.ReadIntervalTimeout         := FReadIntervalTimeout;
         commtimeouts.ReadTotalTimeoutMultiplier  := FReadTotalTimeoutMultiplier;
         commtimeouts.ReadTotalTimeoutConstant    := FReadTotalTimeoutConstant;
         commtimeouts.WriteTotalTimeoutMultiplier := FWriteTotalTimeoutMultiplier;
         commtimeouts.WriteTotalTimeoutConstant   := FWriteTotalTimeoutConstant;     SetCommTimeouts( hCommFile, commtimeouts );
    end;
      

  11.   

    我采用了控件,但是不能读取串口数据怎么回事呀.
    代码是这样的
    procedure Tfcomm.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
      i:integer;
    begin
      viewstring:= '';
      move(buffer^,@rbuf^,BufferLength);  //这句出错信息是 pointer type required
      for i:=1 to bufferlength do
        viewstring:=viewstring+ inttohex(rbuf[i],2)+'';
      viewstring:='接收'+ viewstring;
      memo1.lines.add(viewstring);
    end;
      

  12.   

    用Application.ProcessMessages;
    Ti:TDateTime;
      Ti:=Now;
      while ( (not flag) and ((Now-Ti)< ( 1 /(24*60*60)) ))  do //等待1秒
      begin
        flag:=readfile(Hcomm,Re,1,nsend,nil); 
        Application.ProcessMessages;  //处理缓冲区数据
      end;
      

  13.   

    to scsdljb(阿罗)你可以将readintervaltimeout的值
      

  14.   


     
    delphi中常用串口控件简介:
    mscomm:微软的东西,是VB中带的一个ActiveX控件,使用简单,性能一般,由于是ActivX控件,打包时需要注册好多信息,在Delphi中使用,建议使用VCL控件,编译程序时直接编入程序中,再不需任何其它处理。
    spcomm:比较好的vcl控件,算是比较专业的,解剖了一下,功能比较完善。
    TurboPower:公认的专业通讯vcl控件。可以到其站点下载,开放源码了。
    我在制作串口通讯软件时三种都用过,最终全部使用TurboPower!所以也推荐大家使用它。
    写了个例子,基本的串口通讯都可以实现,可提供参考:
    下载基地-》文件名称:串口通讯控制器
    版权声明:以下本文只允许在本站观看,不得以任何媒体方式进行传播。
    发表意见请到留言版。TurboPower串口通讯实际应用:
    在串口通讯时有字符和十六进制两种数据传输方式,不论使用哪种方式,只要能正确收到数据就是目的,至于收到数据后如何处理,就要根据具体的情况来定了。1.接收数据的方法:
    轮询和中断(利用windows消息激发事件)。
    1)轮询:每间隔一定的时间查询一下串口接收缓存中有无数据,有就读出来。这种方法是很毫资源的,即没事找事。
    2)中断:在控件中有OnTrigger事件,当串口收到数据后,即触发此事件,无数据时什么都不做,在这个事件中接收数据就比较科学了。
    所以,提倡使用控件中的OnTrigger事件接收数据。2.通讯协议的制定:
    接收数据的一般处理方法,最基本的思路就是通过协议进行分析,所以协议的制定是至关重要的:
    1)首先要确定指令的起始点,从大量的数据流中将指令分离出来,没有起始标志的话,结果就可想而知了,一串无效的费数据!
    2)然后就是指令结束识别点,可以利用指令的长度(如果长度一定或有表示长度的数据)或结束标志来确定,当然还可以利用下一条指令的指令头。
    3)既然头尾都明确了,指令的截取想来不是什么问题了吧!但还有一种情况就是数据错误是的容错,如何容错呢,最简单的办法:发现不符合格式的指令,就将其抛掉或特殊处理(如要求重发)一下!
    4)有效数据中如果增加一些校验,通讯将会更加可靠!
    例:#(指令头)**(指令功能)0123456789(有效数据)**(有效数据校验和)%(指令尾)
    注:**代表变动值。3.接收数据的分析技巧:
    通讯协议制定好后,一切将以通讯协议为中心。一套协议中的所有指令可能长度都是统一的,也有可能是长短不同的,并且在OnTrigger事件中实际反应速度及快,可能一条指令数据还没有完全收齐就已经触发了此事件,即收到了半截指令,并且有可能继续收取的数据中除了下半截指令外,还有下一条指令的前半截,如何处理?
    我在做这种处理时是利用全局变量,将串口收到的所有数据都收到该串中,然后按指令格式进行截取,发现不合法指令做一下特殊处理(如要求重发)或抛弃。
    如收到的数据串为:
    #**0000012000**%#**0000000343#**000000540560**%#**0002200000**%
    分段截为:
    #**0000012000**%
    #**0000000343
    #**000000540560**%
    #**0002200000**%
    四条指令,其中:#**0000000343不完整,检测到后进行抛弃处理。调试技巧篇:
    对于已了解协议的支持串口产品,要想进行编程控制,可以使用“串口通讯控制器”进行调试,以摸清具体实现数据,可按如下步骤进行:
    1.确定硬件连接无误,这是首要条件,如果错误将没有成功的可能;
    连线必须正确,必要时可以使用计算机自带的多个端口相互进行测试,已保证硬件的连接无误。串口通讯线有9针和25针,多用9针,其中最重要的是2(RXD)、3(TXD)、5(GND)线,对应关系如下:
    9针 25针
    2 -- 3
    3 -- 2
    5 -- 72.确定通讯参数正确,如:波特率、奇偶校验位、数据位、停止位等,以及收发的是十六进制还是字符串:3.以上确保正确,则使用“串口通讯控制器”,按协议输入数据进行收发控制了。
    注意:有的仪器需要进行初始化,即先发一段激活指令,然后才能进入工作状态,这种设置主要是为了实现利用硬件为软件加密,即类似加密狗,需要有激活方法才行,不过该类方法使用较少。http://218.56.11.178:8018/FileDown.aspx?FID=160http://218.56.11.178:8018/FileDown.aspx?FID=167