HT9800仪表数据如下..和厂家的说明   9针的串口和计算机连接 
数据格式       
    连续发送一组数据,每组数据5帧,每帧11位:1位起始位(0),8位数据位(D0-D7),2位停止位(1)。起定义如下:       
    第1帧:D0-D7                   0FFH(起始位)       
    第2帧:D0-D2                   为小数点位置(0-4)       
                            D3                               NC       
                            D4                               1表示称重稳定           0表示称重未稳定       
                                D5                               1表示称重为负           0表示称重未稳正       
                                D6                               NC       
                            D7                               1表示溢出       
    第3帧:D0-D7                   BCD1(称重值)       
    第4帧:D0-D7                   BCD2(称重值)       
    第5帧:D0-D7                   BCD3(称重值)       
    注:(1)BCD1、BCD2、BCD3为由高到低的称重值的NCD码。     例 
          仪表显示数据为1670,则正确的数据包应为   FF   11   70   16   00 
          仪表显示数据为167.0,则正确的数据包应为   FF   12   70   16   00 
          
                                                        
                                                                                                                    杭州衡天技术部 
--------------求解拆仪表发过来的BCD包成10进制显示-------------------------------------------- 
以下是我写的接收代码,老是解不对.又找不到错误.痛苦万分. void   __fastcall   TForm1::Comm1ReceiveData(TObject   *Sender,   Pointer   Buffer, 
            WORD   BufferLength) 

            //接收   波特率4800   数据位8   停止位2   没校验             AnsiString   cs1,cstr,s1; 
            int   v; 
            try{ 
            cs1=PChar(Buffer);//取得字符 
            if(cs1.IsEmpty()){return;} 
            //cstr=Trim(cs1);//过滤空格             char   *c=new   char(cstr.Length()); 
            StrLCopy(c,cstr.c_str(),cstr.Length()); 
            for(int   i=0;i <cstr.Length();i++) 
            { 
                  v=int(c[i]); 
                  s1=s1+IntToHex(v,2);//转换 
            } 
            delete   []c; 
            }catch(...){return;}             m1-> Lines-> Append("转换的值:"+s1);// 
}

解决方案 »

  1.   

    首先确定传过来的是数据包是正确的吗?如果正确,拆解应该不困难的。  if myMSComm.CommEvent = 2 then   //串口发生接收字符事件
      begin
        iInputLen:=myMSComm.InBufferCount;
        myMSComm.InputLen:=iInputLen;
        RecStr:=myMSComm.Input;    sValue:='';
        for j:=0 to iInputLen - 1 do
          sValue:=sValue+IntToHex(RecStr[j],2);    //先拆出数据,再处理小数位和正负号
        sValue:=sValue[9]+sValue[10]+sValue[7]+sValue[8]+sValue[5]+sValue[6];    ....  end;
       
      

  2.   

    以上是MSComm控件连接HT9800的代码,很好理解的。
      

  3.   

    不要使用SPCOMM,SPCOMM有问题的.建议使用MSCOMM.
    USB转串口的设备,百分之八十SPCOMM读不出来的.