PB中读取地磅BCD解码

转载 2012年03月30日 21:53:10

PB中读取地磅BCD解码

(加入日期:2004-9-29)

保存文章至硬盘】【打印文章】【字体:

分享到: 0
我在《PB中读取地磅称量数据》中简述了PB读取地磅操作过程,有网友反映对BCD码的读取及解码不是很清楚。在此,特追加此部分内容来解释BCD解码过程。

认识BCD编码
BCD编码是一种数字压缩存储编码,大家都知道一个字节有8个位,而数字0到9最多只需要使用4个位,如果用一个字节来存储一个数字相对就会有一定的浪费,尤其是在传输过程中,由此人们就想出了压缩的办法,于是BCD编码就产生了。

BCD编码将一个字节的8个位拆分成高4位和低4位两个部分,也就是说一个字节能存储两个数字。所以BCD的编码过程就是将数字压缩的过程,将两个字节的数字压缩成一个字节。反之,解码就是把一个字节的数字拆分为两个数字单独存放(大部分的处理都是按字节处理的)。

示例:

编码过程,将数字69进行BCD编码(注:BCD编码低位在前,后面将不再注释)。

1.       将6,9分别转换成二进制表示:6(00000110)9(00001001),大家可以看到,最大的数字9也只要4个位,在传输过程中白白浪费了4个位;

2.       将69合并为一个字节,分别取6,9二进制编码的低4位,按照低位在前的原则,将9的低四位放前面6的低四位放后面得出新的字节二进制编码是10010110;

3.       完成编码过程,69的BCD编码结果为10010110。

解码过程:将69的BCD码10010110进行解码。

1.       将10010110的高4位与低4位拆分开,得到两个二进制数1001和0110;

2.       分别将1001和0110的前面补充4位0000得到两个8位的二进制数00001001,00000110;

3.       因为编码时低位在前,所以我们将两个二进制数编排顺序为00000110 000010001;

4.       将二进制数转换为十进制得出解码结果为69(正确解码)。

PB中如何对BCD码进行解码
大家知道在PB中有二进制类型的变量blob,但要无法按位操作,那么我们如何进行BCD编码的数字进行解码呢?

我想大家都会不约而同的想到ASCII码,没错,就是她。ASCII就是数字和字符在计算机中存储的的值,她在PB中给我们呈现的并不是01组成的二进制数而是十进制数值。

BCD解码需要将一个字节的高4位和低4位进行拆分,那么我们怎么来使用十进制的ASCII编码做到呢?

因为PB不提供位运算所以我们只能自己写函数来做些简单的处理了,那又如何处理呢?

方法一:我们写函数将十进制的ASCII(单字节)转化为二进制的字符串,当然,如此一来你还要写一个将二进制字符串转换为10进制数字的函数,有兴趣的朋友可以尝试一下。

方法二:在我上次写的内容中已经提到了,就是借助十六进制来完成转换。大家仔细研究不难发现十六进制表示等同于将一个字节的内容高4位和低4位分别转换为十进制,如果不信你可以自己验算一下。这样我们就只需要写一个转换函数了,将十进制数转换为十六进制字符串。转换后将十六串的两个字符位置对换(因为编码的时候低位在前),然后直接将这个串强制转换为数值型就得到了解码后的数值。(注:后面有一转换函数是网上一网友所写)

有了解码方法我们在读BCD码的地磅数据的时候就很容易处理了,因为我上次写过处理过程这里我只简单描述一下:

1.       用二进制类型blob将串口(现在有的用usb口)的数据读出来;

2.       将blob强制转换为string,这样就把二进制流按8位存储格式编码了,也就是说BCD码在这个string中,不过是压缩格式;

3.       将string的每个字节都分割开来,然后分别译为ASCII编码,PB中有函数ASC;

4.       根据具体设备出厂参数识别string中状态位,校验位,数字位等的位置;

5.       找到数字位进行BCD解码,方法如上;

6.       完成解码,得到称量数据。



附件:
//=============================================================================

// Function: of_Hex()

//-----------------------------------------------------------------------------

// Description: 转换integer到16进制字符串

//-----------------------------------------------------------------------------

// Aagument: Integer pssl

//-----------------------------------------------------------------------------

// Return:   string 16进制字符串

//-----------------------------------------------------------------------------

// Log:      excerpt by tubx 2004.03.10

//=============================================================================

string vs,vstmp,vsret

integer vi1,vilen,i,vimod,viy,visl

vilen=Len(String(pssl))

char vc_he[6]

vimod=Mod(pssl,16)

visl=pssl

If vimod>=0 Then

       vstmp=String(vimod)            

       If vstmp='10' Then vstmp='A'

       If vstmp='11' Then vstmp='B'

       If vstmp='12' Then vstmp='C'

       If vstmp='13' Then vstmp='D'

       If vstmp='14' Then vstmp='E'

       If vstmp='15' Then vstmp='F'

       vc_he[1]=vstmp

End If

For i =1 To vilen + 1

       viy=Truncate(visl/16,0)

       If viy>0 Then

              vstmp=String(viy)         

              If vstmp='10' Then vstmp='A'

              If vstmp='11' Then vstmp='B'

              If vstmp='12' Then vstmp='C'

              If vstmp='13' Then vstmp='D'

              If vstmp='14' Then vstmp='E'

              If vstmp='15' Then vstmp='F'

              vc_he[i+1]=vstmp

       End If

       If viy=0 Then exit  

       visl=viy

Next

vsret=''

If IsNull(vc_he[6]) Or vc_he[6]='' Then

       vsret=vsret

Else

       vsret=vsret+vc_he[6]    

End If

If IsNull(vc_he[5]) Or vc_he[5]='' Then

       vsret=vsret

Else

       vsret=vsret+vc_he[5]

End If

If IsNull(vc_he[4]) Or vc_he[4]='' Then

       vsret=vsret

Else

       vsret=vsret+vc_he[4]    

End If

If IsNull(vc_he[3]) Or vc_he[3]='' Then

       vsret=vsret

Else

       vsret=vsret+vc_he[3]    

End If

If IsNull(vc_he[2]) Or vc_he[2]='' Then

       vsret=vsret

Else

       vsret=vsret+vc_he[2]    

End If

If IsNull(vc_he[1]) Or vc_he[1]='' Then

       vsret=vsret

Else

       vsret=vsret+vc_he[1]    

End If



Return vsret

PB中读取地磅BCD解码PB中读取地磅BCD解码

PB中读取地磅BCD解码BCD编码将一个字节的8个位拆分成高4位和低4位两个部分,也就是说一个字节能存储两个数字。所以BCD的编码过程就是将数字压缩的过程,将两个字节的数字压缩成一个字节。反之,解码就...
  • lynice
  • lynice
  • 2007年08月21日 15:17
  • 1089

[原创]PB中读取地磅BCD解码

PB中读取地磅BCD解码我在《PB中读取地磅称量数据》中简述了PB读取地磅操作过程,有网友反映对BCD码的读取及解码不是很清楚。在此,特追加此部分内容来解释BCD解码过程。认识BCD编码BCD编码是一...
  • myclife
  • myclife
  • 2004年09月25日 11:01
  • 1448

PB中读取地磅称量数据

PB中读取地磅称量数据在PB开发企业应用时我们经常会遇到与仪器仪表接口的处理,这里我总结了一下与地磅接口读取称量数据的方法。一般的地磅都有以下的参数组成:串口编号串口参数时钟周期读数长度读字符串起始位...
  • myclife
  • myclife
  • 2004年03月15日 09:31
  • 2503

关于BCD码的编码和解码

 1)BCD码(Binary Coded Decimal ——二到十进制编码)     计算机内部多采用二进制表示和处理数值数据,因此在计算机输入和输出数据时,就要进行进制的转换处理。用4位二进制数来...
  • lucky00_21
  • lucky00_21
  • 2010年09月15日 14:26
  • 1153

关于BCD编码和解码

(1)BCD码(二到十进制编码) 人们通常习惯使用十进制数,而计算机内部多采用二进制表示和处理数值数据, 因此在计算机输入和输出数据时,就要进行由十进制到二进制的转换处理。 把十进制数的...
  • jbhand
  • jbhand
  • 2016年09月02日 14:35
  • 234

地磅称量系统之(6)让类库编译成dll文件

让知识更加联贯 让技术走进生活我的博客       我的程序 我的网络               ------郑紫至               E-mail:zhengzizhi@yahoo.co...
  • zhengzizhi
  • zhengzizhi
  • 2008年03月06日 15:09
  • 533

托利多地磅数据的网口读取方法

现在车辆称重大部分都采用了托利多公司的地磅设备,当前主要型号为IND560,IND800,IND880等。 国内的托利多售后服务,基本上只提供地磅硬件设备(包括地磅表头)的安装和调试,很少直接提供程序...
  • yyb0101
  • yyb0101
  • 2015年01月06日 13:41
  • 2252

关于BCD码的编码和解码(C#版)

最近在看小灵通SMGP1.32版协议时,见到里面有个BCD码,上网搜了一下,以PB版的多,我比较喜欢用C#,所以来个C#版的,呵呵我从网上抄下了两段说明:(1)BCD码(二到十进制编码)人们通常习惯使...
  • YAOHE
  • YAOHE
  • 2005年11月18日 13:16
  • 5555

如何复制BCD文件?

    想要在Windows7 100M分区把BOOT文件夹中的BCD这个文件复制出来,但提示“文件正在使用不能复制”。如下图:     如何才能不通过其它界面的软件(可通过命令行)才能复制它呢?(用...
  • mjsornp
  • mjsornp
  • 2011年05月12日 14:17
  • 3656

将一个字节存储的2位BCD码解码

#include #include /* 将一个字节存储的2位BCD码解码成普通的二进制数 */ uint8_t decode(uint8_t BCD) { uint8_t geWei, ...
  • qq_21411985
  • qq_21411985
  • 2015年03月24日 22:53
  • 732
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:PB中读取地磅BCD解码
举报原因:
原因补充:

(最多只允许输入30个字)