【发布时间】: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