3

我正在使用带有基本“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

4 回答 4

3

It seems to be a caching/sync problem, similar to those that affects the file sync in common filesystems. I have suffered that problem with my arduino/pyserial... until now?

From http://pyserial.sourceforge.net/pyserial_api.html, if I put the 3 flush commands: ser.flush(), ser.flushInput() and ser.flushOutput() in my program, it seems to work as expected.

于 2013-01-20T12:43:10.917 回答
1

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

于 2011-10-12T01:05:14.493 回答
1

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

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

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

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

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

于 2015-12-02T15:20:25.973 回答
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)

如果缓冲区包含的字节数少于指定的字节数,我并不关心,我有时会这样做,因为它会读取/清除缓冲区中积累的额外数据。

于 2016-01-15T08:20:39.017 回答