[+] Skrypt bash - wys

Potrzebujesz pomocy z C, C++, perl, python, itp.
Awatar użytkownika
pawkrol
Moderator
Posty: 939
Rejestracja: 03 kwietnia 2011, 10:25

[+] Skrypt bash - wysłanie na UART i Odebranie

Post autor: pawkrol »

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
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

Kod: Zaznacz cały

cat /dev/ttyUSB0 &
#dalsze polecenia
Co do screena, mnóstwo jest w internecie opisów, również po polsku - poszukaj w google. Lub zacznij od:

Kod: Zaznacz cały

man screen
Awatar użytkownika
pawkrol
Moderator
Posty: 939
Rejestracja: 03 kwietnia 2011, 10:25

Post autor: pawkrol »

To polecenie
cat /dev/ttyUSB0 &
Utworzy mi proces cat z numerem PID, a jak teraz odczytać z takiego procesu informację
Awatar użytkownika
pone13
Beginner
Posty: 337
Rejestracja: 30 listopada 2007, 20:59
Lokalizacja: Leszno

Post autor: pone13 »

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
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

Wynik możesz przekierować gdzie Ci się podoba, do pliku:

Kod: Zaznacz cały

cat /dev/ttyUSB0 >> ~/plik &
możesz go nawet wypisać na terminalu:

Kod: Zaznacz cały

cat /dev/ttyUSB0 >> /dev/tty2 &
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

lxterminal --command="cat /dev/ttyUSB0" &
Awatar użytkownika
pawkrol
Moderator
Posty: 939
Rejestracja: 03 kwietnia 2011, 10:25

Post autor: pawkrol »

Dziękuje za sugestie ( Zwłaszcza Rafał_F)
Napisałem na razie taki twór

#!/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
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
Jak otwierałem w dwóch terminalach to nie było z tym problemu.
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

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:

Kod: Zaznacz cały

kill -INT $!
kill -INT jest równoznaczne ctrl+c na procesie.
$! - to zmienna przechowująca PID ostatniego procesu uruchomionego w tle.

I sprawdź czy działa.
Awatar użytkownika
pawkrol
Moderator
Posty: 939
Rejestracja: 03 kwietnia 2011, 10:25

Post autor: pawkrol »

Kod: Zaznacz cały

kill -INT $!

Nie zabija mi procesu cat, a po każdym użyciu skryptu dodawany jest kolejny proces

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
I wydaje się że jest ok. Wiem, że nie powinienem tak ubijać procesu.
Masz może jakąś inną sugestię jak go zabić? np sprawdzić jego pid

Bardzo dziękuję ze pomoc
Awatar użytkownika
Rafal_F
Moderator
Posty: 2350
Rejestracja: 29 sierpnia 2008, 16:45

Post autor: Rafal_F »

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.
Awatar użytkownika
pawkrol
Moderator
Posty: 939
Rejestracja: 03 kwietnia 2011, 10:25

Post autor: pawkrol »

Ok rozumiem.
Jeszcze raz bardzo dziękuję za pomoc.
Można zamknąć temat
ODPOWIEDZ