procedure TCzForm.CommReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
    p: PChar;
   str,ss:string;
   i:integer;
begin      p := Buffer;
      str := p;
      str:=trim(str);      with Dmcz.TBcssj do
      begin
        first;
        if FieldByName('ybrx').AsString='JLCW' then
        begin
          i:=length(str);
          ss:=copy(str,0,i-2);
          memo1.Lines.Text:=ss;
        end;
      end;end;             
主要用来接收称重数据,仪表发送方式为连续发送,接收有时会错乱,希有好心人帮助解决,给一个源码参考,急   发送格式为1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg 1000.2kg ...........

解决方案 »

  1.   

    你的格式是8个字符+1个空格吧
    var
       b:string;
    procedure   TCzForm.CommReceiveData(Sender:   TObject;   Buffer:   Pointer; 
        BufferLength:   Word); 
    var 
            p:   PChar;
           s:string; 
          i,j:integer; 
    begin 
                p   :=   Buffer; 
               for i:=0 to BufferLength-1 do
                b:=b+p[i];
                j:=pos(#32,b);
               if j<=0 then exit;
                s:=copy(b,1,j-1);
                b:=copy(b,j+1,1000);
                with   Dmcz.TBcssj   do 
                begin 
                    first; 
                    if   FieldByName('ybrx').AsString='JLCW'   then //这个判断干什么的?
                    begin 
                        memo1.Lines.Lines.Add(s); 
                    end; 
                end; 
    end;     
      

  2.   

    不一定,最长10位最短5位 -3000.0kg 0.0kg 也有,最后都有一个kg,前面有时有负号-100.kg,那个是我预留的,因为仪表不同,格式也不同,谢了,我试试看一下,波特率有1200,2400,4800,9600,不过好像都没起到作用,
      

  3.   

    你要明白
    并不是你发一个包 接收方就能受到一个完整包
    比如
    我发 10.000kg
    你有可能触发 receive事件8次 ,每次只收到一个字符
    也有可能一次收到几个包
      

  4.   

    我把inx_XonXoffFlow设false
       outx_xonxoffFlow设false
       TxContinueOnXoff设false
    procedure TCzForm.CommReceiveData(Sender: TObject; Buffer: Pointer;
      BufferLength: Word);  var
        p: PChar;
       str:string;
    begin
          p := Buffer;
          str := p;
          str:=copy(str,0,BufferLength-2);
          with Dmcz.TBcssj do
          begin
            first;
            if FieldByName('ybrx').AsString='JLCW' then  //预留
            begin
                str:=copy(str,0,length(str)-2);
                memo1.Lines.Text:=str;
            end;
         end;end;
    以上源码已在两台机子上连续测试两小时通过,接收正常,单片机为Atmel 89s52 格式为1位起始位,1停止位,8位数据位,1标志位,谢谢各位,供大家参考