Czy istnieje sposób na połączenie z terminalem szeregowym, tak jak w przypadku SSH? Musi istnieć prostszy sposób niż narzędzia takie jak Minicom
$ serial /dev/ttyS0
Wiem, że mogę cat
wyprowadzać dane wyjściowe, /dev/ttyS0
ale w ten sposób możliwa jest tylko jedna komunikacja, od portu do konsoli. A echo
do portu jest dokładnie tak samo, ale odwrotnie, do portu.
Jak mogę zrealizować dwukierunkową komunikację z portem szeregowym w najprostszy możliwy sposób w systemach Unix / Linux?
command-line
terminal
tty
serial-port
serial-console
ihatetoregister
źródło
źródło
Odpowiedzi:
Znajduję
screen
najbardziej przydatny program do komunikacji szeregowej, ponieważ i tak używam go do innych celów. Zazwyczaj jest to po prostuscreen /dev/ttyS0 <speed>
, chociaż domyślne ustawienia mogą być inne dla twojego urządzenia. Umożliwia także przesyłanie czegokolwiek do sesji, wchodząc w tryb poleceń i wykonując czynnościexec !! <run some program that generates output>
.źródło
screen
jest niesamowity, ale nie wydaje mi się, żeby było to prostsze niżminicom
:-)tło
Głównym powodem, dla którego potrzebny jest jakikolwiek program
minicom
do komunikacji przez port szeregowy, jest konieczność skonfigurowania portu przed nawiązaniem połączenia. Gdyby nie został odpowiednio skonfigurowany, poleceniacat
iecho
nie zrobiłyby dla ciebie tego, czego można się spodziewać. Zauważ, że po uruchomieniu programu podobnegominicom
do portu pozostanąminicom
używane ustawienia . Możesz sprawdzić ustawienia komunikacji za pomocą takiegostty
programu:Jeśli dobrze to zrobiłeś; po uruchomieniu komputera i przed uruchomieniem jakiegokolwiek innego programu, takiego jak
minicom,
ustawienia komunikacji, będą miały ustawienia domyślne. Prawdopodobnie różnią się one od potrzebnych do nawiązania połączenia. W tej sytuacji wysłanie poleceńcat
lubecho
do portu albo spowoduje powstanie śmieci, albo w ogóle nie zadziała.Uruchom
stty
ponownie po użyciuminicom
, a zauważysz, że ustawienia są ustawione zgodnie z tym, czego program używał.Minimalna komunikacja szeregowa
Zasadniczo potrzebne są dwie rzeczy do dwukierunkowej komunikacji przez port szeregowy: 1) konfiguracja portu szeregowego i 2) otwarcie pseudo-tty odczytu-zapisu.
Najbardziej podstawowym programem, jaki znam, jest taki
picocom
. Możesz także użyć narzędzia, takiego jaksetserial
skonfigurować port, a następnie wchodzić z nim w interakcję bezpośrednio z powłoki.źródło
picocom
pozwoli ci także połączyć się z portem szeregowym bez jego ponownej konfiguracji (--noinit
) i pozwoli ci wyjść bez przywracania konfiguracji portu szeregowego (--noreset
lub użyjCtrl-A
/,Ctrl-Q
aby wyjśćpicocom
). Odkryłem, żepicocom
jest o wiele łatwiejszy w użyciu niżminicom
. Z powodów, których nie zorientowałem się, Minicom kiedyś po prostu nie wysyła ani nie odbiera danych na porcie, który działał chwilę wcześniej lub z którym Picocom nie ma problemów. Prawdopodobnie jest to jakaś tajemnicza opcja konfiguracji, ale cokolwiek to jest, nie mogę tego rozgryźć (a takie zachowanie miało miejsce na więcej niż jednej maszynie).--omap crcrlf --echo
opcjiJeśli UUCP jest zainstalowany w systemie, możesz użyć polecenia cu , np
źródło
~^D
lub,~.
aby wyjść.Znalazłem sposób, używając skryptu powłoki , który umieszcza się
cat
jako proces w tle i pętlę while, która odczytuje dane wejściowe użytkownika i wysyłaecho
je do portu. Zmodyfikowałem go, aby był bardziej ogólny i idealnie pasował do mojego celu.źródło
$?
rozwija się do kodu wyjścia ostatniego polecenia niebędącego tłem (w tym przypadkustty -F $1 $2
), więc rozwija się do 0, gdy nie wystąpił błąd. W ten sposób staje się ostatnia linia,kill 0
która z kolei wydaje się zabijać obecną powłokę i wszystkie jej dzieci (zachowuje się inaczej w interaktywnych powłokach, jak sądzę). Aby poznać wszystkie szczegóły, zobacz następujące wyjaśnienie: unix.stackexchange.com/questions/67532/...while
pętlę. Jeśli zabijesz go za pomocą Ctrl + C lub za pomocąkill
polecenia,cat
proces pozostanie aktywny. Aby to naprawić, musisz użyćtrap
polecenia, aby wykonaćkill $bgPid
po wyjściu powłoki, tak jak robi to mój skrypt poniżej . Szczerze mówiąc, nie miałbym nic przeciwko, gdybyś po prostu dodał cały mój skrypt do swojego postu. Próbowałem to zrobić, ale edycja została odrzucona.Spróbuj http://tio.github.io
„tio” to prosta aplikacja terminalowa TTY, która posiada prosty interfejs wiersza poleceń, umożliwiający łatwe podłączenie do urządzeń TTY w celu uzyskania podstawowych danych wejściowych / wyjściowych.
Typowe zastosowanie jest bez opcji. Na przykład:
Co odpowiada najczęściej używanym opcjom:
Posiada pełną obsługę automatycznego uzupełniania powłoki dla wszystkich opcji.
źródło
msys2
Windows można zainstalowaćtio
zpacman -S tio
ponieważ jest wśród dostępnych pakietów domyślnie.screen
,picocom
itp. nie są. Dzięki!Ten skrypt jest oparty na innej odpowiedzi , ale wysyła wszystko przez port szeregowy (oprócz Ctrl + Q), a nie tylko pojedyncze polecenia, po których następuje Enter. Dzięki temu możesz używać Ctrl + C lub Ctrl + Z na zdalnym hoście i używać interaktywnych programów „GUI”, takich jak aptitude lub alsamixer. Można go zamknąć, naciskając Ctrl + Q.
źródło
BTW, pakiet putty (który działa w systemie Linux) obejmuje obsługę szeregową.
źródło
Innym problemem, który może wystąpić, może być konieczność ustawienia konta użytkownika w grupie „dialout” w celu uzyskania dostępu do portu szeregowego.
źródło
Putty działa dobrze w systemie Linux i oferuje pewną wygodę, szczególnie w przypadku komunikacji szeregowej. Ma jedną wadę, której nie byłem w stanie rozwiązać bezpośrednio: nie kopiuj-wklej z samego okna Putty. Wersja systemu Windows ma piękne automatyczne kopiowanie do schowka po podświetleniu, kliknięcie prawym przyciskiem myszy, aby wkleić zachowanie (i istnieją doskonałe wtyczki zarówno dla chrome, jak i firefox, aby umożliwić takie samo zachowanie), ale w Linuksie nie ma miłości do kopiowania AFAIK.
Jeśli brak kopii stanowi problem (dotyczy mnie), włącz logowanie i otwórz standardowe okno terminala,
# tail -f putty.log
a tekst dwukierunkowy jest dostępny dla standardowej akcji copypasta.źródło
Jak wspomniano wcześniej, możesz wypróbować Picocom. Najnowsza wersja (2.0) może być również (bezpiecznie) użyta do skonfigurowania „serwera terminali”, ponieważ nie pozwala już na wprowadzanie poleceń powłoki. Widzieć:
https://github.com/npat-efault/picocom/releases
źródło
To zależy od tego, co chcesz zrobić. Czy chcesz uruchomić powłokę lub aplikację interaktywnie z terminala, połączyć się z innym komputerem za pośrednictwem linii szeregowej, zautomatyzować komunikację z urządzeniem przez port szeregowy?
Jeśli chcesz komunikacji dwukierunkowej, zakładam, że chcesz czegoś interaktywnego z człowiekiem na terminalu. Możesz skonfigurować system, aby zezwalał na logowanie z terminala przez port szeregowy, ustawiając sesję getty (1) na porcie szeregowym - getty jest narzędziem do konfigurowania terminala i zezwala na logowanie. Umieść wpis w pliku inittab (5) , aby uruchomić go na odpowiednim porcie szeregowym
respawn
.Jeśli chcesz połączyć się z urządzeniem i zainicjować zautomatyzowane rozmowy dwukierunkowe, możesz sprawdzić, czy oczekujesz, że dostaniesz to, czego chcesz. Użyj stty (1), aby skonfigurować port do właściwej parzystości, prędkości transmisji i innych odpowiednich ustawień.
Jeśli chcesz komunikować się interaktywnie z innym komputerem przez port szeregowy, potrzebujesz oprogramowania do emulacji terminala. To robi całkiem sporo - konfiguruje port, interpretuje ANSI lub inne sekwencje poleceń terminala (ANSI nie był jedynym standardem obsługiwanym przez terminale szeregowe). Wiele emulatorów terminali obsługuje również protokoły przesyłania plików, takie jak kermit lub zmodem.
Wejścia i wyjścia komunikacji szeregowej i I / O terminali są dość złożone; możesz przeczytać więcej niż kiedykolwiek chciałeś wiedzieć na ten temat w serialu Howto.
źródło
Możesz rzucić okiem
http://serialconsole.sourceforge.net
Pro: nie ma oczywistych problemów związanych z bezpieczeństwem, takie jak minicom lub picocom (jeśli nie masz problemu daje użytkownikom dostęp do powłoki, nie ma problemu, ale najprawdopodobniej zrobić masz, jeśli chcesz skonfigurować serwer terminali ... )
źródło
Musisz mieć pewność, że masz prawidłowe uprawnienia do odczytu na urządzeniu, możesz to zobaczyć za pomocą:
Opieram się na skrypcie, który znalazłeś i dokonałeś pewnych modyfikacji.
W przypadku systemów programistycznych, z których już korzystałem, potrzebowały:
Te wartości są domyślne w skrypcie.
Aby się połączyć, możesz użyć tego w następujący sposób:
Przykład:
Scenariusz:
PS: Musisz wiedzieć, jaki rodzaj linii jest używany w twoim systemie odbiorczym, ponieważ to określi, jak będziesz musiał wysyłać polecenia w moim przypadku Potrzebowałem systemu Windows takiego jak LF, co oznacza, że muszę wysłać
Wartości ASCII dla:
źródło
#!/bin/sh
jest ignorowane, jeśli nie jest to pierwszy wiersz pliku. (2) Poważnie? Używasz1
określić nawet parytetu i2
określić dziwne ? (3) Zwykle jest komunikat „użycie” lub „pomoc”, który dokumentuje wszystkie parametry, nie tylko te obowiązkowe. (4) Należy zawsze podać swój powłoki referencje zmienne (np"$1"
,"$2"
,"$3"
,"$4"
,"$stopb"
,"$par"
,"$bgPid"
, a nawet"$?"
i"$!"
), chyba że masz dobry powód, aby nie, i jesteś pewien, że wiesz co robisz.Jak już tu nie wspomniano, wspomnę również
socat
- więcej informacji w https://stackoverflow.com/questions/2899180/how-can-i-use-com-and-usb-ports-within-cygwin :lub
(chociaż miałem problem z zatrzymaniem go po uruchomieniu, pod MSYS2 w systemie Windows)
źródło
Zastanawiam się, dlaczego nikt nie wspomniał o ser2net .
Przykład
/etc/ser2net.conf
:Możesz podłączyć się do portu szeregowego tak łatwo jak:
Lub zdalnie:
Lub nawet skonfiguruj przekierowanie portów na routerze i udostępniaj go w Internecie, abyś mógł się z nim połączyć z dowolnego miejsca (pomińmy kwestie bezpieczeństwa, mówię o elastyczności).
źródło
Inną łatwą opcją jest dostęp do maszyny przez ssh za pomocą
-X
flagi i uruchomienie programu takiego jak putty lub gtkterm.Więc:
Powinien uruchomić interfejs graficzny na komputerze klienckim, a stamtąd można uzyskać dostęp do portu szeregowego, jakbyś był na hoście.
Oświadczenie: Wypróbowałem to tylko na maszynach ubuntu. Zgaduję, że nie będzie działać z maszynami bez interfejsów graficznych.
Z podręcznika ssh:
Więc użyj,
-Y
jeśli bezpieczeństwo stanowi problem.źródło