Strona 1 z 1

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

: 14 maja 2014, 23:25
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

: 15 maja 2014, 00:05
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

: 15 maja 2014, 08:21
autor: pawkrol
To polecenie
cat /dev/ttyUSB0 &
Utworzy mi proces cat z numerem PID, a jak teraz odczytać z takiego procesu informację

: 15 maja 2014, 14:54
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

: 15 maja 2014, 15:00
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" &

: 15 maja 2014, 18:25
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.

: 15 maja 2014, 19:41
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.

: 15 maja 2014, 20:17
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

: 15 maja 2014, 20:42
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.

: 15 maja 2014, 20:51
autor: pawkrol
Ok rozumiem.
Jeszcze raz bardzo dziękuję za pomoc.
Można zamknąć temat