欢迎光临
我们一直在努力

[原创]PB中读取地磅BCD解码-数据库专栏,其他相关

建站超值云服务器,限时71元/月

pb中读取地磅bcd解码
我在《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

赞(0)
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com 特别注意:本站所有转载文章言论不代表本站观点! 本站所提供的图片等素材,版权归原作者所有,如需使用,请与原作者联系。未经允许不得转载:IDC资讯中心 » [原创]PB中读取地磅BCD解码-数据库专栏,其他相关
分享到: 更多 (0)