2010-10-06 15 views
10

Mam serwer Linux (Red Hat 4) z jednym portem szeregowym do wbudowanego urządzenia linux i innym portem szeregowym do kontrolera zasilania dla tego urządzenia. Moim aktualnym sposobem kontrolowania ich jest otwarcie dwóch sesji minicom, każda w swoim własnym oknie. Chciałbym zautomatyzować tę komunikację za pomocą skryptów. Na początku zacząłem się zastanawiać, w jaki sposób mogę zautomatyzować używanie minicomu, a następnie zdałem sobie sprawę, że nie powinienem próbować zautomatyzować za pomocą aplikacji konsoli, gdy skrypt powinien móc bezpośrednio mówić do portu.Automatyzacja komunikacji portu szeregowego w systemie Linux

Znam niektóre Perl i niektóre Pythona. Nie mam wcześniejszego doświadczenia z komunikacją modemową (używając poleceń AT). Perl ma Device :: Modem, choć jest to tylko wersja beta, a Perl wydaje się być dobrym wyborem, ponieważ wolę jego ekstrakcję tekstu i umiejętności splatania. Ale jeśli potrzebuję nauczyć się kontrolować modem i pisać/debugować skrypt, który dodaje więcej czasu do mojego zadania.

Czy można/interaktywnie kontrolować aplikację konsolową, taką jak minicom, za pomocą skryptu? Jeśli nie, jakie są dobre zasoby, aby nauczyć się korzystać z poleceń AT modemu? Czy istnieje inny zasób, który mógłby mi uprościć?

Odpowiedz

4

Kermit to aplikacja do komunikacji szeregowej, na przykład minicom, która ma swój własny język skryptowy i użyłem jej do automatycznego przesyłania na urządzeniach wbudowanych. Jest jednak dość ograniczony i/lub błędny, więc w końcu przełączyłem się na używanie Pythona i pyserial.
Ilekroć mamy do czynienia z trybem texte, jak zestaw poleceń AT lub mówienie do powłoki przez linię szeregową, jest naprawdę potężny.

Jeśli potrzebuję wykonać transfer binarny za pomocą standardowego protokołu, zazwyczaj korzystam z narzędzi wiersza poleceń w trybie nieinteraktywnym i odradzam je z mojego skryptu python.

Oto niektóre z narzędzi, które zbudowałem: oczekiwanie na dane wejściowe, przesłanie danych przez xmodem, wysłanie polecenia do u-boot i rozpoczęcie transferu przy użyciu protokołu kermit. Używam go do automatycznego flashowania i testowania urządzeń wbudowanych.

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

Dzięki! Odkryłem, że minicom ma narzędzie o nazwie runcript, które jest elementarne, ale wystarczające. Jednak bardzo dziękuję za opublikowanie tego. Mogę bardzo dobrze znaleźć to przydatne w przyszłości. – jasper77

2

Jeśli chodzi tylko o sterowanie urządzeniami i nic więcej (np. Przetwarzanie wiadomości, interakcja z innymi usługami systemu operacyjnego itp.), Można użyć programu chat. Jest napisany właśnie po to. Możesz go znaleźć w pakiecie ppp na dowolnej dystrybucji Linuksa.

+0

Dziękuję za poinformowanie mnie o programie czatu. Mogłoby to zaspokoić część moich potrzeb, ale tak naprawdę muszę móc pobrać i uruchomić nowy obraz linuxowy na tym urządzeniu przed uzyskaniem dostępu do powłoki. Urządzenie wykorzystuje busybox. – jasper77

2

Używam takiego kontrolera mocy, którego używam do sterowania RS232.

ja go przy użyciu skryptu bash prostu wydając:

echo "your-command" > /dev/ttyUSB0 

konkretne urządzenie Używam również korzysta 300 szybkość transmisji więc wydać:

stty -F /dev/ttyUSB0 300 

przed ręką.

5

Odkryłem runcript ("$ man runscript"), narzędzie, które dodaje do skryptu minicom oczekiwaną zdolność skryptowania. Oczekiwane zachowanie jest dla mnie użyteczne, ponieważ to urządzenie używa zastrzeżonej interaktywnej sekwencji rozruchowej. To elementarny, ale wystarczający. Skrypt może zostać wywołany podczas uruchamiania minicomu z flagą "-S scriptname", a określony tekst ze skryptu może zostać przesłany do pliku dziennika, co jest przydatne przy uruchamianiu minicomu ze skryptu. Nie znalazłem sposobu na przesłanie zawartości konsoli do dziennika, więc mając zewnętrzny skrypt wiem, co się dzieje wewnątrz minicomu, trzeba napisać do dziennika i skrypt powinien monitorować dziennik. Planuję używać runcript tylko po to, aby ponownie uruchomić się i dostać się do powłoki, a następnie ssh do urządzenia w celu rzeczywistej interakcji, w ramach skryptu języka wyższego poziomu, takiego jak Python lub Perl.Gdyby minicom nie był jeszcze na miejscu, wziąłbym podejście do shodanexa.

Program Runscript nie może zagnieżdżać się oczekuje. Mam wokół tego za pomocą Goto i etykiet, które niewątpliwie jest bardziej czytelny niż zagnieżdżonych oczekuje w każdym razie:

expect { 
    "Condition 1" goto lable1 
} 

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

Korekta: Gdy minicom jest wywoływany przez "-Clogfilename", to dane wyjściowe konsoli są przechwytywane do tego pliku. – jasper77

+1

Masz literówki w swoim skrypcie, "lable" w porównaniu do "etykiety". –

+0

runscript wygląda OK, ale nie widziałem sposobu, aby wysłać plik, więc jest to dla mnie pyserial. – austinmarton

Powiązane problemy