2010-10-06 21 views
10

Possiedo un server linux (Red Hat 4) con una porta seriale collegata a un dispositivo Linux incorporato e un'altra connessione seriale a un controller di alimentazione per quel dispositivo. Il mio attuale modo di controllarli è aprire due sessioni minicom, ciascuna nella propria finestra. Mi piacerebbe automatizzare questa comunicazione attraverso gli script. Inizialmente, ho iniziato a pensare a come avrei potuto automatizzare l'utilizzo di minicom, poi ho realizzato che non avrei dovuto cercare di automatizzare l'utilizzo di un'applicazione console quando uno script doveva essere in grado di parlare direttamente con la porta.Automazione della comunicazione della porta seriale su Linux

Conosco un po 'di Perl e un po' di pitone. Non ho esperienza precedente con la comunicazione via modem (usando i comandi AT). Perl ha Device :: Modem, anche se è solo beta, e Perl sembra una buona scelta perché preferisco la sua estrazione di testo e le sue abilità di litigio. Ma, se ho bisogno di imparare come controllare un modem e scrivere/eseguire il debug di uno script, questo aggiunge più tempo alla mia attività.

È possibile/comune controllare in modo interattivo un'app di console come minicom con uno script? In caso contrario, quali sono alcune buone risorse per imparare come utilizzare i comandi AT del modem? O c'è un'altra risorsa là fuori che potrebbe semplificare le cose per me?

risposta

4

Kermit è un'app di comunicazione seriale come minicom e ha il proprio linguaggio di script, e l'ho usato per alcuni upload automatici su dispositivi embedded. Tuttavia, è abbastanza limitato e/o buggato, quindi alla fine sono passato a usare python e pyserial.
Ogni volta che si ha a che fare con la modalità testo, come il set di comandi AT o parlando con una shell su una linea seriale, è davvero potente.

Se devo eseguire il trasferimento binario utilizzando un protocollo standard, di solito utilizzo gli strumenti della riga di comando in modalità non interattiva e li avvio dal mio script python.

Ecco una parte degli strumenti che ho creato: in attesa di qualche input, invio di dati tramite xmodem, invio di un comando a u-boot e avvio di un trasferimento utilizzando il protocollo kermit. Lo uso per il flashing automatico e il test dei dispositivi incorporati.

class Parser : 
    def __init__(self, sport_name): 
     self.currentMsg = '' 
     if sport_name : 
      self.ser = serial.Serial(sport_name, 115200) 
    def WaitFor(self, s, timeOut=None): 
     self.ser.timeout = timeOut 
     self.currentMsg = '' 
     while self.currentMsg.endswith(s) != True : 
      # should add a try catch here 
      c=self.ser.read() 
      if c != '' : 
       self.currentMsg += c 
       sys.stdout.write(c) 
      else : 
       print 'timeout waiting for ' + s 
       return False 
     return True 

    def XmodemSend(self,fname): 
     if not self.WaitFor('C', 1) : 
      print 'RomBOOT did not launch xmodem transfer' 
      return 
     self.ser.flushInput() 
     self.ser.close() 
     call(["xmodem","-d",self.ser.port,"-T",fname]) 
     self.ser.open() 

def UbootLoad(self, fname): 
    self.ser.write('loadb 0x20000000\n') 
    if not self.WaitFor('bps...',1) : 
     print 'loadb command failed' 
     sys.exit() 
    self.ser.flushInput() 
    self.ser.close() 
    retcode=call(['kermit','-y','kermit_init','-s',fname]) 
    if retcode != 0 : 
     print 'error sending' + fname 
     sys.exit() 
    self.ser.open() 
    self.UbootCmd('echo\n') 
+0

Grazie! Ho scoperto che minicom ha un'utilità chiamata runscript, che è rudimentale ma sufficiente. Tuttavia, la ringrazio molto per averlo pubblicato. Potrei benissimo trovarlo utile in futuro. Correzione – jasper77

2

Se si tratta solo di controllare i dispositivi e nient'altro (come l'elaborazione dei messaggi, l'interazione con altri servizi del sistema operativo, ecc.) È possibile utilizzare il programma chat. È scritto esattamente per questo. È possibile trovarlo nel pacchetto ppp su qualsiasi distribuzione Linux.

+0

Grazie per avermi informato circa il programma di chat. Potrebbe indirizzare parte dei miei bisogni, ma in realtà devo essere in grado di scaricare e avviare una nuova immagine Linux su questo dispositivo prima di arrivare alla shell. Il dispositivo utilizza busybox. – jasper77

2

Sto usando un controller di potenza che uso RS232 per controllare.

sceneggiatura ho utilizzando bash semplicemente mediante l'emissione di:

echo "your-command" > /dev/ttyUSB0 

il dispositivo specifico che sto utilizzando anche utilizza 300 baud rate in modo da emettere:

stty -F /dev/ttyUSB0 300 

prima mano.

5

Ho scoperto runscript ("$ man runscript"), un'utilità che aggiunge un'abilità di scripting inaspettata a minicom. Il comportamento previsto mi è utile poiché questo dispositivo utilizza una sequenza di avvio interattiva proprietaria. È rudimentale ma sufficiente. Uno script può essere richiamato quando si avvia minicom con il flag "-S scriptname" e il testo specifico all'interno dello script può essere inviato a un file di registro, che è utile quando si esegue minicom da uno script. Non ho trovato un modo per inviare il contenuto della console a un log, quindi avere uno script esterno sapere cosa sta succedendo all'interno di minicom implica la scrittura su un log e il controllo dello script sul log. Ho in programma di utilizzare runscript solo per riavviare e accedere a una shell, quindi ssh al dispositivo per l'interazione reale, all'interno di uno script di linguaggio di livello superiore come Python o Perl.Se minicom non fosse già in atto, prenderei l'approccio di Shodanex.

Il runscript non può avere nidificato si aspetta. Ho avuto intorno a questo utilizzando goto e delle etichette, che è probabilmente più leggibile rispetto aspetta annidate in ogni caso:

expect { 
    "Condition 1" goto lable1 
} 

lable1: 
    send "something" 
    expect { 
     "Condition 2" goto label2 
    } 
lable2: 
    # etcetera 
+0

: Quando minicom viene richiamato con "-C logfilename", l'output della console viene catturato su quel file. – jasper77

+1

Hai errori di battitura nello script, "etichetta" o "etichetta". –

+0

runscript sembra OK, ma non ho potuto vedere un modo per inviare un file così pyserial è per me. – austinmarton

Problemi correlati