我是将每条记录的相关信息取出,按下列代码发送出去,
下列代码重复执行22次时,程序无响应,等很长时间后,有可受到两三个字节
代码如下:
       comm1.baudrate :=2400;
       comm1.commname :='com1';
       Comm1.StartComm; }        for k:=1 to 2 do
        begin
            if gate[k]= '' then
            goto 22;
            begin
                 SendBuf1[3] := strtoint(gate[k]) +5;  // 登机门号,排在五个值机柜台之后
                 sleep(3);
                 for i:=1 to 38 do
                 begin                     Comm1.WriteCommData(@Sendbuf1[i],1);
                     sleep(3);
                 end;
            end ;
            //showmessage(gate[k] +'登机门' + s);
        end;
22:     //Comm1.StopComm;

解决方案 »

  1.   

    粘错了,使我的源代码,没有上下文,有些看不懂我是将每条记录的相关信息取出,按下列代码发送出去,
    下列代码重复执行22次时,程序无响应,等很长时间后,有可受到两三个字节
    代码如下:
           comm1.baudrate :=2400;
           comm1.commname :='com1';
           Comm1.StartComm;         for k:=1 to 4 do
            begin
                if gate[k]= '' then //gate[]共有4个元素,if gate[i]无数据 then 退出发送代码
                goto 22;
                begin
                     SendBuf1[3] := strtoint(gate[k]) +5;  //
                     sleep(3);
                     for i:=1 to 38 do
                     begin
                         Comm1.WriteCommData(@Sendbuf1[i],1);
                         sleep(3);
                     end;
                end ;
            end;
    22:     Comm1.StopComm;
      

  2.   

    你的终端设备baudrate是多少?启始位和停止位还有校验,串口通讯在通讯线路的两端串口要用相同的设置
      

  3.   

    你能把你的代码写的在清楚点吗?一般写程序不建议使用goto
      

  4.   


           comm1.baudrate :=2400;
           comm1.commname :='com1';
           Comm1.StartComm;         for k:=1 to 4 do
            begin
              if gate[k]<>'' then //gate[]共有4个元素,if gate[i]无数据 then 退出发送代码
                begin
                  SendBuf1[3] := strtoint(gate[k]) +5;  //
                  sleep(3);
                  
                  for i:=1 to 38 do
                  begin
                    Comm1.WriteCommData(@Sendbuf1[i],1);
                    sleep(3);
               
                  end ;
               end 
           end;
           Comm1.StopComm;
         
      

  5.   

    是串口的输出缓冲区被写满了。他没有时间释放,所以无法容纳其他更多的数据
    在输出的循环中加入
        StartTime := now;
        repeat
        Application.ProcessMessages;
        until Now > StartTime + NumSec * (1/24/60/60);变量声明:
      NumSec: SmallInt;
      StartTime: Tdatetime;
      

  6.   

    你应该看看第22组数据的内容的,很有可能是数据的有某个字节与spcomm里的某些设置字符冲突了,比如结束符或开始符。
      

  7.   

    我在delphi6中跑程序时,发送的信息就少,
    直接运行可执行文件,能发送23组,第24组数据只收到7个字节,而最后一组数据都是一样的,我只是在中间增加几组数据。还有,delphi6跑程序时,为发送完时,机子就死掉;而运行可执行文件时,虽然未发送完,但机子却未曾死掉。似乎米奇(先生或小姐,大半是先生)说的有理,
    但他却不来详细解释一下他的代码,
      

  8.   

    使用sleep延时,程序将暂停一段时间,程序不能分配到cpu时间片,无法处理消息队列的其他消息,而每次调用ProcessMessages来延时,他可以处理一条正在等待处理的消息,在这里将会有机会释放掉串口的缓冲区,NumSec变量用来存你想要延时的时间(单位是秒),可以赋值为1(足够了)。
      

  9.   

    我在程序中将sleep(3)替换为:
      StartTime := now;
        repeat
        Application.ProcessMessages;
        until Now > StartTime + 1;
    调试时,
       starttime=37424.701862
    但总是不能跳出repeat循环,
    我的写法是否正确??还是其他原因??
      

  10.   

    sleep(X)不能用?你干嘛要这样用?
      

  11.   

    [email protected]源程序发来看看
      

  12.   

    until Now > StartTime + 1;
    你要等到第二天才能退出循环。
    Tdatatime的整数单位为天,这就是我在后面乘上(1/24/60/60)的原因。
    结果为秒。
      

  13.   

    qfhuang2000(米奇) :
    感谢你的帮助,我已经改好了。
    而且,发送速度也有很大提高!!!
    同时,也感谢其他网友的大力协助和gz!!!