我正在尝试从Arduino接收数据(数组)到我的Python脚本中,直到我尝试接收5或更大的数字之前,一切似乎都工作正常。一些搜索表明,这可能与Pyserial一次仅读取一定数量的字节有关,但是我无法理解我需要更改什么才能读取数组。请看一下我的代码: Arduino代码:
int data[] = {1245,2211,33498,4212,5235};
void setup() {
Serial.begin(9600);
}
void loop() {
for (int i=0; i<5; i++)
{
Serial.println(data[i]);
}
//Commented this out because it'd give me garbage value in python
//delay(1000);
}
Python代码:
import serial
ser1 = serial.Serial('COM6', 9600)
#receive some data
for i in range(5):
arduinoData = ser1.readline().decode('ascii')
print(arduinoData)
运行此代码后,我得到:
1245
2211
-32038(为什么将此值转换为负数?)
4212
5235
答案 0 :(得分:4)
这是Arduino端的溢出错误。
一个有符号整数(int
)可以取从-32768
到32767
的值(因为它是两个字节,每个8
位构成一个16
字节数字,范围从-2^15
到2^15-1
)。由于33498
大于该上限,因此它会绕到负数。
要兑现,请将您的整数数组更改为支持比32767
更大的正整数的数据类型,例如uint_16
。
如果您有兴趣,我们可以确切地理解为什么负数是-32038
。
这是因为所有有符号整数都使用two's complement表示。
在该系统中,1000001011011010
(33498
)是-32038
。
要进行该转换,我们将其取反(通过将其所有位取反并添加1
来获得正的表示形式:
1000001011011010 --> 0111110100100101 --> 0111110100100110 == 32038
答案 1 :(得分:0)
您的作业
int data[] = {1245,2211,33498,4212,5235};
超出int
的正数范围的数字的溢出,因此data
数组已经包含负数。
修复您的C代码
unsigned int data[] = {1245,2211,33498,4212,5235};
按预期发送数据。