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 wysłaniem stringa, jako całości z Debiana do Arduino. Wysyłanie pojedynczych znaków przez minicom działa poprawnie, ponieważ naciśnięcie dowolnego znaku na klawiaturze powoduje automatyczne jego wysłanie do /dev/ttyUSB0. Do arduino mam wgrany taki przykład
/* 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 == "on") { digitalWrite(led, HIGH); // on } else if (input == "off") { digitalWrite(led, LOW); // off } }
Powyższy przykład służy do włączania i wyłączania diody led z klawiatury komputera. Wpisanie na klawiaturze słowa "on" zapala diodę led, a słowa "off" ją gasi. Kiedy w powyższym przykładzie string "on" i "off" zastąpię pojedynczym dowolnym znakiem to wówczas mogę z klawiatury komputera gasić i zapalać diodę led. Dzieję się tak, ponieważ minicom każdy wpisany znak wysyła bez zatwierdzenia enterem.
Jeżeli korzystam z Arduino IDE to wszystko działa poprawnie. W Arduino IDE otwierając monitor portu szeregowego po wpisaniu "on" lub "off" wysłanie muszę potwierdzić enterem. Dlatego zwracam się z pytaniem, jak poprawnie wysłać string przez minicom?
Próbowałem też wysłać string bez użycia minicom poniższymi poleceniami, ale bez pozytywnego efektu.
echo -e-n "on\r\n" > /dev/ttyUSB0 echo -n "on\r" > /dev/ttyUSB0
Ostatnio edytowany przez prosze (2015-11-26 13:37:15)
Offline
A mi się wydaje, że pytanie powinno brzmieć "Jak na Arduino odebrać string wysłany z Debiana przez minicom".
Nie używaj String bo Ci się za chwilę pamięć skończy.
Klasa Serial ma taka fajną metodę readBytesUntil - po coś ona jest...
Czyli coś w stylu:
char buf[4]; byte nb; nb=Serial.readBytesUntil('\n',buf,4);
i potem sobie przez strcmp/strncmp sprawdzasz co przylazło do bufora.
Offline
Bez uzycia minicom'a to:
stty -F /dev/nazwa_urzadzenia raw speed 9600 echo 'Hello' > /dev/nazwa_urzadzenia
Pamiętaj, żeby dobrze ustawić prędkości, kontrole przepływu, przystości itp,itd.
Ostatnio edytowany przez Piotr3ks (2015-11-10 17:34:38)
Offline
Poprawiłem program i teraz działa, ale tylko jeżeli komunikuję się przez minicom. Nie działa natomiast komunikacja przez stty. W tym celu założyłem nowy temat --> [url]https://forum.dug.net.pl/viewtopic.php?id=27935[/url] Dziękuje za pomoc.
Działający program:
int led = 13; void setup() { pinMode(led, OUTPUT); Serial.begin(9600); } void loop() { char buf[4]; int charsRead; while (Serial.available() > 0) { charsRead = Serial.readBytesUntil('\n', buf, 4); buf[charsRead] = '\0'; } if (strcmp(buf, "on") == 0) { digitalWrite(led, HIGH); } else if (strcmp(buf, "off") == 0) { digitalWrite(led, LOW); } }
Offline
Strony: 1
Time (s) | Query |
---|---|
0.00009 | SET CHARSET latin2 |
0.00004 | SET NAMES latin2 |
0.00121 | 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.188.91.223' WHERE u.id=1 |
0.00058 | REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '18.188.91.223', 1732516687) |
0.00050 | SELECT * FROM punbb_online WHERE logged<1732516387 |
0.00031 | 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=27883 AND t.moved_to IS NULL |
0.00023 | SELECT search_for, replace_with FROM punbb_censoring |
0.00100 | 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=27883 ORDER BY p.id LIMIT 0,25 |
0.00076 | UPDATE punbb_topics SET num_views=num_views+1 WHERE id=27883 |
Total query time: 0.00472 s |