2012-02-09 104 views
0

MacOS 10.7.3,python 2.5Python pyserial和失控的CPU使用率

我正在使用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

的Readline是希望该应用,因为进入的记录是不同的长度,但都\ n终止。如果要纠正错误的唯一方法是一次读取字符并以这种方式构建字符串,我想它可以工作......但这似乎是不必要的工作。但是,问题是没有引发异常,所以错误捕获不起作用。 – user1200376 2012-02-09 20:14:29

回答

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") 

我不知道如果我得到你的意图正确,因此您可能必须调整...

+0

我测试了这种方法,但仍然得到相同的结果。没有错误 – user1200376 2012-02-09 20:40:28

+0

啊,我忘了提及你必须设置读取超时时间:'Serial(...,timeout = 1)' – 2012-02-09 22:26:14

+0

它看起来像pyserial或底层套接字模块中有一些问题。但是,当远端退出时,pyserial绝对不会报告错误。我将提交一份错误报告。 – user1200376 2012-02-10 04:54:03

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...