Ce este comunicarea seriala?
Comunicarea seriala este folosita de placa Arduino pentru a comunica cu computerul,prin intermediul portului USB. Se numeste comunicare "seriala" deoarece transmite cate un bit de informatie pe rand,unul dupa altul:
Comunicarea seriala este implementata in cod cu ajutorul librariei incluse "Serial". Aceasta librarie este echivalentul clasei Stream in C++.
Pentru a vizualiza datele trimise prin portul serial,trebuie sa accesam monitorul serial inclus in IDE (Tools>Serial monitor).Ne va aparea urmatoarea fereastra:
Cea mai mare parte a ecranului este ocupata de monitorul serial propriu-zis,unde vizualizam datele trimise prin port. In partea de sus se afla o bara de dialog,unde putem trimite date catre Arduino. In partea de jos putem seta viteza de comunicare cu placa,derularea automata a textului,stergerea textului si modul de incheiere a paragrafelor (de la inceput sau in continuare).
Functii elementare incluse in biblioteca Serial
-functia Serial.begin() initializeaza comunicarea seriala prin portul USB,la viteza inscrisa intre paranteze (de obicei viteza standard de 9600 baud/biti pe secunda):
Serial.begin(9600);
Nota:Viteza selectata in ecranul monitorului serial trebuie sa fie identica cu valoarea din program,altfel datele primite vor fi trunchiate!
-functia Serial.print() afiseaza pe monitorul serial caracterele scrise intre paranteze,sub forma de coduri ASCII. Aceasta functie este echivalenta cu "cout" din C++:
Serial.print("Buna"); // stringurile sau caracterele se scriu intre ghilimele
Serial.print(65); // numerele pot fi scrise fara ghilimele
Serial.print(65,BIN); // afisare numar sub forma binara
Serial.print(65,HEX) // afisare numar sub forma hexadecimala
Serial.print(65,OCT) // afisare numar sub forma octala
Serial.print(1.23456,0) // rotunjire numar la fara zecimale (1)
Serial.print(1.23456,2) // rotunjire numar la a doua zecimala (1.23)
-functia Serial.println() este identica cu functia Serial.print(),cu exceptia faptului ca afiseaza textul dintre paranteze pe un rand nou:
Serial.println("Buna");
-functia Serial.write() afiseaza pe monitorul serial caracterele scrise intre paranteze,sub forma de biti de informatie:
Serial.write(100) // va afisa caracterul corespunzator codului ASCII (d)
Serial.write("Buna") // stringurile sau caracterele se scriu intr ghilimele
Serial.write("100") // daca un numar este scris intre ghilimele,este interpretat ca un string si va fi afisat ca atare
-functia Serial.available() calculeaza numarul de biti (caractere,numere sau stringuri) valabile pentru citire. Aceasta functie este de obicei folosita pentru a afla daca un caracter a fost trimis prin portul serial catre Arduino si poate fi citit:
void setup() {
Serial.begin(9600); // initializeaza comunicarea seriala la viteza de 9600 baud
}
void loop() {
if (Serial.available() > 0) { // daca sunt disponibile date pentru citire
Serial.println("Date disponibile pentru citire"); /* afiseaza pe monitorul serial textul dintre paranteze */
}
else{ // altfel
Serial.println("Nu sunt disponibile date pentru citire"); /* afiseaza pe monitorul serial textul dintre paranteze */
}
}
-functia Serial.read() determina Arduino sa "citeasca" date venite de la computer prin portul serial. De obicei,este folosita impreuna cu functia Serial.available() pentru a afla daca exista date disponibile pentru citire. Aceasta functie este echivalenta cu "cin" din C++:
int data; // creare variabila "data"
void setup() {
Serial.begin(9600); // initializare comunicare seriala la viteza de 9600 baud
}
void loop() {
if (Serial.available() > 0) { // daca sunt disponibile date pentru citire
data = Serial.read(); // variabiala "data" egala cu citirea portului serial
Serial.print("Am receptionat: "); // afiseaza textul dintre paranteze pe monitorul serial
Serial.println(data, DEC); // afiseaza variabila "data" in forma decimala pe monitorul serial
}
}
-functia Serial.setTimeout() seteaza "cat timp" Arduino va astepta date prin portul serial. Dupa terminarea timpului scris intre paranteze (in milisecunde),conexiunea seriala se va inchide:
Serial.setTimeout(1000); /* daca nu sunt trimise date prin portul serial,conexiunea se va inchide dupa 1 secunda */
De asemenea,aceasta functie poate fi folosita in combinatie cu alte functii pentru a modifica tipul de asteptare implicit.
-functia Serial.find() citeste date din portul serial pana cand o anumita "tinta",specificata intre paranteze (cum ar fi un caracter dintr-un string) este gasita. Daca tinta este gasita,functia va returna valoarea 1 (true). Daca tinta nu este gasita intr-o secunda (timp implicit),functia va returna valoarea 0 (false):
if(Serial.find("Multumesc")){ // daca este gasit stringul "Multumesc"
Serial.print("Cu placere"); // afiseaza pe monitorul serial "Cu placere"
}
else{ // altfel
Serial.print("?????"); // afiseaza pe monitorul serial "?????"
}
Serial.setTimeout(2000); /* putem mari timpul implicit de asteptare al functiei,in acest caz la 2 secunde */
-functia Serial.end() inchide comunicarea seriala:
Serial.end();
Concluzii
Comunicarea seriala este una dintre cele mai folositoare caracteristici ale Arduino,facilitand comunicarea intre microcontroller si PC (sau alte dispozitive). De asemenea poate fi folosita pentru a descoperi defectele dintr-un program,vizualizand datele trimise prin portul serial.
Comunicarea seriala va fi folosita foarte des in numeroase proiecte,pentru a comunica cu diversi senzori sau module. In tutorialele viitoare,vom detalia diferitele aspecte si functiii ascunse ale comunicarii seriale!
Comentários