Python pyserial和失控的CPU使用
MacOS 10.7.3、python 2.5 我正在使用pyserial打开与外部服务器的连接。连接打开为:Python pyserial和失控的CPU使用,python,pyserial,Python,Pyserial,MacOS 10.7.3、python 2.5 我正在使用pyserial打开与外部服务器的连接。连接打开为: HOST = '10.0.0.1' PORT = '16010' theURL = 'socket://' + HOST + ':' + PORT conn = serial.serial_for_url(theURL, baudrate=115200) conn.timeout = 2 然后读数如下所示: try: while len(rawData) == 0 and s
HOST = '10.0.0.1'
PORT = '16010'
theURL = 'socket://' + HOST + ':' + PORT
conn = serial.serial_for_url(theURL, baudrate=115200)
conn.timeout = 2
然后读数如下所示:
try:
while len(rawData) == 0 and self.shutdown == False:
rawData = conn.readline()
except:
some error handling code...
self.plugin.conn = Serial(..., timeout = 1)
...
if not self.shutdown:
rawData = self.plugin.conn.read(1)
if rawData:
rawData += self.plugin.conn.read(self.plugin.conn.inWaiting())
else:
raise Exception("timeout")
问题是,如果我在10.0.0.1:16010关闭服务器,代码将继续运行,但cpu使用率将达到100%。不会抛出错误,因此从不输入except
这看起来像是pyserial中的一个问题,但可能这里的某个人以前遇到过这个问题,并且知道如何检测丢失的连接,以便能够优雅地处理这种情况
谢谢。如果您不依赖于
.readline()
您可以这样做:
try:
while len(rawData) == 0 and self.shutdown == False:
rawData = conn.readline()
except:
some error handling code...
self.plugin.conn = Serial(..., timeout = 1)
...
if not self.shutdown:
rawData = self.plugin.conn.read(1)
if rawData:
rawData += self.plugin.conn.read(self.plugin.conn.inWaiting())
else:
raise Exception("timeout")
我不确定我是否正确理解了您的意图,因此您可能需要调整…您的CPU使用率被固定的事实可能表明readline调用没有阻塞到超时,但会立即返回。所以如果你的正常超时 是2,您可以使用:
from time import time
try:
while len(rawData) == 0 and self.shutdown == False:
before = time()
rawData = conn.readline()
if (len(rawData)==0) and ((time()-before)<2):
raise Exception("Early readline return.")
except:
some error handling code...
从时间导入时间
尝试:
当len(rawData)==0且self.shutdown==False时:
before=时间()
rawData=conn.readline()
如果(len(rawData)==0)和((time()-before)可以找到很好的解决方案:
Readline适用于此应用程序,因为传入记录的长度不同,但所有记录都\n终止。如果捕获错误的唯一方法是一次读取字符并以这种方式构建字符串,我想它可以工作……但这似乎是不必要的工作。但是,问题是不会引发异常,因此,错误捕获g不起作用。我测试了这种方法,但仍然得到了相同的结果。没有错误。啊,当然我忘了提到必须设置读取超时:Serial(…,timeout=1)
pyserial或底层套接字模块似乎有问题。但是,当远端退出时,pyserial肯定不会报告错误。我将提交错误报告。