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-10 15:26:38

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

[solved] Jak wysłać string z Debiana do Arduino przez minicom ?

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

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 == "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.

Kod:

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

 

#2  2015-11-10 16:10:58

  ethanak - Użytkownik

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

Re: [solved] Jak wysłać string z Debiana do Arduino przez minicom ?

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:

Kod:

char buf[4];
byte nb;
nb=Serial.readBytesUntil('\n',buf,4);

i potem sobie przez strcmp/strncmp sprawdzasz co przylazło do bufora.


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

Offline

 

#3  2015-11-10 17:33:33

  Piotr3ks - Też człowiek :-)

Piotr3ks
Też człowiek :-)
Zarejestrowany: 2007-06-24

Re: [solved] Jak wysłać string z Debiana do Arduino przez minicom ?

Bez uzycia minicom'a to:

Kod:

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

 

#4  2015-11-26 13:35:33

  prosze - Użytkownik

prosze
Użytkownik
Zarejestrowany: 2012-09-25

Re: [solved] Jak wysłać string z Debiana do Arduino przez minicom ?

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:

Kod:

  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

 

Stopka forum

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