我正在处理来自GY-87(加速度传感器和陀螺仪传感器模块)的数据,我从中收到的数据的格式为ACCEL_YOUT_HIGH和ACCEL_YOUT_LOW,Y轴分别指定了HIGH和LOW值。有人告诉我“高和低寄存器本质上是8位的,因此两者的组合将是16位有符号数据”。但是我真的不知道如何将它们组合为16位数据。这是一个示例:ACCEL_YOUT_HIGH = 254 ACCEL_YOUT_LOW = 144
我已经尝试过JAVAScript的方法,但是它不能以八度运行。
var number8Bit1 = firstNumber & 0xff;
var number8Bit2 = ((firstNumber >> 8) & 0xff);
因为您的数据是16位带符号的,所以我认为最优雅的解决方案是使用类型转换(如Andy所评论)。
为了使类型转换解决方案正常工作,您可以执行以下操作:
uint8
uint8
元素构建一个数组(首先放置较低的元素,因为我们的系统是little-endian)typecast
两个字节转换为单一int16
元素。double
(您可以跳过此部分,但这是常见的做法-万一您需要对结果应用计算)。代码示例:
high = 254;
low = 144;
res = double(typecast([uint8(low), uint8(high)], 'int16'))
结果:
res = -368
如果您要使用纯数学运算(如Sami所述),则可以按照以下步骤进行操作:
res = high*256 + low;
if (res >= 2^15)
res = res - 2^16; %Correct the sign.
end
我觉得不太优雅,因为if
声明不清楚。
您还可以使用位位移,bitor
以及typecast
(如克里斯评论)。
看起来像C代码res = (short)((high << 8) | low)
:
res = typecast(uint16(bitor(bitshift(high, 8), low)), 'int16');
我发现它不如第一种解决方案优雅,因为在MATLAB / Octave中移位和或运算不是自然的。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句