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

时间:2017-08-02 13:46:19

标签: 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()
{  

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

Python代码

import argparse
import numpy
import time
import serial 
import struct

ser = serial.Serial('/dev/ttyACM0', 9600)
while True:
    b = ser.read(4)

    i = struct.unpack('i' ,b)
    print(i)

输出:

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

谢谢!

维克

1 个答案:

答案 0 :(得分:0)

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

首先要注意的是int在两个平台上的大小不同。 Arduino int是带符号的16位int,-32768 - &gt;你的python int是一个32位的int。当然,返回的数字远远超出任何16位数的范围。

我建议将Arduino中的int更改为unsigned int,然后将python解包格式字符串更改为H(无符号短)。或者,将Arduino保留为int并将您的python解包格式字符串更改为&#39; h&#39; (简短)看看这对你有什么影响。哦,当然你应该改为b = ser.read(2),因为它们现在都是2字节的整数。

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

Serial.write(myInts, 12);

最后,最简单的方法就是使用Serial.write(str)并发送一个字符串。然后在python端简单地将字符串转换为您选择的整数类型。