2012-02-09 105 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...