python和arduino中serial.readline()开头的随机字符

时间:2014-08-06 11:24:26

标签: python serialization serial-port arduino raspberry-pi

当我执行serial.readline()时,我得到随机字符,有时它是其他的umbers,有时它是完整的消息。输出应为“1,2”或“2,2”

以下是serial.readline()输出的几个屏幕截图。 我曾尝试在serial.readline()之前设置延迟,但它并没有什么区别。 开头通常会有一个奇怪的角色:

enter image description here

enter image description here

我也收到了一些奇怪的消息: enter image description here

程序中有一个问题会导致程序交出,因为有时我只会收到一个空行。

有没有办法从串口获得一致的输出?

这是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()并得到相同的输出。

4 个答案:

答案 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()只会在缓冲区中给你一行 - 而不是缓冲区中的所有内容。

您是否有可能在重新启动之前尝试发送/接收数据?按钮弹跳怎么样 - 十几个高/低状态检测可能会搞砸了什么?