网站建设| 数据库类| 图形图象| 程序设计| 现代办公| 操作系统| 考试认证| 网络技术| 软件工程| 电脑相关| 文学作品
网站开发| 网页制作| 操作系统| 图象图形| 考试认证| 数据库类| 程序设计| 硬件技术| 现代办公| 网络技术| 笑话频道
 
您的位置: 电脑书库首页-> 电脑文摘-> 数据库类-> PowerBuilder-> PB中读取地磅BCD解码

PB中读取地磅BCD解码
作者:佚名 来源:InterNet 加入时间:2005-1-31
相关文章
  • 如何在PB中制作特殊形状数据窗口或按钮
  • PB和EAServer共筑多层应用架构
  • PB中的数据窗口自动刷新技术
  • PB通过OLEObject使用Word
  • PB动态报表格式自由定义的实现
  • 为PB的TreeView实现同步选择
  • 如何用pb实现MSACCESS数据库的图片字段存取
  • 在PB中应用灵活多样的排序
  • 在PB中如何使用Microsoft Outlook发送邮件
  • PB中实现可监控的数据备份
  • 相关书籍:

    我在《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


    [文章录入员:nancy]

    相关文章
  • 如何在PB中制作特殊形状数据窗口或按钮
  • PB和EAServer共筑多层应用架构
  • PB中的数据窗口自动刷新技术
  • PB通过OLEObject使用Word
  • PB动态报表格式自由定义的实现
  • 为PB的TreeView实现同步选择
  • 如何用pb实现MSACCESS数据库的图片字段存取
  • 在PB中应用灵活多样的排序
  • 在PB中如何使用Microsoft Outlook发送邮件
  • PB中实现可监控的数据备份
  • 相关书籍:
    本站推荐内容

    近期主机类热搜关键词:
    美国服务器 美国服务器租用 海外服务器租用 国外服务器租用

    PowerBuilder
    ACCESS
    MS SQL
    MySQL
    Oracle
    Foxpro
    PowerBuilder
    Sybase
    其它
    电脑教程阅读排行
    ·浅析PowerBuilder下动...
    ·PowerBuilder连接Sy...
    ·用Powerbuilder开发W...
    ·在powerbuilder中向E...
    ·PB通过OLEObject使用W...
    ·PB中读取地磅BCD解码
    ·在PowerBuilder中操作...
    ·PB动态报表格式自由定义的实现
    ·PB开发Sybase数据库应用技...
    ·如何在PB中制作特殊形状数据窗口...