如何使用Pyserial从Arduino接收5位数据?

时间:2018-08-25 18:42:23

标签: python arduino pyserial

我正在尝试从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

2 个答案:

答案 0 :(得分:4)

这是Arduino端的溢出错误。

一个有符号整数(int)可以取从-3276832767的值(因为它是两个字节,每个8位构成一个16字节数字,范围从-2^152^15-1)。由于33498大于该上限,因此它会绕到负数。

要兑现,请将您的整数数组更改为支持比32767更大的正整数的数据类型,例如uint_16


如果您有兴趣,我们可以确切地理解为什么负数是-32038

这是因为所有有符号整数都使用two's complement表示。

在该系统中,100000101101101033498)是-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};

按预期发送数据。