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

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

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

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

举例:

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

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

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

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

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

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

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

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

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

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

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

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

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

思路方法:我们写将十进制ASCII(单字节)转化为 2进制当然如此来你还要写个将 2进制串转换为10进制数字有兴趣朋友可以尝试

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

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

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

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

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

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

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

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



附件:
//=

// Function: of_Hex

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

// Description: 转换eger到16进制

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

// Aagument: Integer pssl

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

// Return:    16进制

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

// Log:      excerpt by tubx 2004.03.10

//=

vs,vstmp,vsret

eger 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
Tags: 

延伸阅读

最新评论

发表评论