2012-02-09 18 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%になります。エラーはスローされないので、exceptは決して入力されません。

これはpyserialの問題のように見えますが、ここで誰かがこれまでにこれまで実行していて、状況を正常に処理できるように接続の喪失を検出する方法を知っています。

ありがとうございました。

+0

Readlineのは、このアプリケーションのために望ましいです。エラーをキャッチする唯一の方法は、一度に文字を読み込んでそのように文字列を作成することです、それは動作すると思うが...それは不必要な作業のように思えます。ただし、例外はスローされないため、エラートラップは機能しません。 – user1200376

答えて

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

+0

ああ、私はあなたが読み取りタイムアウトを設定する必要があることを言及することを忘れてください: 'シリアル(...、タイムアウト= 1) –

+0

pyserialまたは下位のソケットモジュールに何か問題があるようです。しかし、遠隔会議が終了すると、間違っていると誤って報告されることはありません。私はバグレポートを提出します。 – user1200376

0

あなたのCPU使用率が固定されているという事実は、おそらく、readlineコールがタイムアウトするのをブロックしておらず、すぐに戻ることを示しています。だからあなたの通常のタイムアウト は、あなたが使用することができ、2の場合:入ってくるレコードは、様々な長さであるが、すべてがある\ nは終了するので

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... 
関連する問題