[+] Skrypt bash - wys
[+] Skrypt bash - wysłanie na UART i Odebranie
Witam kolegów
Mam urządzenie widziane w systemie jako /dev/ttyUSB0 - com na usb
Potrzebuję teraz wysłać do tego urządzenia pewną informację i odczytać zwrotkę. ( Wysyłam na com i odczytuję)
Póki co to robię to tak:
Otwieram dwa terminale.
W pierwszym wpisuje cat < /dev/ttyUSB0
W drugim : echo 'informacja' > /dev/ttyUSB0
I wszystko działa. W terminalu nr 1 pojawia się odpowiedź z urzadzenia.
Chce teraz zrobić skrypt w bash, który te kroki będzie zawierał w sobie. Czyli uruchamiam skrypty np: ./com.sh, który wyśle pytanie do UARTA, a wynikiem działania tegoż skryptu będzie odpowiedź z UARTA.
Czyli skrypt musi najpierw otwierać urządzenie /dev/ttyUSB0, nasŧepnie wysłać zapytanie poprzez echo , a później wypluć odpowiedź do terminala i zakończyć działanie
Problem jest w tym ze jak otworzę urządzenie poprzez cat < /dev/ttyUSB0 to skrypt nie wykona dalej innych poleceń. Myślałem, aby otwierał go za pomocą screena, ale za bardzo nie wiem jak to ugryźć.
Będę wdzięczny za wszelkie sugestie
Mam urządzenie widziane w systemie jako /dev/ttyUSB0 - com na usb
Potrzebuję teraz wysłać do tego urządzenia pewną informację i odczytać zwrotkę. ( Wysyłam na com i odczytuję)
Póki co to robię to tak:
Otwieram dwa terminale.
W pierwszym wpisuje cat < /dev/ttyUSB0
W drugim : echo 'informacja' > /dev/ttyUSB0
I wszystko działa. W terminalu nr 1 pojawia się odpowiedź z urzadzenia.
Chce teraz zrobić skrypt w bash, który te kroki będzie zawierał w sobie. Czyli uruchamiam skrypty np: ./com.sh, który wyśle pytanie do UARTA, a wynikiem działania tegoż skryptu będzie odpowiedź z UARTA.
Czyli skrypt musi najpierw otwierać urządzenie /dev/ttyUSB0, nasŧepnie wysłać zapytanie poprzez echo , a później wypluć odpowiedź do terminala i zakończyć działanie
Problem jest w tym ze jak otworzę urządzenie poprzez cat < /dev/ttyUSB0 to skrypt nie wykona dalej innych poleceń. Myślałem, aby otwierał go za pomocą screena, ale za bardzo nie wiem jak to ugryźć.
Będę wdzięczny za wszelkie sugestie
Kod: Zaznacz cały
cat /dev/ttyUSB0 &
#dalsze polecenia
Kod: Zaznacz cały
man screen
Dużo szybciej napiszesz mały program w C, bo w bashu to wyjdzie ci nieczytelny twór.
https://en.wikibooks.org/wiki/Serial_Pr ... rial_Linux
https://en.wikibooks.org/wiki/Serial_Pr ... rial_Linux
Wynik możesz przekierować gdzie Ci się podoba, do pliku:
możesz go nawet wypisać na terminalu:
I wyniki będą wypisywane w terminalu 2-gim.
Dodane:
Możesz też otworzyć sobie emulator terminala i tam wypisać wynik (polecenie zależy od rodzaju emulatora):
Kod: Zaznacz cały
cat /dev/ttyUSB0 >> ~/plik &
Kod: Zaznacz cały
cat /dev/ttyUSB0 >> /dev/tty2 &
Dodane:
Możesz też otworzyć sobie emulator terminala i tam wypisać wynik (polecenie zależy od rodzaju emulatora):
Kod: Zaznacz cały
lxterminal --command="cat /dev/ttyUSB0" &
Dziękuje za sugestie ( Zwłaszcza Rafał_F)
Napisałem na razie taki twór
Jak otwierałem w dwóch terminalach to nie było z tym problemu.
Napisałem na razie taki twór
Problem tylko jest taki, iż nie zawsze uart zapisze do pliku nie wiem właśnie czemu. Dałem sleep żeby miał więcej czasu ale to nie pomogło#!/bin/bash
# Ustawienie portu
stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb -cooked min 1 time 1 -echo -echoe -echok
plik_temp=/tmp/plik.tmp
cat /dev/ttyUSB0 > $plik_temp &
echo -e $1 > /dev/ttyUSB0
sleep 2
killall -9 cat
echo `cat $plik_temp`
rm $plik_temp
Jak otwierałem w dwóch terminalach to nie było z tym problemu.
Nie bardzo wiem dlaczego tak się dzieje. Może spróbujmy tak, wstaw sleep pomiędzy cat /dev/ttyUSB0.... a echo -e.....
I nie zabijaj cat w ten sposób, użyj:
kill -INT jest równoznaczne ctrl+c na procesie.
$! - to zmienna przechowująca PID ostatniego procesu uruchomionego w tle.
I sprawdź czy działa.
I nie zabijaj cat w ten sposób, użyj:
Kod: Zaznacz cały
kill -INT $!
$! - to zmienna przechowująca PID ostatniego procesu uruchomionego w tle.
I sprawdź czy działa.
Kod: Zaznacz cały
kill -INT $!
Dałem tak:
Kod: Zaznacz cały
stty -F /dev/ttyUSB0 9600 cs8 -cstopb -parenb -cooked min 1 time 1 -echo -echoe -echok
plik_temp=/tmp/plik
cat /dev/ttyUSB0 > $plik_temp &
sleep 0.5
echo -e $1 > /dev/ttyUSB0
sleep 1
kill -9 $!
echo `cat $plik_temp`
rm $plik_temp
Masz może jakąś inną sugestię jak go zabić? np sprawdzić jego pid
Bardzo dziękuję ze pomoc
Jak już napisałem $! zawiera pid ostatniego programu uruchomionego w tle (czyli ze znakiem '&' na końcu polecenia).
Generalnie skoro wszystko działa, to możesz na tym zakończyć. Różnica jest taka, że sygnał -INT (lub używając kodu -2) to sigint i może zostać przechwycony przez aplikację i aplikacja może się zamknąć w prawidłowy sposób. Podczas gdy z parametrem -9 jest to sigkil i tego sygnału nie da się przechwycić, tutaj proces nie ma nic do powiedzenia i po prostu zostaje zabity.
Generalnie skoro wszystko działa, to możesz na tym zakończyć. Różnica jest taka, że sygnał -INT (lub używając kodu -2) to sigint i może zostać przechwycony przez aplikację i aplikacja może się zamknąć w prawidłowy sposób. Podczas gdy z parametrem -9 jest to sigkil i tego sygnału nie da się przechwycić, tutaj proces nie ma nic do powiedzenia i po prostu zostaje zabity.