Python串口通讯

时间:2011-05-18 16:55:24

标签: python arduino serial-port pyserial

我正在开发一个Arduino项目,由于内存限制,我正在将它与Python脚本连接起来。在Python方面,我有一个2维矩阵,包含坐标的各个x,y值,在这个列表中是26000个坐标对。因此,为了澄清所有人的数据结构pathlist[0][0],将返回列表的第一个坐标的X值。在Python中对此列表执行不同的操作等没有任何问题。我遇到麻烦的地方却是以一种有用的方式将这些值通过串行发送到Arduino。

由于串行通信的性质(至少我认为是这种情况),我必须将每个整数作为字符串发送,并且一次只发送一个数字。因此,像345这样的数字将作为3个单独的字符发送,当然,这些字符是3,4,然后是5。

我正在努力寻找一种方法来重建Arduino上的整数。

每当我发送一个值时,它就会接收数据并输出它:

  //Python is sending over the number '25'
  2ÿÿ52
  //Python is sending the number 431.
  4ÿÿ321ÿÿÿ2

Arduino代码是:

String str;
int ds = 4;

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

void loop(){
    if (Serial.available()>0) {
        for (int i=0; i<4; i=i+1) {
            char d= Serial.read();
            str.concat(d);
        }

        char t[str.length()+1];
        str.toCharArray(t, (sizeof(t)));
        int intdata = atoi(t);
        Serial.print(intdata);
    }
}

Python代码如下所示:

 import serial

 s = serial.Serial(port='/dev/tty.usbmodemfd131', baudrate=9600)

 s.write(str(25))

我几乎可以肯定问题不是源于输出方法(Serial.print),当我声明另一个int时,它在输出上格式正常,所以我假设问题在于如何构造intdata变量。

可能有助于诊断此问题的一点是,如果我将Serial.print(intdata)更改为Serial.print(intdata+5),我的结果为2ÿÿ57,我预计30(25 + 5)。无论输入如何,都存在该7。例如,我可以将271写入序列,我的结果如下:

//For input 271.
2ÿÿ771ÿÿÿ7

在我看来,Arduino将值分成两对,并将长度追加到最后。我不明白为什么会发生这种情况。

在我看来,{for循环中添加了ÿ。意味着它们被添加,因为当前没有发送任何内容。但即使通过添加另一个if(Serial.available()>0)条件来修复它,结果仍然不会被视为整数。

另外,在这里使用Pickle是否合适? 我做错了什么?

2 个答案:

答案 0 :(得分:5)

您应该等一下串行数据到达。

Arduino代码应为:

if (Serial.available()){
    delay(100); // Wait for all data.
    while (Serial.available()) {
        char d = Serial.read();
        str.concat(d);
    }
}

此外,您必须在重新使用之前清除字符串。

[编辑]

我忘记提及ÿ== -1 == 255,这意味着Serial.read()它说它无法读取任何内容。

答案 1 :(得分:5)

我会改变通信,所以python在数字之间发送换行符,所以你不依赖于时间:

s.write(str(25)+'\n')

然后在接收方:

void loop(){
    while (Serial.available() > 0) {
        char d = Serial.read();
        if (d == '\n') {
            char t[str.length()+1];
            str.toCharArray(t, (sizeof(t)));
            int intdata = atoi(t);
            Serial.print(intdata);
            str = String();
        }
        else {
            str.concat(d);
        }
    }
}