Arduino és PC közötti soros kommunikáció

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Válasz küldése
Avatar
Ecku01
DrótVégénSzéndarab
Hozzászólások: 47
Csatlakozott: 2011. szeptember 12. hétfő, 6:00

Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: Ecku01 »

Sziasztok!

Számítógépen néha programozok C++-ban és arra gondoltam, jó lenne összekötni a számítógépet és az arduinomat. Nyilván a legegyszerűbb módja a soros kommunikáció.
Elsőnek egy egyszerűbb dolgot szeretnék, pl: C++-ban megírt program usb-n küldje el egy változó tartalmát az arduinonak. Ezt hogyan lehetne legegyszerűbben kivitelezni? van rá esetleg vmi hasznos függvény? (nyilván mindezt C++-ban)
Előre is köszönöm a válaszokat.

Üdv.: Ecku01
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: Robert »

Avatar
csabeszq
Bitfaragó
Hozzászólások: 678
Csatlakozott: 2012. szeptember 5. szerda, 6:00

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: csabeszq »

Legutóbb egy furcsa hibába botlottam.

RXTXComm library-t használva futottam bele abba, hogy byte-ok simán elvesztek a nagy semmibe 19200 baud mellett. Azt gondolná az ember, hogy az operációs rendszernek van egy puffere, abba gyűjti az adatokat, így nem lehet gáz mondjuk 1k adat letöltésénél, még akkor sem ha időigényes munkát végzek. Nos lehet, legalábbis RXTXComm alatt.

Az interneten olvastam, hogy az egyik szálnak kizárólag a sorosport inputstream-jén kell várakozni és amint adat jön, átdobni egy másik szálnak, ami feldolgozza. Ha nem ez az architektúra, simán elveszhetnek bájtok, ha a feldolgozás több időt vesz igénybe. Miután átírtam a kódot, elkezdett működni.
Avatar
havasi
DrótVégénSzéndarab
Hozzászólások: 38
Csatlakozott: 2010. szeptember 7. kedd, 6:00

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: havasi »

Sziasztok!
Van egy RS485 hálózatom. A master egy arduino, több attiny slave-vel. A slave-eknek annyi a feladatuk, hogy bekapcsolnak egy eszközt és visszaszólnak a masternak, hogy elindult. Ha a master össze van kötve egy számítógéppel, a gép vezérli a slave-eket, egyesével kapcsolgatja ki-be őket. Ha nincs összekötve számítógéppel, akkor a legutolsó összeköttetéskor megadott 4-5 időpontban be, vagy kikapcsolja az összes slave-et.
A mastert ti hogyan oldanátok meg?
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: Robert »

Master: 2 sorosport
1.: 485 (pl. ModBus vagy DMX)
2.: PC/USB

Ha a 2. soroson van valami, akkor azt a PC küldte :)
Avatar
havasi
DrótVégénSzéndarab
Hozzászólások: 38
Csatlakozott: 2010. szeptember 7. kedd, 6:00

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: havasi »

A master proramjára lennék kíváncsi. Konkrétan:
-Le lehetne azt valahogy kérdezni, hogy PC-vel van-e soros kapcsolat?
-Hogyan tároljam a be-kikapcsolás dátum-időpontokat, hogy össze tudjam hasonlítani egy RTC-vel?
Ezek nem tiszták számomra.
Avatar
Robert
Elektronbűvölő
Hozzászólások: 10213
Csatlakozott: 2005. december 9. péntek, 7:00

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: Robert »

PC kiküld valamit, Arduino válaszol.
Ugyanez OK fordítva is. Arduino kikuldi: IDO? PC visszajön: 2013-05-04 19:57:00
Ha nem jön semmi (timeout) > nincs kapcsolat.

RTCből kijön: év-hónap-nap-óra-perc-mp. Mind byte alapú. Vagy tárolod systime-ként (1970.01.01 00:00:00 óta eltelt idő mp-ben.
Én maradok mindig az elsőnél. igaz helypazarlódd, de nem kell oda-vissza számolgatni/felismerni.

ha 2 pont közt eltelt idő a lényeg, akkor systime().
Avatar
sznorbee
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. október 14. vasárnap, 6:00

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: sznorbee »

Sziasztok! Kezdő vagyok az arduinoban. Van egy SR04-es ultrahang szenzorom amivel csináltam egy önjáró "robot" autót ami nem megy neki a falnak. Ha az akadály 20 cm-en belül van akkor megáll, tölatva kanyarodik kicsit aztán megint előre stb. Szeretném a programomat kibővíteni egy egyszerű soros kommunikációval, hogy az egyszerűbb paraméterek változtatása miatt ne kelljen mindíg újból feltölteni a sketch-et. Sajnos nem tudom hogyan lehetne azt megoldani, hogy ha az arduinonalók elküldöm ezt: M250,500,1300$ akkor azt ő a következőképp értelmezze:

M - nyitókarakter, adatok fognak jönni
250 - x változóba mint szám
500 - y változóba mint szám
1300 - z változóba mint szám
$ - adatsor vége

Túrtam a netet, de nem találtam ehez hasonló megoldást. Illetve azt olvastam, hogy az arduinóban eléggé nehézkes szétszedni a vesszővel elválasztott adatokat.
Találtam egy ilyet, de ez nem hasonlít (ill. nem is működik jól) az én igényeimhez:

Kód: Egész kijelölése

#include <string.h>
char inData[80];
char flightdata[80];
byte index = 0;

void setup()
{
Serial.begin(115200);
}

void loop()
{
   while(Serial.available() > 0)
   {
      char aChar = Serial.read();
      if(aChar == '\n' || index == 20)
      {
            char *p = inData; //point to *p to the string in inData
            char *str;        //declaring *str
            int counter = 0; //initialise the counter

            while (str = strtok_r(p, ",", &p)) // delimiter is the comma
            {
                  flightdata[counter] = *str; //use the counter as an index to add each value to the array
                  counter++; //increment the counter

               p = NULL;
            }
            Serial.print("Speed: "); Serial.println(flightdata[0]); 
            Serial.print("Altitude: "); Serial.println(flightdata[1]); //ditto



         index = 0;
         inData[index] = NULL;
           
      }
      else
      {
         inData[index] = aChar;
         index++;
         inData[index] = '\0'; // Keep the string NULL terminated
      }
   }
} 
dlaszlo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2013. április 20. szombat, 6:38

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: dlaszlo »

sznorbee írta:Sziasztok! Kezdő vagyok az arduinoban. Van egy SR04-es ultrahang szenzorom amivel csináltam egy önjáró "robot" autót ami nem megy neki a falnak. Ha az akadály 20 cm-en belül van akkor megáll, tölatva kanyarodik kicsit aztán megint előre stb. Szeretném a programomat kibővíteni egy egyszerű soros kommunikációval, hogy az egyszerűbb paraméterek változtatása miatt ne kelljen mindíg újból feltölteni a sketch-et. Sajnos nem tudom hogyan lehetne azt megoldani, hogy ha az arduinonalók elküldöm ezt: M250,500,1300$ akkor azt ő a következőképp értelmezze:
Szia!

Ajánlom a stackoverflow oldalt, sok kérdésre adnak gyakorlott programozók választ. A kérdésedre én ezeket találtam:

http://stackoverflow.com/search?q=arduino+split+string

Itt mazsolázgathatsz, példa:

http://stackoverflow.com/questions/9072 ... ring-array
http://stackoverflow.com/questions/1191 ... -c-arduino

Azokat a találatokat érdemes nézni legelőször, ami több szavazatot kapott, és többen válaszoltak.
Egy-egy témát néha alaposan kiveséznek az ide irkáló emberek.

Üdv!
Avatar
sznorbee
Újonc
Újonc
Hozzászólások: 8
Csatlakozott: 2012. október 14. vasárnap, 6:00

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: sznorbee »

Köszönöm! Találtam is egy használható példát amiből ezt csináltam:

Kód: Egész kijelölése

// Buffer to store incoming commands from serial port
String inData;

String  message; // holds text not yet split
int     commaPosition;  // the position of the next comma in the string
String cmd[2];
int x=0;

void setup() {
    Serial.begin(9600);
    Serial.println("Serial conection started, waiting for instructions...");
}

void loop() {
    while (Serial.available() > 0)
    {
        char recieved = Serial.read();
        inData += recieved; 

        // Process message when new line character is recieved
        if (recieved == '\n')
        {
            Serial.print("Arduino Received: ");
            Serial.print(inData);
            message = inData;
            feldol();
            reszlet();

            // You can put some if and else here to process the message juste like that:

            if(inData == "+++\n"){ // DON'T forget to add "\n" at the end of the string.
              Serial.println("OK. Press h for help.");
            }   


            inData = ""; // Clear recieved buffer
        }
    }
}

void feldol() {

 do
  {
      commaPosition = message.indexOf(',');
      if(commaPosition != -1)
      {
          Serial.println( message.substring(0,commaPosition));
          cmd[x] = message.substring(0,commaPosition);
          x++;
          message = message.substring(commaPosition+1, message.length());
      }
      else
      {  // here after the last comma is found
         if(message.length() > 0)
           Serial.println(message);  // if there is text after the last comma,          
                                     // print it
           cmd[x] = message;    
       
      }
   }
   while(commaPosition >=0);
} 
 
void reszlet() {

  Serial.print("Az elso: ");  
Serial.println(cmd[0]);  
Serial.print("Az masodik: ");  
Serial.println(cmd[1]); 
Serial.print("Az harmadik: ");  
Serial.println(cmd[2]); 
delay(2000);
 int a;
    char carray2[6];
    cmd[0].toCharArray(carray2, sizeof(carray2));
    a = atoi(carray2);
 int b;
    //char carray2[6];
    cmd[1].toCharArray(carray2, sizeof(carray2));
    b = atoi(carray2);   
 int c;
    //char carray2[6];
    cmd[2].toCharArray(carray2, sizeof(carray2));
    c = atoi(carray2);
    
Serial.println("Es most mint valtozo:");
Serial.print("Az elso: ");  
Serial.println(a);  
Serial.print("Az masodik: ");  
Serial.println(b); 
Serial.print("Az harmadik: ");  
Serial.println(c);
x = 0;
delay(2000);
}  
A gondom a harmadik azaz utolsó adattal van. A megjelenített adat string-ként mindíg egy '$' jel, integerként pedig 0. Mi lehet a baj?
dlaszlo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2013. április 20. szombat, 6:38

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: dlaszlo »

Egy hibát már biztos találtam benne, kipróbáltam a kódodat:

Nekem egyáltalán nem akarta kiírni a program, amit beírtam, ennek az oka, hogy '\n'vizsgál, mint sorvégét, aminek a kódja az én windows-os gépemen: 13.
A programot viszont úgy fordul le, hogy a sorvége karakter kódja 10.

ezt így irattam ki (részlet):

Kód: Egész kijelölése

    while (Serial.available() > 0)
    {
        char recieved = Serial.read();
        Serial.println((int)recieved);
        Serial.println((int)'\n');
        inData += recieved; 
... stb...
ha entert ütök, két szám íródik ki:
13
10

Kipróbáltam az arduinos terminál emulátorral, és putty-al is.
dlaszlo
DrótVégénSzéndarab
Hozzászólások: 49
Csatlakozott: 2013. április 20. szombat, 6:38

Re: Arduino és PC közötti soros kommunikáció

Hozzászólás Szerző: dlaszlo »

Az előző post-hoz: közben rájöttem, hogy a '\n' probléma arduino ide alatt azért volt, mert rosszul volt beállítva a sorvége jel a (a képernyőn lent).

Még egy dolog, ez van a program elején, egy két elemű tömböt deklarálsz:

String cmd[2];

Utána, amikor darabokra vágod a string-et, elkezded feltölteni:

Kód: Egész kijelölése

 do
  {
      commaPosition = message.indexOf(',');
      if(commaPosition != -1)
      {
          Serial.println( message.substring(0,commaPosition));
          cmd[x] = message.substring(0,commaPosition);
          x++;
és nem figyelsz arra, hogy mekkora a tömböd, még később ki is akarod íratni a 3. elemét:

Kód: Egész kijelölése

Serial.print("Az harmadik: ");  
Serial.println(cmd[2]); 
Nem is tudom így mit csinál így a progi, de gondolom felülvág valamit a memóriában.
Ez pl okozhat problémát.

Szóval így most úgy tűnik jól működik a progi, a cmd[2] deklaráción, és a felold()-on változtattam:

Kód: Egész kijelölése

// Buffer to store incoming commands from serial port
String inData;

String  message; // holds text not yet split
int     commaPosition;  // the position of the next comma in the string
String cmd[3];
int x=0;

void setup() {
    Serial.begin(9600);
    Serial.println("Serial conection started, waiting for instructions...");
}

void loop() {
    while (Serial.available() > 0)
    {
        char recieved = Serial.read();
        inData += recieved; 

        // Process message when new line character is recieved
        if (recieved == '\n')
        {
            Serial.print("Arduino Received: ");
            Serial.print(inData);
            message = inData;
            feldol();
            reszlet();
            inData = ""; // Clear recieved buffer
        }
    }
}

void feldol() {

 for(int i = 0; i < 3; i++)
 {
   cmd[i] = "";
 }
 x = 0;
 do
  {
      commaPosition = message.indexOf(',');
      if(commaPosition != -1)
      {
          Serial.println( message.substring(0,commaPosition));
          cmd[x] = message.substring(0,commaPosition);
          x++;
          message = message.substring(commaPosition+1, message.length());
      }
      else
      {  // here after the last comma is found
         if(message.length() > 0)
           Serial.println(message);  // if there is text after the last comma,          
                                     // print it
           cmd[x] = message;    
       
      }
   }
   while(commaPosition >=0 && x < 3);
} 
 
void reszlet() {

  Serial.print("Az elso: ");  
Serial.println(cmd[0]);  
Serial.print("Az masodik: ");  
Serial.println(cmd[1]); 
Serial.print("Az harmadik: ");  
Serial.println(cmd[2]); 
delay(2000);
 int a;
    char carray2[6];
    cmd[0].toCharArray(carray2, sizeof(carray2));
    a = atoi(carray2);
 int b;
    //char carray2[6];
    cmd[1].toCharArray(carray2, sizeof(carray2));
    b = atoi(carray2);   
 int c;
    //char carray2[6];
    cmd[2].toCharArray(carray2, sizeof(carray2));
    c = atoi(carray2);
    
Serial.println("Es most mint valtozo:");
Serial.print("Az elso: ");  
Serial.println(a);  
Serial.print("Az masodik: ");  
Serial.println(b); 
Serial.print("Az harmadik: ");  
Serial.println(c);
x = 0;
delay(2000);
} 
$ jel gondolom azért jelenik meg neked, és 0 integer, mert a program nem vár $-t a számok végén, csak simán a felsorolást, pl: 1,2,3<enter>
És volt ez a cmd tömb méret hiba is.
Válasz küldése