我正在尝试在Raspberry PI和Ardunio之间建立连接,其中Python在PI上运行。目标是验证Arduino是否已连接并发送正确的值,连接似乎已建立,因为我在Python终端上收到,但a
值未正确,它递增2,有时更多不止两个。
这可能是连接延迟问题吗?串口(USB)问题?
serial_text.ino (在Arduino上运行):
char dataString[50] = {0};
int a =0;
void setup() {
Serial.begin(9600); //Starting serial communication
}
void loop() {
// a++; // a value increase every loop
//sprintf(dataString,"%02X",a); // convert a value to hexa
Serial.println(++a); // send the data
delay(1000); // give the loop some break
}
Serial_test.py (在PI上运行):
import serial
ser = serial.Serial('/dev/ttyACM0',9600)
s = [0,1]
while True:
read_serial=ser.readline()
s[0] = str(int (ser.readline(),16))
print "a value from controller = ", s[0]
//print read_serial
输出(在PI屏幕上):
更新 我做了一些改变,但它仍然是同样的问题,这里是变化:
serial_text.ino (在Arduino上运行):
int a =0;
void setup() {
Serial.begin(9600); //Starting serial communication
}
void loop() {
a++;
Serial.println(a); // send the data
delay(1000); // give the loop some break
}
对于Python,我只改变了这一行:
s[0] = str(int (ser.readline(),16))
TO:
s[0] = str(int (ser.readline(),10))
我也删除了//print read_serial
以防万一。
输出:
答案 0 :(得分:2)
好的,基本上这里发生了什么:当你做这样的事情时:
Serial.println(a);
它将数字作为ASCII编码的十进制发送,所以基本上如果你发送整数值12,它将发送字符串" 12"。递增部分在这里工作正常。
为什么跳绳会发生?如果你仔细查看你的代码,你可以看到,在while
循环的每次迭代中,有两次调用ser.readline()
,这使得跳过每一个数字。
间隙较大的原因是您收到一个十进制字符串并将其视为十六进制字符串。看看这里发生了什么:
>>> int("49", 16)
73
>>> int("51", 16)
81
在十进制中它只是两个的差异,但在十六进制中它是八的差异 - 这解释了更大的差距。