我现在有SPCOMM二个过程,一个SPCOMM发送过程,另外一个是SPCOMM接收过程,我现在想做成这样当SPCOMM发送数据“12345678......”时,如果说“SPCOMM接收过程”没有数据返回SLEEP(10),等待后“SPCOMM接收过程”没有数据我就循环发送三次,还是没有返回,结束发送,这个应该怎么做呢?谢谢各位指点!!!!

解决方案 »

  1.   


    kenshinggg能否给我一个例子呢,刚学DELPHI不久,我代码如下,或者是否能帮我改一下呢?非常感谢!!!!我的spcomm发送过程代码如下procedure TForm1.SendHex(S: String);
    var
      s2:string;
      buf1:array[0..50000] of char;
      i:integer;
    begin
      s2:='';
      rsconfir:=0;
      for i:=1 to  length(s) do
      begin
        if ((copy(s,i,1)>='0') and (copy(s,i,1)<='9'))
        or((copy(s,i,1)>='a')  and (copy(s,i,1)<='f'))
        or((copy(s,i,1)>='A') and (copy(s,i,1)<='F')) then
        begin
            s2:=s2+copy(s,i,1);
        end;
      end;
      for i:=0 to (length(s2)div 2-1) do
        buf1[i]:=char(strtoint('$'+copy(s2,i*2+1,2)));
        //showmessage(char(65));表示ASIC码
      Comm1.WriteCommData(buf1,(length(s2) div 2));
    end;SPCOMM接收过程如下
    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
     i:DWORD;
     ReceiveBuffer:PChar;
     strSel:TMyStrSel;
     j:integer;
     s,k:integer;
     Rtrueorfalse:boolean;
    begin
    ReceiveHex:='';
    Rfirst:='';
    Rtype:='';
    Rorder:='';
    Rlast:='';
    RAll:='';
    rsconfir:=1;
    Try
    ReceiveBuffer:=Buffer;
    Dec(ReceiveBuffer);
     for   i:=0   to   BufferLength-1   do
      begin
       inc(ReceiveBuffer);
       ReceiveHex:=ReceiveHex+IntToHEX(Ord(Byte(ReceiveBuffer^)),2);
      end;
      memo1.Lines.Add('接收的原始数据为:'+receivehex);
    Except
      on E:Exception do
      begin
      showmessage(' 异常处理');
      end; 
    end;
    end;
      

  2.   

    iSendTimes : Integer; //发送的次数,为全局变量,初始值为0
    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);
    var
     i:DWORD;
     ReceiveBuffer:PChar;
     strSel:TMyStrSel;
     j:integer;
     s,k:integer;
     Rtrueorfalse:boolean;
    begin
    ReceiveHex:='';
    Rfirst:='';
    Rtype:='';
    Rorder:='';
    Rlast:='';
    RAll:='';
    rsconfir:=1;
    Try
    ReceiveBuffer:=Buffer;
    Dec(ReceiveBuffer);
     for   i:=0   to   BufferLength-1   do
      begin
       inc(ReceiveBuffer);
       ReceiveHex:=ReceiveHex+IntToHEX(Ord(Byte(ReceiveBuffer^)),2);
      end;
    //**********增加的代码*******************//
        if ReceiveHex = '' then 
          begin
            Inc(iSendTimes);
            if iSendTimes <= 3 then 
              begin;
                sleep(10);
                SendHex('你要发送的数据'); 
                Exit;   
              end
            else 
              begin
                ShowMessage('发送超过三次');
                iSendTimes := 0;
              end;
               
          end
    //**********End*******************//
      memo1.Lines.Add('接收的原始数据为:'+receivehex);
    Except
      on E:Exception do
      begin
      showmessage(' 异常处理');
      end; 
    end;
    end;
      

  3.   

    fangsp 我这里运行了不行哟
    procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;BufferLength: Word);这个过程是当SPCOMM串口接收到数据的时候才被运行的。
      

  4.   

    var
    receivehandle:Thandle;
    .......
    receivehandle:=createthread(nil,0,@Comm1ReceiveData,nil,0,tid);if receivehandle=0 then showmessage('接收没有数据');
    if receivehandle<>0 then showmessage('有数据');我这样做的时候在createthread(nil,0,@Comm1ReceiveData,nil,0,tid);的@Comm1ReceiveData后面提示错误,我估计应该是线程不能调用过程出错,但不知道如何解决,正探索望高手指点。Comm1ReceiveData过程代码在本贴上面有的
      

  5.   

    CreateEvent创建一个事件对象hEvent发送数据
    WaitForSingleObject等待一定时间
    如果等待超时就重发SPComm的OnReceiveData事件里,SetEvent。
      

  6.   

    zhouzuoji 
    是否有例子给我看一下呢?谢谢!!!
      

  7.   

    分太少首先你的思路有问题, SPCOMM发送过程,不是马上就从串口发出去的,SLEEP(10)???显然时间太短了,你的波特率多少?
    发送几个字节等相关的,一般SLEEP(200)以上