2013-01-23 19 views
5

È possibile ottenere una comunicazione full duplex utilizzando PySerial? Nello specifico, sarebbe possibile monitorare continuamente la porta per l'input e scrivere quando necessario? Immagino che dovrebbe essere possibile utilizzare i thread (e le interfacce seriali sono full duplex no?). In caso contrario, quale sarebbe l'approccio migliore per monitorare una porta seriale quando non si trasmette? Un timeout?PySerial - Comunicazione full duplex

Modifica: Ecco il mio tentativo. Questo codice è destinato al chip CC LE25 Bluetooth LE di TI. Con l'invio del messaggio di init GATT mi aspetto una risposta (in dettaglio i parametri di funzionamento del chip) ... sto ottenendo nulla se

import serial 
import threading 
from time import sleep 

serial_port = serial.Serial() 

GAP_DeviceInit = \ 
       "\x01\x00\xfe\x26\x08\x03\x00\x00\x00\x00\x00\x00\x00\x00\ 
       \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ 
       \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00" 

def read(): 
    while True: 
     data = serial_port.read(9999); 
     if len(data) > 0: 
      print 'Got:', data 

     sleep(0.5) 
     print 'not blocked' 

def main(): 
    serial_port.baudrate = 57600 
    serial_port.port = '/dev/ttyACM0' 
    serial_port.timeout = 0 
    if serial_port.isOpen(): serial_port.close() 
    serial_port.open() 
    t1 = threading.Thread(target=read, args=()) 
    while True: 
     try: 
      command = raw_input('Enter a command to send to the Keyfob: \n\t') 
      if (command == "1"): 
       serial_port.write(message) 
     except KeyboardInterrupt: 
      break 
    serial_port.close() 

risposta

3

Si porta seriale è full duplex. Sì, puoi usare i thread per fare Rx e Tx allo stesso tempo. In alternativa, è possibile utilizzare un ciclo a thread singolo che legge con un breve timeout e alterna tra lettura e scrittura.

+0

Potresti fare un breve esempio? O forse indicare eventuali problemi immediati con il codice di esempio fornito. Il problema con il secondo approccio è che non so quando i dati dovranno essere inviati ... l'utente potrà scegliere quale messaggio inviare in qualsiasi momento – stephenfin

+2

Non hai iniziato il tuo thread letto. Aggiungi 't1.start()' – TJD

+0

Doh! Grazie mille! – stephenfin

0

Non è stato specificato un timeout, quindi la lettura attende il numero intero di byte da ricevere e solo dopo visualizza nulla.