我用如下代码接收数据
procedure TForm1.MSComm1Comm(Sender: TObject);
var
  vtmp,ovtmp:variant;
  bTmp:Byte;
  i,ireceived:integer;
begin
  if mscomm1.CommEvent =2 then
    mscomm1.InputMode:=comInputModeBinary;  iReceived:=mscomm1.InBufferCount;
  ovtmp:=mscomm1.Input;
  vtmp:=VarArrayCreate([0,17],varbyte);
  vtmp:=ovtmp ;
end;
现在我要解析一个18byte的数据包
连续输出格式
STX  A  B  C  X  X  X  X  X  X  X  X  X  X  X  X  CR  CKS
1       2             3                 4          5 6
其中:
1、〈STX〉ASCII起始符(02H)。
2、状态字A、B、C。
3、显示重量  可能是毛重也可能是净重。6位不带符号和小数点的数字。
4、皮重  6位不带符号和小数点的数字。
5、〈CR〉ASCII回车符(0DH)。
6、〈CKS〉可选的校验和。
A的格式为前3位为小数点的位置
0 0 0     XXXX00
1 0 0     XXXXX0
0 1 0     XXXXXX
1 1 0     XXXXX.X     
0 0 1     XXXX.XX
1 0 1     XXX.XXX
0 1 1     XX.XXXX
1 1 1     X.XXXXX
我怎样判断数据包并获得像状态字A每一位的置来确定数据的小数点位置呢?

解决方案 »

  1.   

    参考一下,方法是一样的:http://218.56.11.178:8020/web/technology/chuangkou.htm
      

  2.   

    http://218.56.11.178:8020/web/technology.aspx-》下载基地-》例程-硬件控制-》串口通讯控制器/spcom事例程序           -》控件-硬件控制-》spcom/TurboPower Async Professional
      

  3.   

    你的数据是18byte,每个byte 8个bit,是吗?
      

  4.   

    你先用jpyc(九品御厨)串口通讯控制器先收一些数据,分别为16进制和非16进制,然后把结果贴出来,让大家看看。也好帮你分析分析。
      

  5.   

    jpyc(九品御厨) 你的串口调试程序怎么收到的文字有乱码呢?
    我发的是一小篇文章,用你的发到超级终端或别的串口测试程序中则没有乱码。
    我修改了你的程序,在接收同时保存到一个文件中,结果保存的文件正常,而你的程序显示的有乱码。
    说明你的程序发送,接收都没有问题,只是在Memo_show中显示有问题,请问怎么改正?
      

  6.   

    var
      vTmp:variant;
      ...
    begin
      CodeSize:=MsCommCall.InBufferCount;
      if CodeSize>0 then begin
        vTmp:=VarArrayCreate([0,CodeSize-1],varByte);
        vTmp:=MsCommCall.Input;
        Code:=vTmp[CodeSize-1];
      end
      else begin
        Code:=C_None;
      end;
    ...mscomm返回的类型是variant类型的数组,所以delphi端也要用variant数组去接收,不然就会损失掉高位,返回结果就不对了,用variant数组取得数据后,再赋给byte型就可以正常使用了。
      

  7.   

    你的问题解决了吗?
    能否也发给我学习学习?[email protected]   谢谢。
      

  8.   

    问题我已经解决了,要取状态字A的低3位,只需将vtmp[1]即A的值于$07按位与即可,
    vtmp[1] and $07就是低三位的值。
    另外,我在http://www.csdn.net/develop/article/20/20663.shtm上发现了一个非常简单的函数:
    function GetBit(i: Cardinal; n: Cardinal): Boolean;
    begin
      Result := Boolean((i shr n) and 1);
    end;这个函数只需改改i的类型为byte就行,即
    function getbit(i:byte;n:integer):integer;
    begin
      result:=(i shr n) and 1;
    end;
    这样getbit(i,n)就返回的值就是i的第n位,够简单吧
      

  9.   

    XDvlper(XDeveloper)  
    我也需要设计一个电子称接受数据的程序,好像我们的电子称是一个型号的。
    我以前没有做过串口(我一般做企业管理方面的程序),你能否把你的程序发给我呢?
    愿我们能够互相学习,互相帮助。谢谢你。[email protected]
      

  10.   

    呢个显示问题,可能是你发送了一些不可见字符,如从网页上随便考一下,就包含好多,对于MOME/RICHEDIT这些显示控件的显示就有问题,发送可见字符就好了,其它几个串口软件我也试过,也有类似问题,有的解决方案是:过滤掉不可见字符,这样有问题,就是你收到并显示的数据就肯定不真实了。
      

  11.   

    jpyc(九品御厨) 
    还有 怎么接收时是四个字四个字的接收的呀?
    (选择逐行就可以看出来是一次接收了4个字)
      

  12.   

    var
       InputBytes:array of Byte;  MSComm1.InputMode:=comInputModeBinary;
      InputBytes:=MSComm1.Input;