读取串行端口 - 在特定时间内忽略写入串行端口的部分数据

Far*_*Joe 3 python serial-port arduino

我想每隔一段时间在串行端口上读取数据和 Arduino。所以基本上像

  1. 读一读
  2. 等待
  3. 读一读
  4. 等待
  5. 拿 ...

等等。

我面临的问题是端口将缓冲其信息,因此只要我调用等待函数,串行端口上的数据就会开始缓冲。一旦等待函数完成,我尝试再次读取数据,但我从缓冲区的开头读取数据,数据不再是当前的,而是在等待函数开始时读取的数据。

我的问题是,是否有一种我不知道的方法可以忽略在等待期间读入的数据部分,而只读取当前在串行端口上传送的内容?

到目前为止,我有类似的东西:

import serial

s = serial.Serial(path_to_my_serial_port,9600)

while True:
    print s.readline()
    time.sleep(.5)
Run Code Online (Sandbox Code Playgroud)

出于解释目的,我让 Arduino 输出自它开始循环以来的时间。通过python代码,每次调用的时间应该相隔半秒。通过串行输出,时间在不到一毫秒的时间内增加。无论睡眠时间如何,这些值都不会改变。

示例输出:

504

504

504

504

505

505

505

...
Run Code Online (Sandbox Code Playgroud)

作为我最终目标的一个想法,我想测量端口的值,等待一个时间延迟,然后看看值是多少,再等一下,看看然后是什么值,再等一下。

我目前正在Python为此使用,但对其他语言持开放态度。

小智 5

如果您想在执行下一次读取之前清除输入缓冲区中可能存在的内容,可以使用 s.flushInput() 刷新输入缓冲区(您也可以使用 s.inWaiting() 检查输入缓冲区中的字节) )。

因此,添加刷新调用将确保您读取从那一刻起到达的任何字节:

while True:
    s.flushInput()
    print s.readline()
    time.sleep(.5)
Run Code Online (Sandbox Code Playgroud)

您可能还需要考虑使用读取超时(当您使用 timeout 参数创建 serial.Serial 对象时)。在这种情况下,您需要在超时时处理空读数,但您可以保证,如果发送方因任何原因停止,您的阅读器不会永远等待。