重新组装从Arduino发送到Python的串行数据

重新组装从Arduino发送到Python的串行数据,python,python-3.x,arduino,Python,Python 3.x,Arduino,我试图通过arduino上的Serial.write()一次发送六个整数,并将它们发送到python。到目前为止,我已经成功地将整数转换成字节指针(我想这就是名称)并通过串行方式发送它们。然而,当我尝试在python端重新组装它们时,我得到了一些我不想看到的奇怪数字 Arduino代码: int myInts[6]= {1455, 1446, 6766, 974, 365, 455}; void setup() { Serial.begin(9600); } void loop() {

我试图通过arduino上的Serial.write()一次发送六个整数,并将它们发送到python。到目前为止,我已经成功地将整数转换成字节指针(我想这就是名称)并通过串行方式发送它们。然而,当我尝试在python端重新组装它们时,我得到了一些我不想看到的奇怪数字

Arduino代码:

int myInts[6]= {1455, 1446, 6766, 974, 365, 455};

void setup()
{
  Serial.begin(9600);
}
void loop()
{  

  byte *p = (byte)myInts;
  for(byte i = 0; i < sizeof(myInts); i++){
    Serial.write(p[i]);
  }
}
输出:

(-1090650113) (285341695,) (10683141,) (-1090650177,) (285341695,) (10683141,)

谢谢


维克

我将提供几种选择最简单的一个列在最后。

首先您应该意识到,
int
在两个平台上的大小不同。Arduino
int
是一个有符号的16位int,-32768->32767。您的python
int
是32位的int。当然,返回的数字远远超出了任何16位数字的范围

我建议将Arduino中的
int
更改为
unsigned int
,然后将python解包格式字符串更改为
H
(unsigned short)。或者,将Arduino保留为
int
,并将python解包格式字符串更改为'h'(短),看看这是否对您有影响。当然,您应该改为
b=ser.read(2)
,因为现在这些都是2字节整数

接下来,Arduino的
Serial.write()
方法支持单字节、字符串或长度为的缓冲区。不是字节指针。因此,虽然我面前没有Arduino要测试,但我认为您应该使用命令的
Serial.write(buf,len)
形式,并去掉“字节指针”,这在任何Arduino文档中都没有提到:

Serial.write(myInts, 12);

最后,最简单的方法是使用
Serial.print(str)
或Serial.println(str)发送字符串。然后在python端,只需将字符串转换为您选择的整数类型。

我将提供几种替代方法最简单的一个列在最后。

首先您应该意识到,
int
在两个平台上的大小不同。Arduino
int
是一个有符号的16位int,-32768->32767。您的python
int
是32位的int。当然,返回的数字远远超出了任何16位数字的范围

我建议将Arduino中的
int
更改为
unsigned int
,然后将python解包格式字符串更改为
H
(unsigned short)。或者,将Arduino保留为
int
,并将python解包格式字符串更改为'h'(短),看看这是否对您有影响。当然,您应该改为
b=ser.read(2)
,因为现在这些都是2字节整数

接下来,Arduino的
Serial.write()
方法支持单字节、字符串或长度为的缓冲区。不是字节指针。因此,虽然我面前没有Arduino要测试,但我认为您应该使用命令的
Serial.write(buf,len)
形式,并去掉“字节指针”,这在任何Arduino文档中都没有提到:

Serial.write(myInts, 12);

最后,最简单的方法是使用
Serial.print(str)
或Serial.println(str)发送字符串。然后在python端,只需将字符串转换为您选择的整数类型。

非常感谢!这是一个完美的回答!过去,我使用的是arduino提供的Serial.println(),但在python端我得到了一些奇怪的字符串,比如“/xff”或“/xfe”。我还读到Serial.write()更适合发送数据,这就是为什么我想使用字节,因为我担心使用字符串会导致问题,就像使用Serial.print()一样。你觉得呢?@VikramB我觉得在Arduino上弦乐最简单。我很高兴能提供帮助,如果我觉得我的答案是最好的,希望你点击复选标记“接受”我的答案。我已经尝试通过串行发送字符串。通过将我想发送的整数转换为字符串来写入,但我得到了:“没有匹配的函数用于调用‘HardwareSerial::write(string&)’”@Vikram。我误读了文档:“write()Description将二进制数据写入串行端口。此数据以字节或字节序列的形式发送;要发送代表数字的字符,请使用print()函数。因此,请使用print()或println()。很抱歉造成混淆。非常感谢!这是一个完美的回答!过去,我使用的是arduino提供的Serial.println(),但python端出现了一些奇怪的字符串,例如“/xff”或“/xfe”。我还阅读了该Serial.write()更适合发送数据,这就是我想使用字节的原因,因为我担心使用字符串会导致问题,就像使用Serial.print()一样。你认为呢?@Vikram我认为字符串在Arduino上最简单。我很高兴能提供帮助,希望你点击复选标记“接受”“如果我觉得我的答案是最好的,我会给出我的答案。我曾尝试通过Serial.write将我想要发送的整数转换为字符串来发送字符串,但我得到了:“没有匹配的函数来调用‘HardwareSerial::write(string&)’”@vikram。我误读了文档:“write()Description将二进制数据写入串行端口。此数据以字节或字节序列的形式发送;要发送表示数字位数的字符,请使用print()函数。因此,请使用print()或println()。对于混淆,我深表歉意。