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 self.shutdown == False:
rawData = conn.readline()
except:
some error handling code...
问题是,如果我在10.0.0.1:16010处杀死服务器,代码会继续运行,但cpu使用率会达到100%。不会抛出任何错误,因此永远不会输入。
这看起来像pyserial中的一个问题,但也许有人在此之前遇到过这个问题,并且知道如何检测丢失的连接,以便可以优雅地处理这种情况。
感谢。
答案 0 :(得分:0)
如果您不依赖.readline()
,可以这样做:
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")
我不确定我的意图是否合适所以你可能需要调整......
答案 1 :(得分:0)
您的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...
答案 2 :(得分:0)
here找到了一个很好的解决方案:
class ReadLine:
def __init__(self, s):
self.buf = bytearray()
self.s = s
def readline(self):
i = self.buf.find(b"\n")
if i >= 0:
r = self.buf[:i+1]
self.buf = self.buf[i+1:]
return r
while True:
i = max(1, min(2048, self.s.in_waiting))
data = self.s.read(i)
i = data.find(b"\n")
if i >= 0:
r = self.buf + data[:i+1]
self.buf[0:] = data[i+1:]
return r
else:
self.buf.extend(data)
ser = serial.Serial('COM7', 9600)
rl = ReadLine(ser)
while True:
print(rl.readline())