dan*_*nem 9 python serial-port arduino 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
Run Code Online (Sandbox Code Playgroud)
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);
}
}
Run Code Online (Sandbox Code Playgroud)
Python代码如下所示:
import serial
s = serial.Serial(port='/dev/tty.usbmodemfd131', baudrate=9600)
s.write(str(25))
Run Code Online (Sandbox Code Playgroud)
我几乎可以肯定问题不是源于输出方法(Serial.print),当我声明另一个int时,它在输出上格式正常,所以我假设问题在于如何intdata构造变量.
值得注意的一两件事,可能有助于诊断这个问题是,如果我改变Serial.print(intdata)对Serial.print(intdata+5)我的结果是2ÿÿ57,在这里我希望30(25 + 5).无论输入如何,都存在该7.例如,我可以将271写入序列,我的结果如下所示:
//For input 271.
2ÿÿ771ÿÿÿ7
Run Code Online (Sandbox Code Playgroud)
在我看来,Arduino将值分成两对,并将长度追加到最后.我无法理解为什么会发生这种情况.
在我看来,它也ÿ被添加到for循环中.意味着它们被添加,因为当前没有发送任何内容.但即使通过添加另一个if(Serial.available()>0)条件来修复它,结果仍然不会被视为整数.
那么,在这里使用Pickle会不合适?我究竟做错了什么?
您应该等一下串行数据到达.
Arduino代码应该是:
if (Serial.available()){
delay(100); // Wait for all data.
while (Serial.available()) {
char d = Serial.read();
str.concat(d);
}
}
Run Code Online (Sandbox Code Playgroud)
此外,您必须在重新使用之前清除字符串.
[编辑]
我忘记提及ÿ== -1 == 255这意味着Serial.read()它说它无法读取任何内容.
我会改变通信,所以python在数字之间发送换行符,所以你不依赖于时间:
s.write(str(25)+'\n')
Run Code Online (Sandbox Code Playgroud)
然后在接收方:
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);
}
}
}
Run Code Online (Sandbox Code Playgroud)