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.


[b]Problemy rozwiązujemy na forum nie na PW[/b] -> Niech inni na tym skorzystają.
[url=http://dug.net.pl/]Polski portal Debiana[/url]

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

[quote=ilin]

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.[/quote]

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 [b]echo -n "on" > /dev/ttyUSB0[/b]?
Zauważyłem jeszcze taką rzecz, że jak w jednej konsoli wpiszę polecenie[b] tail -f /dev/ttyUSB0[/b], a w drugiej polecenie [b]echo -n "1" > /dev/ttyUSB0[/b] 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!
[i]Zespół Adwokacki Dyskrecja[/i]

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.[/quote]
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!
[i]Zespół Adwokacki Dyskrecja[/i]

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 [b]echo -n "on" > /dev/ttyUSB0[/b] 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!
[i]Zespół Adwokacki Dyskrecja[/i]

Offline

 

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

  Jacekalex - Podobno człowiek...;)

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

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

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

Kod:

ps aux | grep tail
pgrep tail

[/quote]
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!
[i]Zespół Adwokacki Dyskrecja[/i]

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)

[ Generated in 0.011 seconds, 11 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00108 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.147.78.242' WHERE u.id=1
0.00069 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.147.78.242', 1732836878)
0.00038 SELECT * FROM punbb_online WHERE logged<1732836578
0.00115 SELECT topic_id FROM punbb_posts WHERE id=293579
0.00169 SELECT id FROM punbb_posts WHERE topic_id=27935 ORDER BY posted
0.00055 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=27935 AND t.moved_to IS NULL
0.00005 SELECT search_for, replace_with FROM punbb_censoring
0.00128 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=27935 ORDER BY p.id LIMIT 0,25
0.00086 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=27935
Total query time: 0.00786 s