我正在开发一个 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)
to Serial.print(intdata+5)
我的结果是2ÿÿ57
,我期望 30 (25+5)。无论输入如何,这个 7 都会存在。例如,我可以将 271 写入序列号,结果如下所示:
//For input 271.
2ÿÿ771ÿÿÿ7
在我看来,Arduino 将这些值分成两对,并将长度附加到末尾。我不明白为什么会发生这种情况。
在我看来,ÿ
被添加到 for 循环中。这意味着它们被添加是因为当前没有发送任何内容。但即使通过添加另一个来解决这个问题if(Serial.available()>0)
有条件时,结果仍然不被视为整数。
另外,会使用Pickle http://en.wikipedia.org/wiki/Pickle_%28Python%29这里合适吗?
我究竟做错了什么?