使用Arduino和RaspberryPi进行bithift

时间:2015-02-26 17:04:32

标签: python arduino bit-shift

我一直在测试我从Radio-shack(L3G4200D 3轴陀螺仪)中拾取的硬件我使用了Parallax在Arduino上提供的示例代码,以了解如何使用I2C和正确的缓冲区来读取/写。我想用我的Raspberry Pi来使用它。我将设备连接到RaspberryPi,现在使用Python I2C库编写和读取数据,但在尝试将MSB和LSB合并在一起时,我看到了不同的结果。在进一步测试Arduino和RPI的Python代码如何处理BitShift之后的差异后,我发现了这些结果

Aurduino:

int msb=255;

Serial.println(msb);
Serial.println(msb,BIN);
Serial.println((msb<<1),BIN);
Serial.println((msb<<2),BIN);
Serial.println((msb<<3),BIN);
Serial.println((msb<<4),BIN);
Serial.println((msb<<5),BIN);
Serial.println((msb<<6),BIN);
Serial.println((msb<<7),BIN);
Serial.println((msb<<8),BIN)
Serial.pringln((msb<<8));

输出:

255
111111110
1111111100
11111111000
111111110000
1111111100000
11111111000000
111111110000000
1111111100000000
111111111111111100000000
-255

的Python(树莓派)

msb = 255
print str(msb)
print bin(msb)
print bin((msb<<1))
print bin((msb<<2))
print bin((msb<<3))
print bin((msb<<4))
print bin((msb<<5))
print bin((msb<<6))
print bin((msb<<7))
print bin((msb<<8))
print (msb<<8)

输出:

255
0b11111111
0b111111110
0b1111111100
0b11111111000
0b111111110000
0b1111111100000
0b11111111000000
0b111111110000000
0b1111111100000000
65280

你看到它改变了吗? (Arbino中的msb&lt;&lt; 8)结果是二进制疯狂,并增加了8个1&#39; s。什么24位?我不明白,但返回的整数是-255一个整数。剂量Python有一个带符号的16位整数?我发现的是Python分别标记数​​字。

最后,我将使用lsb

来输入msb
rate = (msb<<8)|lsb

此外,我可以更进一步,使用Lejos和Java将这部分带到我的EV3 Lego Mindstorms。我猜Java会像Arduino那样签署整数。

1 个答案:

答案 0 :(得分:0)

这是我在第16章中使用python代码中的有符号位

所做的
msb = 255
lsb = 0

shift=(msb<<8)
if (shift & 0b1000000000000000):
    result=(32768 - ((shfit & 0b0111111111111111) | lsb)) * -1
else:
    result=(shift | lsb)

print (result,bin(msb),bin(lsb))

输出:

-256, '0b11111111', '0b00000000'

似乎可以使用-32768到32768的整个范围