9

我正在开发一个 Arduino 项目,由于内存限制,我正在将它与 Python 脚本连接。在 Python 端,我有一个二维矩阵,其中包含相应的 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)为,我预计会出现 30 (25+5)。无论输入如何,这个 7 都存在。例如,我可以将 271 写入串行,我的结果如下所示:Serial.print(intdata+5)2ÿÿ57

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

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

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

另外,在这里使用Pickle合适吗?我究竟做错了什么?

4

2 回答 2

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);
        }
    }
}
于 2011-05-23T18:18:18.880 回答
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()它说它什么都读不了。

于 2011-05-18T17:22:01.133 回答