2017-08-02 99 views
1

我想通过Arduino上的Serial.write()一次发送六个整数,并将它们发送给python。到目前为止,我已经设法将整数转换为字节指针(我认为这是名称)并通过串行发送它们。但是,当我尝试在python端重新组装它们时,我收到了一些我不想看到的奇怪数字。重组从Arduino发送到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,)

谢谢!

Vik

回答

0

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

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

我建议将您在Arduino中的int更改为unsigned int,然后将您的python解压缩格式字符串更改为H(无符号短)。或者,将Arduino作为int并将您的python解压缩格式字符串更改为'h'(简写),然后查看它是否对您有所帮助。哦,当然你应该改为b = ser.read(2),因为这些现在都是2字节整数。

接下来,Arduino的Serial.write()方法支持一个字节,一个字符串或一个长度的缓冲区。不是一个字节指针。所以虽然我没有Arduino在我面前进行测试,但我认为您应该使用命令的Serial.write(buf,len)形式并摆脱“字节指针”,这是我从未在任何Arduino文档中提到过的:

Serial.write(myInts, 12); 

最后,最容易做的事情很简单,就是用Serial.write(str)和整个发送一个字符串。然后在python端简单地将字符串转换为您选择的整数类型。

+0

非常感谢!这是一个完美的回复!在过去,我使用arduino中的Serial.println(),但是我在python方面得到了一些奇怪的字符串,例如“/ xff”或“/ xfe”。我也读过Serial.write()更适合发送数据,这就是我想使用字节的原因,因为我担心使用Strings会导致问题,就像使用Serial.print()一样。你怎么看? – VikramB

+0

@VikramB我认为字符串在Arduino上最简单。如果我觉得我的答案是最好的,我希望你能够点击复选标记“接受”我的答案。 – TomServo

+0

我已经尝试发送一个字符串通过Serial.write通过投我想发送到一个字符串的整数,但我得到:“没有匹配的函数调用'HardwareSerial ::写(字符串&)'” – VikramB