当我执行serial.readline()时,我得到随机字符,有时它是其他的umbers,有时它是完整的消息。输出应为“1,2”或“2,2”
以下是serial.readline()输出的几个屏幕截图。 我曾尝试在serial.readline()之前设置延迟,但它并没有什么区别。 开头通常会有一个奇怪的角色:
我也收到了一些奇怪的消息:
程序中有一个问题会导致程序交出,因为有时我只会收到一个空行。
有没有办法从串口获得一致的输出?
这是arduino代码:
void setup() {
// initialize the LED pin as an output:
pinMode(ledPin, OUTPUT);
// initialize the pushbutton pin as an input:
pinMode(buttonPin, INPUT);
Serial.begin(9600);
}
void loop(){
// read the state of the pushbutton value:
buttonState = digitalRead(buttonPin);
// check if the pushbutton is pressed.
// if it is, the buttonState is HIGH:
if (buttonState == HIGH) {
// turn LED on:
digitalWrite(ledPin, HIGH);
Serial.println("1,2");
}
else {
// turn LED off:
digitalWrite(ledPin, LOW);
Serial.println("2,2");
}
}
这是python代码:
ser = serial.Serial('/dev/ttyUSB0', 9600)
line=ser.readline()
coord= line.strip()
print coord
编辑: 我尝试在ser.open()之后放入ser.flushInput()并得到相同的输出。
答案 0 :(得分:1)
您是否刷新了串行缓冲区
ser.flushInput()
答案 1 :(得分:1)
我在pyserial和Arduino之间进行接口时遇到了同样的问题。这可能是一个旧帖子,但万一其他人遇到同样的麻烦,我通过插入来解决我的问题:
ser.flushInput()
...在ser.readline()
来电之前。
答案 2 :(得分:0)
How to Read serial data from an Arduino in Linux
这里没什么好看的。我正在获得当前端口配置,将输入/输出速度设置为9600波特,将数据预期设置为每字8位,没有奇偶校验位且没有停止位,设置规范模式,然后将这些更改提交回串口。
如果我没弄错的话,你必须在通过串口连接时改变上面提到的设置。
你没有提到它,但我猜你正在使用pySerial库。无论您是否可以使用正确的设置通过串行连接。 API的构造函数允许下面提到的所有参数: Pyserial Library
我没有测试过这种方法,因为我在C而不是Python中遇到了类似的问题。
答案 3 :(得分:0)
如果你把它分解成更简单的东西会怎么样?
关于Arduino:
void setup()
{
Serial.begin(9600);
}
int i = 0;
void loop()
{
delay(1000);
Serial.print("Hello World ");
Serial.println(i);
i++;
}
在Python REPL中......
import serial
ser = serial.Serial('/dev/ttyUSB0', 9600)
while(1):
ser.readline()
您应该注意的第一个行为是,当您启动串行连接时,Arduino会重新启动。这需要几秒钟。
您应该观察到的第二个行为是(如果您在缓慢地在REPL中输入此内容),当while(1)循环开始时,您将获得自启动串行连接以来累积的所有串行数据。输入所有内容需要几秒钟,所以当我在ser.readline()之后按Enter键时,我看到:
'Hello World 1\r\n'
'Hello World 2\r\n'
'Hello World 3\r\n'
我只提到这一点,以确保你熟悉在上一次与Arduino进行串行通信时搞砸了两件事:连接后需要时间重启,以及串行数据缓冲。 readline()只会在缓冲区中给你一行 - 而不是缓冲区中的所有内容。
您是否有可能在重新启动之前尝试发送/接收数据?按钮弹跳怎么样 - 十几个高/低状态检测可能会搞砸了什么?