C语言位域的使用方法

C语言位域的使用方法


最近看到国外的众筹网站有体感服参与,了解了一些,用到了30个九轴传感器(陀螺仪、加速度计、地磁计),心想自己也来做一个,所以首先选择了BMX055这款(考虑到价格相对便宜,之前用过MPU9150,价格相对来说稍微较贵),于是网上买了几片模块并且附带了例程。只是这个例程到处都是坑,其中最多的就是数据格式转化的问题。我们单片机中的寄存器是按照二进制补码来存的,因为一个加法器即可解决加减运算,省去做硬件间发起的成本和复杂度。
这款传感器相对其他传感器较为特殊的一点是:加速度计是12位的,陀螺仪是16位的,地磁计两个轴13位,一个轴15位。。。于是,我必须取出有效的符号位来赋值,这就用到了位域的方法。

    首先贴代码:
    unsigned char a,b;
    short int c;
    a = b = 0xa0;
    c = (short int) (a>>4|b<<4);
    printf("c = %d",c);
    while (1);

这种情况我们本来是想将两个8位合成16位,然后再取其中的12位数据,而这12位其实是有符号的,但我们把它强制转化为16位的数据过后,符号位没了,所以得出的结果是正数。这里写图片描述
所以此时我们需要用到位域。下面贴代码:


typedef struct MyStruct
{
short int c : 12;
short int d : 12;
}data_tt;
int _tmain(int argc, _TCHAR* argv[])
{
unsigned char a,b;
short int z;
int m;
data_tt d = {0,0};
a = 0xa0;
b = 0xa0;
d.c = z = (short int)(b<<4|a>>4);
m = (int) d.c;
printf("m = %d",m);
while (1);
return 0;
}
这里写图片描述
这样就成功将12位的有符号数据提取出来并且成功转化为32位,并且没有丢调符号位。
注意的一点是用位域首先得要定义一个结构体。

阅读更多
文章标签: c语言
个人分类: C语言
下一篇BMX055驱动日记
想对作者说点什么? 我来说一句

Linux c位域操作完整版 经典版

2011年04月17日 4KB 下载

没有更多推荐了,返回首页

关闭
关闭