现在我想写串口主从通信。。
我用循环来实现。。可是总也不对,
我是这样想的,先把需要通信的所有人设备选出来,然后循环去呼叫。。然后从设备应答,
可是不知道怎么回事,我测试时总是发完了所有的设备信息才触发收到从设备的信息,也就
是程序中标记为//ERROR的部分不对。。
程序循环部分如下:
  //取出设备编码
  File_today('开始执行串口通讯');
  with AdoQuery_s  do
  begin
    close;
    Sql.Clear ;
    Sql.Add('select wid from watch');
    open;
    lsi:=1;
    while not eof do
    begin
      wids[lsi]:=Fields[0].AsString ;
      lsi:=lsi+1;
      next
    end;
    count:=RecordCount;
    close;
  end;
  File_today('运行设备:'+IntTostr(count));
  if count>0 then    //设备>0
  begin
    Wi:=0   ;
    While wi=0 do
    begin
      for Fi:=1 to count  do
      begin
        sleep(200);
        try
           strTobyte('53'+wids[fi]);   //'R'=83
           Comm1.WriteCommData(@lsBS,5) ;
           Edit1.Text:=wids[fi]+'发送成功信号';
           File_today(wids[fi]+'发送成功R');
        except
            File_today(wids[fi]+'发送成功信号失败,请检测串口状态!') ;
            endini(fi);   //初始化变量
        end;
       {判断是否收到数据}
        ti:=0;                //ERROR的部分
        while  ti<500 do
        begin
          if viewstring='' then
            ti:=ti+1
          else
            ti:=500;
        end;  
        if viewstring='' then ei[fi]:= ei[fi]+1; //错误次数加1
        //判断是否收到数据
        if ei[fi]>=5 then
         File_today(wids[fi]+'发送数据接收失败5次,请检测设备状态!')
        else
        begin
           if  copy(viewstring,1,2)='59' then   //'Y'='59'
           begin
             if length(viewstring)=18  then   //判断收到是不是位长正确
             begin
               if (Compute_xor(copy(viewstring,3,length(viewstring)-2))='00') then
               begin
                 try
                   Insert_devt(wids[fi],copy(viewstring,3,length(viewstring)-4));
                   lsBS[1]:=82;  //'R'=82
                   Comm1.WriteCommData(@lsBS,1) ;
                   Edit1.Text:=wids[fi]+'发送成功信号';
                   File_today(wids[fi]+'发送成功R');
                  except
                    File_today(wids[fi]+'发送成功信号失败,请检测串口状态!') ;
                  end;
                  endini(Fi);   //初始化变量
               end
               else
               begin
                 try
                   lsBS[1]:=69;  //'E'=69
                   Comm1.WriteCommData(@lsBS,1) ;
                   Edit1.Text:=wids[fi]+'发送失败信号';
                   File_today(wids[fi]+'发送失败E');
                 except
                   File_today(wids[fi]+'发送失败信号失败,请检测串口状态!') ;
                   endini(fi);   //初始化变量
                 end;
               end;
             end;
           end
           else
             if  copy(viewstring,1,2)='4E' then   //'N'='4E'
             begin
               File_today(wids[fi]+'设备无记录!') ;
               endini(fi);   //初始化变量
             end;
        end;
      end; 
    end;
  end;
spcomm的ReceiveData()事件代码如下:
begin
  viewstring:='' ;
  move(buffer^,pchar(@rbuf)^,bufferlength);
  for i:=1 to bufferlength do
  begin
     viewstring:=viewstring+inttohex(rbuf[i],2);   //16进制
  end;
  File_today('收到数据'+viewString);
  Edit1.Text :='串口正在接收数据';
end;我是想串口向一个从设备发出从设备的编码后,就等待从设备的回应,也就是应该
可以触发到ReceiveData()事件,可是不知道怎么搞的,总是在等待时收不到,等主机
发了好多个,ReceiveData()才收到多机发过来的数据。。到底怎么回事??