top of page
Writer's picturechiperaris

Comunicarea seriala asincronizata (UART)

Informatia din acest articol este o continuare si se bazeaza pe articolul acesta.(recomand citirea lui inainte).


UART este cel mai folosit protocol de comunicare pentru Arduino,datorita simplitatii sale atat in hardware (doar 2 conexiuni) cat si in software (implementare in programare usoara).

Acronimul UART vine de fapt de la cipul integrat in microcontroller care controleaza procesul de transmitere si decodarea datelor.

Mecanica UART


UART este un protocol de comunicare asincronizata,ceea ce inseamna ca comunicatia dintre dispozitive nu depinde de un semnal "ceas" de sincronizare. Deoarece viteza de comunicare nu este definita printr-un semnal de sincronizare,dispozitivul care trimite (transmitatorul) nu se poate asigura ca receptorul primeste toate datele in mod corect. Prin urmare,bitii de date sunt divizati in parti a cate 8 biti si trimisi pe rand,pentru a se asigura transmiterea corecta a datelor (datele trimise sa fie aceleasi cu cele trimise).

Un pachet pachet de date UART arata cam asa (fiecare patrat reprezinta un bit):

Un pachet de date UART are 4 componente:

-1 bit de start (intotdeauna nivel 0 logic,tensiunea nivelelor logice variaza intre dispozitive);

-5-9 biti de date (de obicei 8):contin datele propriu zise;

-bit de paritate (optional):are rol de verificare a datelor;daca este un numar impar de biti 1 de date in pachet,bitul de paritate va fi 1,iar daca numarul de biti 1 de date din pachet este par,bitul de paritate este 0. Daca bitul de paritate nu coincide cu numarul de biti 1 de date din pachet,receptorul va trage concluzia ca datele au fost corupte iar transmitatorul va retrimite pachetul respectiv de date.

-1 sau 2 biti de stop:marcheaza finalul pachetului respectiv de date si sterge bufferul receptorului,pregatindu-l pentru urmatorul pachet.

Datorita bitilor suplimentari (pe langa cei de date),comunicarea UART este mai lenta decat alte protocoale de comunicare seriale.


Conexiuni:


Comunicarea UART necesita 2 fire/conexiuni,cu cate 2 pini (Tx pentru transmisie si RX pentru receptie) pentru fiecare dispozitiv implicat.

Comunicarea intre cipuri UART

Pe placa Arduino Uno pinii digitali 0 si 1 pot face comunicare UART,pinul 0 fiind Rx,iar pinul 1 este Tx:

Programare


Biblioteca "Serial" cuprinsa in Arduino IDE usureaza enorm programarea si folosirea UART.

Cele mai folosite functii UART:

-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();


Concluzie


Avantajele si dezavantajele protocolului de comunicare UART:

Avantaje:-foloseste doar 2 conexiuni/fire;

-usor de folosit,programat,vechi (bine documentat);

-half-duplex (cele 2 dispozitive pot comunica in ambele directii,dar nu in acelasi timp!);

-bitul de paritate permite verificarea erorilor;


Dezavantaje:- viteza mica (unul dintre cele mai lente protocoale de comunicare);

-maxim 9 biti de date intr-un pachet;

-nu suporta mai multe dispozitive in retea (maxim 2 dispozitive pot comunica);

-viteza de comunicare (in baud) trebuie setata la fiecare dispozitiv in parte;


Cum comunicarea UART este folosita de multe dispozitive compatibile cu Arduino,in tutorialele urmatoare vom vedea aplicatii practice ale comunicarii UART si folosirea ei in combinatie cu Arduino si alte periferice.


Pentru nelamuriri,adresati-mi intrebari in sectiunea de comentarii!


12 views0 comments

Recent Posts

See All

Comments


bottom of page