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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
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:
echo '1' > /dev/ttyUSB0
Przed wywołaniem powyższego polecenia ustawiłem następjące parametry transmisji:
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:
stty -F /dev/ttyUSB0 9600 parodd cs8 -cstopb crtscts
Po wywołaniu powyższego polecenia sprawdziłem aktualnie ustawienia
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:
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
/* 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
Znalazłem częściowe rozwiązanie na innym forum, które wymaga otwarcia dwóch konsol.
W pierwszej konsoli wpisujemy polecenie
tail -f /dev/ttyUSB0
Następnie nie zamykając pierwszej konsoli otwieramy drugą i wpisujemy
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
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.
Offline
[quote=ilin]
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]
tail -f /dev/ttyUSB0 && sleep 5; echo -n "1" > /dev/ttyUSB0
?
Offline
2408
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:27:57)
Offline
tail -f /dev/ttyUSB0 & echo -n "on" > /dev/ttyUSB0
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).
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
a wiesz czym się różni & od && ?
Offline
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
2410
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:00)
Offline
pytanie kontrolne: kiedy skończy się tail?
Offline
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.
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
2411
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:01)
Offline
@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?
Offline
[quote=uzytkownikubunt]Aby wiedzieć czy jakiś program jest uruchomiony można użyć np. takich poleceń:
ps aux | grep tail pgrep tail
[/quote]
Z tym grepem to zabiłeś kotka.
pidof tail
l nie wystarczy.
Ostatnio edytowany przez Jacekalex (2015-11-27 18:45:54)
Offline
2412
Ostatnio edytowany przez uzytkownikubunt (2016-12-01 01:28:02)
Offline
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:
#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)
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00012 | SET CHARSET latin2 |
0.00006 | SET NAMES latin2 |
0.00125 | 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='18.227.52.248' WHERE u.id=1 |
0.00104 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.227.52.248', 1732523012) |
0.00044 | SELECT * FROM punbb_online WHERE logged<1732522712 |
0.00052 | SELECT topic_id FROM punbb_posts WHERE id=293614 |
0.00008 | SELECT id FROM punbb_posts WHERE topic_id=27935 ORDER BY posted |
0.00058 | 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.00122 | 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.00555 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=27935 |
Total query time: 0.01091 s |