Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2015-11-26 13:29:06

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

Witam!

Mam problem z ustawieniem odpowiednich parametrów transmisji między debianem, a arduino, które jest podłączone do portu szeregowego komputera. Chcę do arduino wysłać cyfrę "1" takim poleceniem:

Kod:

echo '1' > /dev/ttyUSB0

Przed wywołaniem powyższego polecenia ustawiłem następjące parametry transmisji:

Kod:

stty -F /dev/ttyUSB0 9600 --> prędkość transmisji
stty -F /dev/ttyUSB0 parodd --> brak bitu parzystości
stty -F /dev/ttyUSB0 cs8 --> rozmiar znaku 8 bitów
stty -F /dev/ttyUSB0 -cstopb --> 1 bit stopu
stty -F /dev/ttyUSB0 crtscts --> sprzętowa kontrola przepływu

Powyższe polecenie można zastąpić jednym:

Kod:

stty -F /dev/ttyUSB0 9600 parodd cs8 -cstopb crtscts

Po wywołaniu powyższego polecenia sprawdziłem aktualnie ustawienia

Kod:

root@pic:/home/pic# stty -F /dev/ttyUSB0 9600 parodd cs8 -cstopb crtscts
root@pic:/home/pic# stty -F /dev/ttyUSB0 -a
speed 9600 baud; rows 0; columns 0; line = 0;
intr = ^C; quit = ^\; erase = ^?; kill = ^U; eof = ^D; eol = <undef>;
eol2 = <undef>; swtch = <undef>; start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R;
werase = ^W; lnext = ^V; flush = ^O; min = 1; time = 0;
parenb parodd cs8 hupcl -cstopb cread clocal crtscts
-ignbrk -brkint -ignpar -parmrk -inpck -istrip -inlcr -igncr -icrnl -ixon -ixoff
-iuclc -ixany -imaxbel -iutf8
-opost -olcuc -ocrnl -onlcr -onocr -onlret -ofill -ofdel nl0 cr0 tab0 bs0 vt0 ff0
-isig -icanon -iexten -echo -echoe -echok -echonl -noflsh -xcase -tostop -echoprt
-echoctl -echoke
root@pic:/home/pic#

Jak widać ustawienia zostały zapisane, ale w dalszym ciągu nie mogę wysłać do arduino cyfry "1"

Jeżeli do komunikacji używam minicom-a to wszystko działa ok. Ustawienia parametrów transmisji w minicom są takie:

Kod:

 kom| A - Urządzenie szeregowe          : /dev/ttyUSB0                      |
Port| B - Lokalizacja pliku blokującego : /var/lock                         |
    | C - Program Callin                :                                   |
Wciś| D - Program Callout               :                                   |
    | E - Bps/Parzystość/Bity           : 9600 8N1                          |
    | F - Sprzętowa kontrola przepływu  : Tak                               |
    | G - Programowa kontrola przepływu : Nie                               |
    |                                                                       |
    |    Które ustawienie zmienić?

Do arduino mam wgrany taki program

Kod:

/*
   Simple LED sketch
  */
  
  int led = 13; // Pin 13
  
  void setup()
  {
      pinMode(led, OUTPUT); // Set pin 13 as digital out
 
     // Start up serial connection
     Serial.begin(9600); // baud rate
     Serial.flush();
 }
 
 void loop()
 {
     String input = "";
 
     // Read any serial input
     while (Serial.available() > 0)
     {
         input += (char) Serial.read(); // Read in one char at a time
         delay(5); // Delay for 5 ms so the next char has time to be received
     }
 
     if (input == "1")
     {
         digitalWrite(led, HIGH); // on
     }
     else if (input == "2")
     {
         digitalWrite(led, LOW); // off
     }
 }

W związku z tym mam pytanie. Co muszę jeszcze ustawić lub poprawić, abym mógł przez stty komunikować się z arduino?

Ostatnio edytowany przez prosze (2015-11-26 13:37:50)

Offline

 

#2  2015-11-26 20:21:39

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

Znalazłem częściowe rozwiązanie na innym forum, które wymaga otwarcia dwóch konsol.

W pierwszej konsoli wpisujemy polecenie

Kod:

tail -f /dev/ttyUSB0

Następnie nie zamykając pierwszej konsoli otwieramy drugą i wpisujemy

Kod:

echo -n "1" > /dev/ttyUSB0

W tym momencie dioda zostaje zapalona. Podpowie ktoś jak zmienić ustawienia stty, aby to samo zrobić w jednej konsoli?

Offline

 

#3  2015-11-26 20:35:16

  ilin - Palacz

ilin
Palacz
Skąd: PRLu
Zarejestrowany: 2006-05-03

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

Kod:

tail -f /dev/ttyUSB0 & echo -n "1" > /dev/ttyUSB0

?

Może jeszcze między poleceniami sleepa wpleść jeśli była by potrzeba opóźnienia drugiego polecenia.


Problemy rozwiązujemy na forum nie na PW -> Niech inni na tym skorzystają.
Polski portal Debiana

Offline

 

#4  2015-11-26 20:46:52

  Pavlo950 - człowiek pasjonat :D

Pavlo950
człowiek pasjonat :D
Zarejestrowany: 2012-02-20
Serwis

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

ilin napisał(-a):

Kod:

tail -f /dev/ttyUSB0 & echo -n "1" > /dev/ttyUSB0

?

Może jeszcze między poleceniami sleepa wpleść jeśli była by potrzeba opóźnienia drugiego polecenia.

Kod:

tail -f /dev/ttyUSB0 && sleep 5; echo -n "1" > /dev/ttyUSB0

?

Offline

 

#5  2015-11-26 21:46:10

  uzytkownikubunt - Zbanowany

uzytkownikubunt
Zbanowany
Zarejestrowany: 2012-04-25

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

2408

Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:27:57)

Offline

 

#6  2015-11-27 11:09:37

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

Kod:

tail -f /dev/ttyUSB0 & echo -n "on" > /dev/ttyUSB0

Kod:

tail -f /dev/ttyUSB0 & sleep 2; echo -n "on" > /dev/ttyUSB0

Dwa powyższe polecenia działają poprawnie. Natomiast te poniżej zapala diodę dopiero po jego zatrzymaniu (ctrl+z).

Kod:

pic@pic:~$ tail -f /dev/ttyUSB0 && sleep 5; echo -n "on" > /dev/ttyUSB0
^Z
[18]+  Zatrzymano              tail -f /dev/ttyUSB0
pic@pic:~$

Zastanawiałem się dlaczego nie można zapalić diody tylko jednym polecaniem echo -n "on" > /dev/ttyUSB0?
Zauważyłem jeszcze taką rzecz, że jak w jednej konsoli wpiszę polecenie tail -f /dev/ttyUSB0, a w drugiej polecenie echo -n "1" > /dev/ttyUSB0 to dioda się zapali, czyli prawidłowo. Tylko, że jak w pierwszej konsoli zatrzymam działanie pierwszego polecenia, tak jak powyżej, to w drugiej konsoli nadal mogę zapalać i gasić diodę. Wygląda na to, że ubicie polecenia przez ctrl+z nie powoduje jego zatrzymania. Jego zatrzymanie następuje dopiero po zamknięciu konsoli. Czy tak powinno być?

Ostatnio edytowany przez prosze (2015-11-27 11:10:55)

Offline

 

#7  2015-11-27 11:48:32

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

a wiesz czym się różni & od && ?


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#8  2015-11-27 12:19:10

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

Znalazłem takie wyjaśnienie:

& - Ocenia po obu stronach tej operacji.
&& - Ocenia lewą stronę operacji, jeśli będzie ona "true" to dopiero ocenia prawą strone.

Bardziej interesuje mnie dlaczego pierwsze polecenie nie działa bez drugiego.

Offline

 

#9  2015-11-27 12:41:01

  uzytkownikubunt - Zbanowany

uzytkownikubunt
Zbanowany
Zarejestrowany: 2012-04-25

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

2410

Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:00)

Offline

 

#10  2015-11-27 13:08:16

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

pytanie kontrolne: kiedy skończy się tail?


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#11  2015-11-27 14:18:58

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

Kiedy tail kończy działanie? W moim przypadku tail kończy działanie dopiero po zamknięciu konsoli w której był uruchomiony. Nie pomaga jego zatrzymanie przez ctrl+z bo mimo tego, że jest komunikat o zatrzymaniu programu to w drugiej konsol polecenie echo -n "on" > /dev/ttyUSB0 działa poprawnie.

Dodatkowo zauważyłem, że jak uruchomię taila pierwszym, albo drugim poniższym poleceniem to zakończyć jego działanie mogę tylko przez zamknięcie konsoli. Z tego wniosek, że tail nigdy nie kończy działania bo z opcją -f pracuje w nieskończonej pętli.

Kod:

tail -f /dev/ttyUSB0 & echo -n "on" > /dev/ttyUSB0
tail -f /dev/ttyUSB0 && sleep 5; echo -n "on" > /dev/ttyUSB0

Ostatnio edytowany przez prosze (2015-11-27 14:21:19)

Offline

 

#12  2015-11-27 14:21:35

  uzytkownikubunt - Zbanowany

uzytkownikubunt
Zbanowany
Zarejestrowany: 2012-04-25

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

2411

Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:01)

Offline

 

#13  2015-11-27 15:55:37

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

@prosze: źle wnioskujesz.
tail się skończy jak mu zabraknie wejścia. ctrl-z nie kończy programu a tylko go zatrzymuje.
może tak zacznij od man bash, a potem będziesz dywagować o tym, co ci się wydaje?


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

#14  2015-11-27 18:45:19

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

uzytkownikubunt napisał(-a):

Aby wiedzieć czy jakiś program jest uruchomiony można użyć np. takich poleceń:

Kod:

ps aux | grep tail
pgrep tail

Z tym grepem to zabiłeś kotka.

Kod:

pidof tail

l nie wystarczy.

Ostatnio edytowany przez Jacekalex (2015-11-27 18:45:54)


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#15  2015-11-28 10:06:47

  uzytkownikubunt - Zbanowany

uzytkownikubunt
Zbanowany
Zarejestrowany: 2012-04-25

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

2412

Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:02)

Offline

 

#16  2015-11-28 15:48:47

  ethanak - Użytkownik

ethanak
Użytkownik
Skąd: Ungwenor
Zarejestrowany: 2010-07-19
Serwis

Re: Komunikacja Debian --> Arduino - ustawienie parametrów transmisji stty

dobra zwracam honor (źle się wyraziłem). bardziej chodziło mi o różnicę między wstrzymaniem a zakończeniem procesu.
btw. akurat piszę taki programik na arduino, jego część to taki prosty readline, jak przetestuję to tu wrzucę.

//edytka:

Kod:

#include <stdlib.h>

#define UHZ 100
#define SERBUF_LEN 64

char serial_buffer[SERBUF_LEN];
byte serial_size=0;

void setup()
{
    Serial.begin(9600);
    pinMode(13,OUTPUT);
    digitalWrite(13,0);
}

void loop()
{
    doSerial();
    delay(1000 / UHZ);
}
    
void execSerialCommand()
{
    byte led;
    if (!strcmp(serial_buffer,"on")) {
        led = 1;
    }
    else if (!strcmp(serial_buffer,"off")) {
        led = 0;
    }
    else {
        Serial.println("Nie rozumiem polecenia"):
        return;
    }
    digitalWrite(13,led);
    Serial.println("Zrobione");
}

void doSerial()
{
    char sdata;
    for (;;) {
        if (!Serial.available()) return;
        sdata=Serial.read();
        if (sdata == 8) { // backspace
            if (serial_size) serial_size--;
            continue;
        }
        if (sdata == '\n' || sdata == '\r') {
            if (serial_size) {
                serial_buffer[serial_size]=0;
                execSerialCommand();
                serial_size=0;
            }
            continue;
        }
        if (serial_size < SERBUF_LEN - 1) {
            serial_buffer[serial_size++]=sdata;
        }
    }
}

Ostatnio edytowany przez ethanak (2015-11-29 10:29:51)


Nim mechaniczne larum zagrasz mi, kanalio,
głosząc nadejście Javy - śmiertelnego wroga!
Zespół Adwokacki Dyskrecja

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)