现从串口取的数据,需从中取出28H到54H中间5个字节中的前4个字节,代码如下:
//数据接收消息处理函数
procedure tform1.wmcommnotify(var message:tmessage);
var
  titem:tlistitem;
  commstate:comstat;
  dwnumberofbytesread:dword;
  errorflag:dword;
  inputbuffer:array[0..1024] of char;    //静态数组
  recstr:string;
  i,n:integer;
  begin        ===========数据引出============== //开始提取数据
for n:=0 to dwnumberofbytesread-1 do//dwnumberofbytesread为串口已读取字节 
     begin                           数,在api函数readfile()中已获取   
         if inttohex(ord(inputbuffer[n]),2)='28' then
         begin
         i:=0;
         recstr:='';
         while i<4 do
         begin
         i:=i+1;
           recstr:=recstr+inttohex(ord(inputbuffer[n+i]),2);
          end;
          titem:=listview1.Items.Add;
          titem.caption:=datetimetostr(date()+time());
          titem.SubItems.Add(recstr);
但是就是这样,前二组28H和54H之间的能正确的取出来(11022B15,11022B01)到第三组就前面1102为对的0030为错的,本应为2B05),到第四个就是发送测试包中完全没有的00301AFA本应为(11022B09),接下就如上面循环出现错误前,即两组对,半组错,一组全都一直到结束,不知是那里算法有问题,请大家帮我看一看,急啊!!

解决方案 »

  1.   

    把一二个串放进去没有问题,能取出数据,但是取4位中,前三位是正确的,而第4位本应为15确变成了00,我的串API函数的读出设置为
    readfile(hrecv,inputbuffer,commstate.cbInQue,dwnumberofbytesread,@read_os))全部的设置为begin
        if not clearcommerror(hrecv,errorflag,@commstate) then
        begin
        messagebox(0,'clearcommerror !','notice',mb_ok);
        purgecomm(hrecv,purge_rxabort or purge_rxclear);
        exit;
        end;
        if (commstate.cbInQue>0) then
        begin
        fillchar(inputbuffer,commstate.cbInQue,#0);
        if (not readfile(hrecv,inputbuffer,commstate.cbInQue,dwnumberofbytesread,@read_os)) then
          begin
          errorflag:=getlasterror();
          if (errorflag<>0)and (errorflag<>error_io_pending) then
          begin
          receive:=false;
          raise exception.Create('读串口数据出错!!');
          end
          else
          begin
          waitforsingleobject(hrecv,infinite);
    getoverlappedresult(hrecv,read_os,dwnumberofbytesread,false);
          end;
          end;
          if dwnumberofbytesread>0 then
          begin
            read_os.Offset:=read_os.Offset+dwnumberofbytesread;
            inputbuffer[dwnumberofbytesread]:=#0;
    那位大侠能帮我看一看找一找原因,原因基本都是在四位上出现错误,当个字串时就在第四个字节,当多个字串时,就在第三个字节部份,第四个字节全部上出错,刚好和取数取4位同,不知和这个有没有关系,急
      

  2.   

    大家都认为程序是没有问题,只是参数设置或串口有问题,我没有用控件,完全是用的API函数作的串口接收程序
      

  3.   

    有试过,收到的数据没有问题,我是一直怀疑for n:=0 to dwnumberofbytesread-1 do        //这里N的取值取dwnumberofbytesread,并以他循环中间有BUG,但又不知怎样的修改,因为dwnumberofbytesread是串口接收字节的个数,我也试着在后面减1,或加1都试了一下,不见效果,只是错误循环,由三个开始出错变成二个开始出错或四个开始出错的而已