2012-06-18 16 views
6

Attualmente si verifica un problema con il modulo pySerial in Python. Il mio problema riguarda la connessione e la disconnessione a un dispositivo. Posso collegarmi con successo al mio dispositivo e comunicare con esso per tutto il tempo che voglio, e disconnetterlo quando lo desidero. Tuttavia, non riesco a ricollegarmi al dispositivo una volta interrotta la connessione.Ricollegamento al dispositivo con pySerial

Ecco la classe wrapper che il mio programma utilizza per interfacciarsi con la porta seriale:

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) 

Qualcuno sa il motivo per cui questo problema esiste e quello che potrebbe cercare di fare per risolvere il problema?

+0

Qual è l'eccezione/traccia che si ottiene quando si tenta di riconnettersi? E sei su Windows o Linux? – jedwards

+0

Cosa intendi per "connessione interrotta"? Vuoi dire scollegare il cavo seriale o semplicemente uscire dal tuo processo Python? – TJD

+0

@andrew donelick Non correlato alla risposta del problema, ma perché non inizializzare l'oggetto 'Serial' in' __init __() '? –

risposta

2

Non si rilascia la porta seriale quando si è finito. Utilizzare ser.close() per chiudere la porta prima di uscire dal programma, altrimenti la porta resterà chiusa a tempo indeterminato. Suggerirei di aggiungere un metodo chiamato disconnect() nella tua classe per questo.

Se si utilizza Windows per risolvere la situazione durante il test, avviare Task Manager e interrompere i processi python.exe o pythonw.exe che potrebbero bloccare la porta seriale.

+0

Grazie. Dopo tutte le ricerche che ho fatto per chiudere la porta seriale, che Sublime Text, Python, ha mantenuto aperta la porta quando ho ricostruito il progetto, questa era la soluzione migliore. – Speakeasys