2012-06-18 127 views
6

現在PythonのpySerialモジュールに問題があります。私の問題は、デバイスに接続して切断することに関連しています。私は正常に私のデバイスに接続し、私が望む限り、それと通信することができますし、いつでもそれから切断します。ただし、接続が切断された後は、デバイスに再接続できません。ここでpySerialでデバイスに再接続

は私のプログラムは、シリアルポートとのインターフェースに使用するラッパークラスです:

import serial, tkMessageBox 

class Controller: 
""" Wrapper class for managing the serial connection with the MS-2000. """ 
    def __init__(self, settings): 
     self.ser = None 
     self.settings = settings 

    def connect(self): 
     """ Connect or disconnect to MS-2000. Return connection status.""" 
     try: 
      if self.ser == None: 
       self.ser = serial.Serial(self.settings['PORT'], 
             self.settings['BAUDRATE']) 
       print "Successfully connected to port %r." % self.ser.port 
       return True 
      else: 
       if self.ser.isOpen(): 
        self.ser.close() 
        print "Disconnected." 
        return False 
       else: 
        self.ser.open() 
        print "Connected." 
        return True 
     except serial.SerialException, e: 
      return False 

    def isConnected(self): 
     '''Is the computer connected with the MS-2000?''' 
     try: 
      return self.ser.isOpen() 
     except: 
      return False 

    def write(self, command): 
     """ Sends command to MS-2000, appending a carraige return. """ 
     try: 
      self.ser.write(command + '\r') 
     except Exception, e: 
      tkMessageBox.showerror('Serial connection error', 
            'Error sending message "%s" to MS-2000:\n%s' % 
           (command, e)) 

    def read(self, chars): 
     """ Reads specified number of characters from the serial port. """ 
     return self.ser.read(chars) 

誰もが、この問題が存在し、私はそれを修正するために何しようとすることができた理由を知っていますか?

+0

再接続しようとすると例外/トレースとは何ですか?そしてあなたはWindowsかLinuxのどちらですか? – jedwards

+0

「接続が切断されました」とはどういう意味ですか?あなたは、シリアルケーブルのプラグを抜くか、単にあなたのpythonプロセスを終了することを意味しますか? – TJD

+0

@andrew donelickあなたの問題の答えには関係しませんが、なぜ 'Serial'オブジェクトを' __init __() 'で初期化しないのですか? –

答えて

2

完了したら、シリアルポートを解放していません。プログラムを終了する前にポートを閉じるには、ser.close()を使用してください。そうしないと、ポートは無期限にロックされたままになります。あなたのクラスにdisconnect()というメソッドを追加することをお勧めします。

Windowsの場合、テスト中に状況を解決するには、タスクマネージャーを起動し、シリアルポートをロックしている可能性があるpython.exeまたはpythonw.exeプロセスをすべて終了します。

+0

ありがとうございます。すべての検索の後、私はプロジェクトを再構築するときにSublime Text、Pythonがポートを開いたままにしているシリアルポートを閉じるために、これが最善の解決策でした。 – Speakeasys

関連する問題