我正在使用一个带有ATMEL ATmega128的Synapse无线模块。我已将ADXL345 3轴加速度计连接到它,我正在通过I2C与它通信。 Synapse模块使用python的一个子集作为脚本语言。
当我读取XYZ数据时,我得到一个6字节的数组。 EC FF EF FF 14 01
输出数据是二进制补码,DATAx0作为最低有效字节,DATAx1作为最高有效字节。因此,在上面的示例中,EC FF是x轴的输出。
我正在努力将其转化为G力量。数据表说在全分辨率模式下(我在),输出分辨率随g范围增加 由范围位设置以保持4 mg / LSB比例因子。
我尝试了以下内容:
x0 = ord(data[0])
x1 = ord(data[1])
raw = x0+(256*x1)
但是raw的价值没有任何意义。如何将这两个字节转换为有符号整数?
其他信息 当我打电话来阅读adxl345:
data = readAdxls(6)
它返回从外部I2C设备读回的字节串。
Xlsb = data[0] # EC - 236
Xmsb = data[1] # FF - 255
Ylsb = data[2] # EF - 239
Ymsb = data[3] # FF - 255
Zlsb = data[4] # 14 - 20
Zmsb = data[5] # 01 - 1
因此,Xlsb是最不重要的字节,而Xmsb是最重要的字节。这些是整数
我想我只是不理解二进制补码以及如何将这两个整数/字节组合成有符号整数。
答案 0 :(得分:0)
我不确定您使用ord()
做了什么...... ord(c)
需要c
个字符,并输出其ASCII字符代码。
无论哪种方式,要将表示为二进制补码的数字转换为Python中的有符号整数,就可以这样做:
def tc(val, bits):
if val >= 2**(bits-1):
return val - (2**bits)
return val
>>> tc(0xECFF, 16)
-4865
虽然至于如何用你的数据实际调用该函数,我需要看看你的数据在Python中的样子。你希望看到G-force有哪些数字?