Spcomm串口控件:发送1次数据中写一个循环等待OnReceiveData得到数据后再继续发送下一数据,而永远实现不了.但我一次发完就可以接收到

解决方案 »

  1.   

    不可能。不知道你的接收是怎么处理的;类似这样的过程吧:
    var 
    start:cadinal;sendDataToComPort;
    start:=gettickcount;
    while gettickcount-start<1500 do
    begin
     //wait for rece the data
     application.processmesages;//这一句重要!
    //这儿肯定可以收到数据的
    end;
      

  2.   

    谢谢:
        这是一段发送原码:
        commflg:=true;
        returncount:=0;
        addflag:=false;
        flag:=false;
        dataline:=memo1.lines.Count;
        if dataline<=0 then exit;
        // ―羆Ω计everyline㎝讽Ω掸计
        zhen:=floor(dataline/20);
        yu:= dataline-zhen*20 ;
        everyline:=1;    while  everyline<=zhen do
        begin      for i:=1 to 256 do buf16[i]:=$00;
          buf16[1]:=$+(strtoint(cbx2.text));
          buf16[2]:=$+(strtoint('161'));
          buf16[3]:=$21;
          for nowline:=0+(everyline-1)*20 to everyline*20-1 do
          begin
            datastr:=memo1.lines[nowline];
            datastr:=inttohex(strtoint64(datastr),4);
            while length(datastr)<8 do datastr:='0'+datastr;
            buf16[(nowline-(everyline-1)*20)*8+4]:=strtoint('$'+copy(datastr,1,2));
            buf16[(nowline-(everyline-1)*20)*8+5]:=strtoint('$'+copy(datastr,3,2));
            buf16[(nowline-(everyline-1)*20)*8+6]:=strtoint('$'+copy(datastr,5,2));
            buf16[(nowline-(everyline-1)*20)*8+7]:=strtoint('$'+copy(datastr,7,2));
            buf16[(nowline-(everyline-1)*20)*8+8]:=$FF;
            buf16[(nowline-(everyline-1)*20)*8+9]:=$FF;
            buf16[(nowline-(everyline-1)*20)*8+10]:=$FF;
            buf16[(nowline-(everyline-1)*20)*8+11]:=$FF;
          end;
          buf16[19*8+12]:=$FF;
          buf16[19*8+13]:=$Ff;
          for i:=1 to 20*8+3+2 do
          begin
           if not fcomm.comm1.WriteCommData(@buf16[i],1) then
           begin
             commflg:=false;
             break;
           end;
           sleep(1);
          end;      prirtime:=now;
          while 1=1 do   //但在这段单步执行中永远不会去执行ReceiveData过程.不明白.感觉不能多线程.
          begin        
            if addflag then  //addflag:在接收到数据时ReceiveData里如果收到数据就置为true;,
            begin
              returncount:=returncount+20;
              break;
            end;
    //        comm1.readbuffer;
            nowtime:=now;
    //        sleep(100);
            if ((nowtime-prirtime)*24*3600)>20 then  
            begin
              messagedlg('send error!',mterror,[mbyes],0);
              exit;
            end;
          end;      if not commflg then messagedlg('send error!',mterror,[mbyes],0);
          everyline:=everyline+1;
        end;    if  yu>0 then
        begin
          for i:=1 to 256 do buf16[i]:=$00;
          buf16[1]:=$+(strtoint(cbx2.text));
          buf16[2]:=$+(strtoint(inttostr(yu*8+1)));
          buf16[3]:=$21;
          for nowline:=0+(zhen)*20 to zhen*20+yu-1 do
          begin
            datastr:=memo1.lines[nowline];
            datastr:=inttohex(strtoint64(datastr),4);
            while length(datastr)<8 do datastr:='0'+datastr;
            buf16[(nowline-(everyline-1)*20)*8+4]:=strtoint('$'+copy(datastr,1,2));
            buf16[(nowline-(everyline-1)*20)*8+5]:=strtoint('$'+copy(datastr,3,2));
            buf16[(nowline-(everyline-1)*20)*8+6]:=strtoint('$'+copy(datastr,5,2));
            buf16[(nowline-(everyline-1)*20)*8+7]:=strtoint('$'+copy(datastr,7,2));
            buf16[(nowline-(everyline-1)*20)*8+8]:=$FF;
            buf16[(nowline-(everyline-1)*20)*8+9]:=$FF;
            buf16[(nowline-(everyline-1)*20)*8+10]:=$FF;
            buf16[(nowline-(everyline-1)*20)*8+11]:=$FF;
          end;
          buf16[(yu-1)*8+12]:=$FF;
          buf16[(yu-1)*8+13]:=$Ff;
          for i:=1 to yu*8+3+2 do
          begin
           if not fcomm.comm1.WriteCommData(@buf16[i],1) then
           begin
             commflg:=false;
             break;
           end;
           sleep(2);
          end;      prirtime:=now;
          while 1=1 do
          begin
            nowtime:=now;
            sleep(100);
            if ((nowtime-prirtime)*24*3600)>3 then
            begin
              messagedlg('send error!',mterror,[mbyes],0);
              exit;
            end;
            if addflag then
            begin
              returncount:=returncount+20;
              break;
            end;
          end;
          showmessage('add employee information count=('+inttostr(returncount)+')');      if not commflg then messagedlg('send error!',mterror,[mbyes],0);
          everyline:=everyline+1;
        end;
      

  3.   

    application.processmesages;//这一句重要! 
    好了,确实是这句.后来有看这句,在等待消息.