Elektroda.pl
Elektroda.pl
X
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Jak ustawić BASH jako wejście/wyjście dla portu szeregowego

miono 18 Jun 2009 10:28 3606 17
  • #1
    miono
    Level 15  
    Jak ustawić pod Linuxem Basha albo sh (dowolną powłokę) aby pobierała wejście wyjście z portu szeregowego? Chodzi mi o to, że chce wysyłać i odbierać od urządzenia dane wraz ze znakami terminala formatującymi tekst (np. kolory itp.).
  • Helpful post
    #2
    gothye
    Level 33  
    Spróbuj przez : cat /dev/ttys0 - odbiór , echo "cos tam " >> /dev/ttys0 -- wysyłanie
  • #3
    miono
    Level 15  
    To mi nie załatwi sprawy bo nie mam jak ustawić innych parametrów portu niż domyślny.
  • Helpful post
    #4
    szelus
    Level 34  
    Jeżeli dla całego skryptu, to najprościej np.:
    Code:

    #!/bin/bash

    0 < /dev/ttyS0
    1 > /dev/ttyS0

    stty -b 9600

    # itd.

    Ogólnie, polecam instrukcję man bash
  • #5
    miono
    Level 15  
    stty ospeed 57600 powinno być.
    Ustawienie prędkości działa ale te dwie powyższe komendy już nie.
    Jak daję cat /dev/ttyS0 to też mi nic nie czyta (a normalnym terminalem com czyta)
  • Helpful post
    #6
    szelus
    Level 34  
    miono wrote:
    stty ospeed 57600 powinno być.

    ... to już Ty powinieneś wiedzieć najlepiej ;) Masz te predkości niesymetryczne w obu kierunkach?
    Quote:

    Ustawienie prędkości działa ale te dwie powyższe komendy już nie.

    mea culpa... Jedna spacja za dużo, powinno być:
    Code:
    0< /dev/ttyS0
    
    1> /dev/ttyS0

    albo
    Code:
    < /dev/ttyS0
    
    > /dev/ttyS0

    Quote:

    Jak daję cat /dev/ttyS0 to też mi nic nie czyta (a normalnym terminalem com czyta)

    Dajesz w tym skrypcie, czy z linii komend?
    Co to konkretnie jest "normalny" terminal? Programy terminalowe zwykle ustawiają całą masę parametrów na łączu szeregowym, nie tylko prędkość.
  • #7
    miono
    Level 15  
    Zaczęło działać :)
    Oto skrypt:
    Code:

    #!/bin/bash
    0< /dev/ttyS0
    1> /dev/ttyS0
    stty ospeed 57600
    cat /dev/ttyS0


    a można jeszcze w jakiś prosty sposób ustawić inne parametry portu szeregowego np.: liczbe stop bitów? Szukałem tego w stty opcji ale tam nie ma.
  • Helpful post
    #8
    szelus
    Level 34  
    2 stop bity opcją cstopb, 1 opcją -cstopb. Na póltora nie ma opcji.
    Naprawdę potrzebujesz różne predkości na odbiorze i nadawaniu? Jeżeli nie to
    Code:
    stty 57600
    


    man stty
  • #9
    miono
    Level 15  
    Dodałem obsługę wejścia i teraz skrypt wygląda tak:
    Code:

    #!/bin/bash

    0< /dev/ttyS0
    1> /dev/ttyS0

    stty 57600

    cat /dev/ttyS0 &

    while true; do
        read -n 1;
        echo $REPLY >> /dev/ttyS0
    done;
  • Helpful post
    #10
    szelus
    Level 34  
    I co wg. Ciebie ten skrypt powinien robić? Bo jakoś mam problem zrozumieć ideę. Jeżeli chodziło Ci o to, aby czytać z ttyS0 i odsyłać to samo z powrotem, robiąc dodatkowo echo na konsolę to proponuję raczej:
    Code:

    < /dev/ttyS0
    > /dev/ttyS0
    stty 57600 raw

    tee /dev/tty
  • #11
    miono
    Level 15  
    Skrypt ma wyświetlić to co przychodzi na coma i jak wcisnę klawisz to ma wysłać ten klawisz na port. Tak właśnie to działa.
  • Helpful post
    #12
    szelus
    Level 34  
    No to tak to nie działa. Jak przekierowałeś standardowe wejście na ttyS0, to read nie czyta już z klawiatury, tylko z ttyS0.
    Zrób np. tak
    Code:

    # wylacz lokalne echo i preprocesing na wejsciu
    stty raw -echo

    # przechowaj stdin
    3<&0

    #przelacz sie na ttyS0
    </dev/ttyS0
    >/dev/ttyS0
    stty 57600

    #kopiuj echo na konsolę
    cat >&2 &

    #kopiuj konsolę na ttyS0
    cat <&3



    Przerwanie skryptu przez ^C. Tylko musisz pamiętać, że po ^C konsolę będziesz miał w słabym stanie i będziesz musiał wydać komendę "stty sane" w ciemno.
  • #13
    miono
    Level 15  
    dzięki o to mi właśnie chodziło :) Jutro sprawdzę jak to działa. Tylko czy będę mógł standardowo grepa używać np. skrypt.sh | grep costam ?
  • Helpful post
    #14
    szelus
    Level 34  
    No nie, tu tak z grep-em nie zadziała, bo zostały zamieszane deskryptory.
    Napisałeś na początku o znakach sterujących terminalem, więc założyłem, że przychodzący tekst nie jest raczej podzielony na linie. Jeżeli jednak jest (chodzi o to, że grep dzieli przeszukiwanie na linie), a chodzi tylko o np. podkreślanie niektórych wyrazów itp. to może coś takiego:
    Code:

    stty -icanon -echo

    (stty -F /dev/ttyS0 57600; cat ) < /dev/ttyS0 &

    cat >/dev/ttyS0


    Tylko na początku całkiem chciałeś całkiem czegoś innego. ;)
  • #15
    miono
    Level 15  
    Hej,
    dzięki za informacje. Chodziło mi nie tyle o znaki sterujące co np. obsługę kolorów itp. Po za tym jak mam takie możliwości to zbędne się staje używanie cutecom i raczej już zawsze będę uzywał takiego skryptu bo jest znacznie wygodniejszy i jak się uda go połączyć z innymi programami jak grep sed czy hexdump to będę już całkiem happy :)
  • #16
    miono
    Level 15  
    Pociągnę jeszcze temat trochę :)
    Wszystko ładnie się sprawuje ale jak podłączam się przez RSa do płytki z linuxem to nie mogę używać tam klawiszy ctrl+c itp. Czy da się ustawić żeby CTRL+c nie był interpretowany przez moją lokalną konsolę tylko żeby był wysyłany na port COM?
  • Helpful post
    #17
    szelus
    Level 34  
    Zmień opcję '-icanon' powyżej na 'raw', a jak nie wystarczy, to dodaj jeszcze 'ignbrk'. Tylko aby wyjść, będziesz musiał ubić ten skrypt z drugiej konsoli.