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 --> https://forum.dug.net.pl/viewtopic.php?id=27935 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