Arduino és PC közötti soros kommunikáció
Arduino és PC közötti soros kommunikáció
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
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
Re: Arduino és PC közötti soros kommunikáció
Nálam első google találat: http://www.codeproject.com/Articles/992 ... rary-for-C
Re: Arduino és PC közötti soros kommunikáció
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.
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.
Re: Arduino és PC közötti soros kommunikáció
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?
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?
Re: Arduino és PC közötti soros kommunikáció
Master: 2 sorosport
1.: 485 (pl. ModBus vagy DMX)
2.: PC/USB
Ha a 2. soroson van valami, akkor azt a PC küldte
1.: 485 (pl. ModBus vagy DMX)
2.: PC/USB
Ha a 2. soroson van valami, akkor azt a PC küldte
Re: Arduino és PC közötti soros kommunikáció
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.
-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.
Re: Arduino és PC közötti soros kommunikáció
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().
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().
Re: Arduino és PC közötti soros kommunikáció
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:
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
}
}
} Re: Arduino és PC közötti soros kommunikáció
Szia!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:
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!
Re: Arduino és PC közötti soros kommunikáció
Köszönöm! Találtam is egy használható példát amiből ezt csináltam:
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?
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);
} Re: Arduino és PC közötti soros kommunikáció
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):
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.
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...
13
10
Kipróbáltam az arduinos terminál emulátorral, és putty-al is.
Re: Arduino és PC közötti soros kommunikáció
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:
és nem figyelsz arra, hogy mekkora a tömböd, még később ki is akarod íratni a 3. elemét:
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:
$ 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.
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++;
Kód: Egész kijelölése
Serial.print("Az harmadik: ");
Serial.println(cmd[2]);
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);
}
És volt ez a cmd tömb méret hiba is.
