读取串行端口 - 忽略写入串行端口一段时间的数据

时间:2013-11-09 09:54:53

标签: python serial-port arduino

我想按时间间隔在串口上读取数据和Arduino。所以基本上就像

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

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

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

    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,但我对其他语言开放。

2 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

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

我的建议是使来自Arduino的数据流(字节)自我记录。换句话说,就像<value&gt;之类的东西,其中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生疏了。