我试图通过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)
谢谢!
维克
答案 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端简单地将字符串转换为您选择的整数类型。