通信协议: 波特率:600,1200,2400,4800可选。
              字节格式:1位起始位
              8位数据位
              1位校验位(当校验方式为“NON”时,则无校验位)
              1位停止位
串行口有两种工作方式。一种是连续方式,即仪表每测量一次便将结果通过串行口发送出去;另一种是命令方式,即仪表只有收到命令时才将当时的测量结果发送出去。a、 命令格式(ASCⅡ码):
READ〈CR〉﹁〈LF〉﹂ 即52H  45H  41H  44H  0DH ﹁0AH﹂b、仪表发送的数据格式:
   仪表发送的一个完整数据由五个字节构成,其中一个标志字节(FFH),一个状态字节和三个数据字节(压缩BCD码,低位在前),
//**************代码***************************************//procedure TForm1.Comm1ReceiveData(Sender: TObject; Buffer: Pointer;
  BufferLength: Word);
var
  s : string;
  i : integer;
  rbuf : array[0..100]  of byte;
begin
  //s:='';
  ZeroMemory(pchar(@rbuf),100);
  move(buffer^,pchar(@rbuf)^,bufferlength);
  for i:=1 to bufferlength do
    s:=s+inttohex(rbuf[i],2)+'';
  //memo1.lines.add(Format('%d',[StrtoInt('$'+s)]));
  memo1.lines.add(s);  {
  SetLength(S, BufferLength); //接收RS232的数据并显示Memo1上。
  Move(Buffer^, PChar(S)^, BufferLength);
  Memo1.Lines.Add(S);
  }
end;procedure TForm1.BitBtn1Click(Sender: TObject);
begin
   Comm1.CommName :='com1';
   Comm1.Baudrate :=strtoint(ComboBox1.Text);
   Comm1.ByteSize:=_8;
   Comm1.parity:=None;
   Comm1.StopBits:=_1;
   //Comm1.RtsControl
   Comm1.StartComm;
end;procedure TForm1.BitBtn2Click(Sender: TObject);
begin
  comm1.StopComm;
end;
//***************出现问题*******************************//
秤上的数为420,显示为8200372,不对,高手请给与指点。

解决方案 »

  1.   

    跟踪代码,看看是哪里不对。
    应该是数据转换的时候,为什么不直接转换成ascii码?
    for i:=1 to bufferlength do
        s:=s+char(rbuf[i])+'';
      

  2.   

    ZeroMemory(pchar(@rbuf),100);
      move(buffer^,pchar(@rbuf)^,bufferlength);
      for i:=1 to bufferlength do
        s:=s+inttohex(rbuf[i],2)+'';
    从这些步骤里开始跟踪一下 F7 
    楼上的  可能楼主要16进制显示吧 为什么不直接转换成ascii ??我也疑问 但好象不是问题的所在
      

  3.   

    那直接从COM读取的数据是什么?会不会是在转换的时候位置错位了?
      

  4.   

    rbuf : array[0..100]  of byte;看你这个声明,串口传过来的数据应该是10进制数,所以你就不用管什么16进制了,直接转成ascii码:
    for i:=1 to bufferlength do
        s:=s+char(rbuf[i])+'';
    memo1.lines.add(s);如果你保证串口过来的数据是正确的,那肯定是你转换的错误。
      

  5.   

    for i:=1 to bufferlength do
        s:=s+inttohex(rbuf[i],2)+'';
    秤上的数为420,显示为8200372这个 s 输出没? 应该是偶数个字符呀。
      

  6.   

    for i:=1 to bufferlength do
        s:=s+inttohex(rbuf[i],2)+'';
    不对应为
      for i:=0 to bufferlength - 1 do
        s:=s + inttostr((ord(rbuf[i]) div 16)*10 + (ord(rbuf[i]) mod 16)) + ' ';
      

  7.   

    http://www.56kc.net/web/commwatch.aspx建议先手动输入指令测试,然后用程序实现.