【问题标题】:python serial reading issue after a period of inactivity一段时间不活动后的python串行读取问题
【发布时间】:2013-10-02 08:25:25
【问题描述】:

我有一块 arduino 板,它不断地将值转储到串行端口 (USB)。该数据由使用 pySerial 库的 python 脚本的机器读取。我使用的代码如下:

import serial
import time

ser = serial.Serial('/dev/ttyACM0', 9600, timeout=1)

while True:
        ser.flushInput() #Clear the serial input buffer
        print "Value:"
        print ser.readline()
        print ser.readline()
        print ser.readline()

        time.sleep(30) #Wait for 30 seconds

这完美运行并提供以下输出:

Value:

162

162

162

Value:

162

162

162

但是当我在循环中给出比 30 秒大得多的延迟时,比如 1 分钟或更长:

time.sleep(60) #Wait for 60 seconds

我开始遇到问题。正在打印第一组值。从那时起, ser.readline() 总是超时产生空值!

输出:

Value:
162

162

162

Value:



Value:

为什么串行模块会显示这种行为?

最初我用来读取序列值的机器是运行 Raspian linux 的 Raspberry Pi 板。我认为这个问题可能是由于 RPi 在遇到空闲期时将 USB 推迟到低功耗睡眠状态。但是我在笔记本电脑上测试了相同的代码,然后也出现了同样的问题,这意味着它可能是其他问题。

我想构建一个需要 24x7 并在某些事件发生时读取序列值的系统,所以这种行为是不可接受的。

请说明一下这个问题。

【问题讨论】:

  • 为什么最后需要time.sleep(30)声明?
  • 这只是一个测试代码。我想要的实际系统应该像这样工作: 1. 等待 Event1 2. 如果 Event1 发生,获取序列值直到 Event2 发生 3. 继续重复步骤 1 和 2 我正在寻找的 Event1 不会经常发生.所以在完成第 2 步后,下一次事件 1 的发生可能需要 1 分钟以上,之后串行读取给我空值。上面测试代码中的延迟是为了模拟等待Event1的时间延迟。如果超过 1 分钟,则系统未按预期运行!
  • 我无法创建您的设置...无法测试。但是你尝试循环中的ser.inWaiting() 语句,看看在这种情况下它会返回什么。

标签: python python-2.7 serial-port usb pyserial


【解决方案1】:

您可以尝试阅读以下内容:

print ser.read(ser.inWaiting())

我看到您正在使用ser.readline(),它应该等待\n 或直到超时,但是尝试ser.read() 它仍然应该以相同的方式打印出来(只要您收到的内容有@ 987654325@介于两者之间)

现在你说continuously transmitting 这是多久一次?我想知道如果 readline 超时,是否有任何方法可能会丢失传入的数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-01
    相关资源
    最近更新 更多