3

我想每隔一段时间读取串行端口上的数据和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)

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

样本输出:

504

504

504

504

505

505

505

...

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

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

4

2 回答 2

5

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

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

while True:
    s.flushInput()
    print s.readline()
    time.sleep(.5)

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

于 2013-11-09T11:56:23.257 回答
1

你正在尝试做的事情是很有可能的。但是,您需要考虑(并解决)各种竞争条件。Arduino 可能会在 Python 代码处于休眠状态时开始/完成发送数据。这可能正是您所希望的。但是,Arduino 也可能在 Python 代码运行时开始发送数据。可能会出现各种重叠情况。

在我看来, readline() 并没有你想象的那么有用。当然, readline() 将返回一行。但是,它可能只返回一行的最后一部分。第一部分(取决于时间)可能会被刷新。

我的建议是让来自 Arduino 自记录的数据流(字节)。换句话说,类似于<value>,其中 value 是您真正想要从 Arduino 获得的数据。

Python 代码可能类似于

while True:  
#
# Loop reading for a '<' character. Skip everything until you get a '<'. 
#
  while True:  
    if s.inWaiting() > 0:  
      c = s.read()  
      if c == '<':  
        break  
#
# Read the actual data value. Stop when we get to a '>'. 
#
  value = ''
  while True:
    if s.inWaiting() > 0:
      c = s.read()
      if c == '>':
        break
      value = value + c
#
# We now have the value we actually care about. However, there might
# be more data in the buffer. If the buffer is now empty we are done.
# If the buffer is not empty, then we need to start over.
#
  if s.inWaiting() == 0:
    break

总体思路应该很清楚。从输入流中读取完整的值,直到输入流为空。如果您碰巧在输入流包含不完整的值时开始阅读,Python 代码将自动重新同步。

让我为任何和所有 Python 编码错误道歉。我的 Python 生锈了。

于 2013-11-09T15:51:00.790 回答