从Arduino读取线的PySerial延迟

时间:2011-10-12 00:57:22

标签: python arduino readline pyserial

我正在使用带有基本“DigitalReadSerial”设置的arduino uno,如下所示:http://arduino.cc/en/Tutorial/DigitalReadSerial

如果我使用arduino IDE附带的串行监视器,它会立即显示按下按钮后的任何更改。

这就是我想要的pyserial,取决于按钮是否按下0或1。 (最终触发计时器)

只是为了测试它,我把它扔在一起,而不是最漂亮,但它似乎读出了按钮状态,但是有20秒的延迟。

    import serial
    ser = serial.Serial()
    ser.setPort("COM2")
    ser.baudrate = 9600
    ser.open()
    while 1==1:
        ser.readline()

有没有人有任何想法?

4 个答案:

答案 0 :(得分:3)

它似乎是一个缓存/同步问题,类似于影响公共文件系统中文件同步的问题。我的arduino / pyserial遇到了这个问题......到现在为止?

http://pyserial.sourceforge.net/pyserial_api.html开始,如果我在程序中放入3个flush命令:ser.flush(),ser.flushInput()和ser.flushOutput(),它似乎按预期工作。

答案 1 :(得分:1)

您是否在Arduino代码中使用Serial.printSerial.println?如果是前者,它不会发出回车,代码中的ser.readline()将等待一个。

答案 2 :(得分:1)

我刚遇到同样的问题,我确信PySerial没有延迟。

延迟是由我的PyQT线程延迟造成的。我通过arduino中的串口打印一行/ 0.1秒但我在QThread中读取串行输出,延迟时间为0.5秒,这就是问题。随着时间的推移,延迟会增加。

我通过从项目中提取pyserial读取代码来验证。请记住,读取频率不应低于写入频率

从您的代码中,我假设您的python环境,如果不够快,无法及时从arduino接收数据

尝试通过在两次打印之间插入一个小延迟来降低串行打印速度。

答案 3 :(得分:1)

只有在有东西要读的情况下才开始读取,否则它会在等待eol时阻塞,或者它可能会在读取串行缓冲区的一半时间超时,截断你的字符串。这样可以加快循环速度,并允许您使用短暂的超时,非常适合循环使用多个端口。使用pyserial3.0 ...

while 1:
    if ser.in_waiting > 0:
        data = ser.readline()
        print(data)

还尝试类似

的内容
while 1:
    if ser.in_waiting > 0:
        data = ser.read(32)
        print(data)

如果缓冲区包含的字节数少于指定的字节,那么我有时会这样做,因为它会读取/清除缓冲区中已建立的额外数据。