一段时间不活动后python串行读取问题
我有一个arduino板,它不断地将值转储到串行端口(USB)。该数据由使用pySerial库的python脚本的机器读入。我使用的代码如下:一段时间不活动后python串行读取问题,python,python-2.7,serial-port,usb,pyserial,Python,Python 2.7,Serial Port,Usb,Pyserial,我有一个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:"
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推迟到一些低功耗睡眠。但我在我的笔记本电脑上测试了相同的代码,然后也出现了相同的问题,这意味着可能是其他问题
我想构建一个系统,需要全天候运行,并在某些事件发生时读取序列值,因此这种行为是不可接受的
请解释一下这个问题。您可以试着阅读以下内容:
print ser.read(ser.inWaiting())
我看到您正在使用ser.readline()
,它应该等待\n
或直到超时,但请尝试一下ser.read()
,它仍将以相同的方式打印出来(只要您收到的内容之间有\n
)
现在你说持续传输的频率是多少?。我想知道如果读线超时,是否有任何方法会丢失输入的数据。为什么需要
时间。最后是sleep(30)
语句?这只是一个测试代码。我想要的实际系统应该是这样工作的:1。等待事件12。如果发生事件1,则获取序列值,直到事件2发生3。继续重复步骤1和步骤2我正在寻找的事件1并不经常发生。因此,在完成步骤2之后,可能需要1分钟以上的时间才能发生下一次Event1,之后串行读取会给出空值。上述测试代码中的延迟用于模拟等待Event1的时间延迟。如果超过1分钟,系统将无法正常工作!我无法创建您的设置类型。。。无法测试。但您可以在循环中尝试ser.inWaiting()
语句,看看在这种情况下它返回什么。