2012-01-16 18 views
39

Z okien mogę komunikować się z wykorzystaniem portu szeregowego urządzenia następujące polecenia:zapisu do portu szeregowego z linii poleceń Linuksa

mode com1: baud=9600 data=8 parity=n stop=1 
copy con com1 
alt+18alt+2ctrl+z 

Urządzenie rozpoczyna żądanej operacji.

Kiedy próbuję wykonać tę samą operację z samodzielnego debiana lub z wirtualnej instancji debianowej tego samego komputera z systemem Windows, nie miałem dotąd szczęścia.

Oto równoważne polecenia Linux (przynajmniej tak mi się wydaje)

stty -F /dev/ttyS0 speed 9600 cs8 -cstopb -parenb 
echo '\x12\x02' > /dev/ttyS0 

Nic się nie dzieje.

Czy ktoś może skierować mnie we właściwym kierunku?

Odpowiedz

16
echo '\x12\x02' 

nie będą interpretowane, a dosłownie napisać ciąg \x12\x02 (i dołączyć do nowej linii) do określonego portu szeregowego. Zamiast używać

echo -n ^R^B 

które można tworzyć w linii poleceń, wpisując CtrlVCtrlR i CtrlVCtrlB. Lub łatwiej jest użyć edytora do wpisania w pliku skryptu.

Polecenie stty powinno działać, chyba że inny program zakłóca działanie. Częstym winowajcą jest gpsd który szuka urządzeń GPS jest podłączony.

+0

Dziękuję bardzo za odpowiedź, próbowałem echo -n CTRL + VCTRL + RCTRRL + VCTRL + B z linii poleceń, ale nie mogłem sprawić, że to działa, chcę wypróbować inne polecenia, dlatego chcę wiedzieć, jak wymyślić te tłumaczenia (0x12 =^R, 0x02 =^B), to nie są tłumaczenia ASCII, jak przypuszczam. –

+0

@erincarikan: użyj 'man ascii', aby zobaczyć, jak 0x12 odnosi się do Ctrl-R. Są czyste ascii. Możliwe, że niektóre kombinacje ctrl nie będą działać, np. Ctrl- @ (NUL). Łatwiej byłoby napisać program do takiego protokołu binarnego. – wallyk

+0

dziękuję Całkowicie mam, ale niestety to nie działa, podejrzewam, że coś przeszkadza stty, nie mam gpsd działa. Muszę zagłębić się w to jeszcze bardziej. –

31

Jeśli chcesz użyć kodów HEX, należy dodać -e opcję, aby umożliwić interpretację backslashem ucieka przez echa (ale wynik jest taki sam jak w przypadku echoctrlRctrlB). I jak wallyk powiedział, prawdopodobnie chcesz dodać -n aby zapobiec wyjście z nową linią:

echo -en '\x12\x02' > /dev/ttyS0 

Upewnij się także, że /dev/ttyS0 jest portem chcesz.

+0

dzięki, jestem pewien, że jest to port, który chcę, jest prostszy sposób testowania połączenia szeregowego, echo zawsze zwraca sukces. –

+0

+1 za sugerowanie opcji -e – Arunas

+1

Jeśli używasz 'bash', użyj' $ '' 'quoting:' printf $ '\ x12 \ x02'>/dev/ttyS0' –

5

EKRAN:

UWAGA: Ekran nie jest faktycznie w stanie wysłać hex, o ile wiem. Aby to zrobić, należy użyć echo lub printf

używałem propozycje w tym poście napisać do portu szeregowego, a następnie korzystając z informacji z innego post odczytu z portu, z różnymi rezultatami. Zauważyłem, że używanie ekranu jest "łatwiejszym" rozwiązaniem, ponieważ otwiera sesję terminalową bezpośrednio z tym portem. (Ułatwiam cytowanie, ponieważ ekran ma naprawdę dziwny interfejs, IMO, i zajmuje się dalszym czytaniem, aby to zrozumieć.)

można wydać polecenie, aby otworzyć sesję screen, potem coś wpiszesz zostanie wysłany do portu, a także wartości zwracane będą wydrukowane poniżej:

screen /dev/ttyS0 19200,cs8 

(Zmiana powyższego celu dopasowania twoje potrzeby dotyczące szybkości, parzystości, stop bitów, itp.) Rozumiem, że ekran nie jest "linią poleceń Linuksa", o co konkretnie pyta post, ale myślę, że jest w tym samym duchu. Dodatkowo nie musisz wpisywać echa i cytatów za każdym razem.

ECHO:

Śledź odpowiedź pretorianów robota. JEDNAK, to nie działało dla mnie, dopóki nie użyłem również polecenia cat (cat < /dev/ttyS0) podczas gdy Wysłałem polecenie echo.

printf:

Okazało się, że można również użyć '% x' polecenia printf w:

c="\x"$(printf '%x' 0x12) 
printf $c >> $SERIAL_COMM_PORT 

Ponownie, printf, start cat < /dev/ttyS0 przed wysłaniem polecenia.

+0

Nic nie działało dla mnie, dopóki nie zrobiłem tego, co powiedział MrUser: musisz wysłuchać/dev/ttyS0, zanim będziesz mógł napisać do niego. – Gouda

Powiązane problemy