如何将有符号数转化为BCD码?

在做协议传输时,通常需要将数据转化为BCD码格式用于传输,例如水资源206通讯协议,通常我们在处理数据转化时,用的往往是无符号数的转化,也就是将unsigned int 或者unsigned long int 类型的数据转化为BCD码格式,这个相对来说比较方便,按照hex数转化为BCD码数据的计算方法转化就可以了,但是有些数据是有符号数格式的,比如水位数据,水位数据的真实值等于水位基值+水位传感器测量值,按照协议要求,水位的取值范围是-7999到+7999,当我们计算出负值的时候应该怎么转换呢?

    首先,我们要明白负数在单片机或者编译器中的存储格式,负数是以补码的形式存储的,这样我们在做hex数转化为BCD码数据的时候不能按照正数hex数转化为BCD码数的计算方法,这里推荐使用下面的方法:第一,我们判断一下计算结果是不是负数,如果是负数,那么我们先将其转化为正数;第二,我们按正常转化方法将此正数转化为BCD码;第三,手动添加负号,即最高位填负1,程序示例如下:

if(CurrentLevel<0)

{
    CurrentLevel = 0-CurrentLevel;

    Hex32ToBCD32(CurrentLevel,CurrentLevel_BCD);  //此函数为常用hex数转BCD码函数,比较简单

    CurrentLevel_BCD[3] =(CurrentLevel_BCD[3] | 0xF0); //206协议规定高四位表示符号位

}
————————————————
版权声明:本文为CSDN博主「单片机程序猿」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_42285365/article/details/96479723

猜你喜欢

转载自blog.csdn.net/tjcwt2011/article/details/114398094