Jump to content
ELFORUM - Forumul electronistilor

Serial communication cum si de ce?


Guest sea

Recommended Posts

Salutare,

Am un modul Wemos ESP8266, D1 mini R2 si fac cateva teste pe el.
Inerc sa inteleg logica acestui cod:

void setup () {
pinMode (6, OUTPUT);
digitalWrite(13, LOW);

Serial.begin(9600);
}

void loop() {
if(Serial.available() > 0) {
    char letter = Serial.read();
    if(letter == '1'){
        digitalWrite(13,HIGH);
    }
   else if(letter == '0') {
       digitalWrite(13,LOW);
  }
}
}

 

Ce nu inteleg este:
pentru Serial.begin(9600); - care pin il setez cu rata de transfer?
in coditia primului if Serial.available() - din care pin compara datele cu 0 si cu il aujuta functia available();
iar pentru Serial.read() - pe ce pin scrie?

Multumesc!

 

 

Link to comment
  • Replies 13
  • Created
  • Last Reply

Top Posters In This Topic

Salut,

 

Schema si asignarea pinilor modulului se gaseste aici:  https://wiki.wemos.cc/products:d1:d1_mini

 

pentru Serial.begin(9600); - care pin il setez cu rata de transfer?

Atat pinul TX cat si RX sunt setate cu rata de transfer. In realitate metoda begin din functia Serial configureaza complet toata interfata seriala hardware din interiorul cipului ESP. Nu este necesar sa cunosti detaliile, decat in cazul in care vrei sa faci ceva mai ezoteric. Altfel, pentru cei mai multi utilizatori, simpla utilizare a functiei Serial in conformitate cu documentatia, este suficienta.

 

in coditia primului if Serial.available() - din care pin compara datele cu 0 si cu il aujuta functia available();

Din niciun pin. Este un bit din interiorul interfetei seriale, care este testat si prin care seriala "spune" daca a receptionat ceva.

 

iar pentru Serial.read() - pe ce pin scrie?

Intrebarea este ambigua. Cine scrie? ESPul? ESPul nu scrie pe serial.read. Ca sa citesti seriala, trebuie ca un dispozitiv extern sa fi scris ceva pe pinul RX. Cu referire la schema din linkul de mai sus, convertorul USB/Serial de pe placuta scrie pe pinul RX al procesorului date preluate de la calculator prin interfata USB.

 

Edited by cirip
Link to comment

Ehe lucruri încep sa aibă un înțeles.

În cazul modulului meu Wemos ESP8266 D1 mini R2, am pini notați cu A (defapt unul) cu D, TX și RX:

- bănuiesc ca pe pinul notat cu A pot trimite sau primi semnal analogic 0V....5V

- pe pinii notați cu D pot trimite și primi semnal 0V sau 5V (deși în urma testelor mele am reuși sa transfer semnal analogic)

- pe cei doi pini TX și RX din ce am înțeles până acum pot recepționa sau transmite informație de tip int, char fără volți (nu știu dacă pe cei doi pini pot transmite semnale digitale și analogice).

 

Căutând informații pe arduino.cc despre Serial.available() m-a determinat sa caut răspunsuri și în altă parte.

Pe linia de cod:

if(Serial.available() > 0)

 modulul verifică dacă există semnal pe unul din cele două seriale (TX și RX) ?

Într-un exemplu pe arduino.cc:

if (Serial.available())

reiese ca funcția available poate returna pe lângă valori de tip int poate returna și TRUE sau FALSE ?

 

În privința funcției read():

char letter = Serial.read();

din care pin TX sau RX citește date și îi atribuie variabilei letter?

 

Vă mulțumesc pentru răbdarea acordată de a mă ajuta să înțeleg cum stau lucrurile!

Link to comment
8 hours ago, sea said:

modulul verifică dacă există semnal pe unul din cele două seriale (TX și RX) ?

Nu. Dupa cum scrie in documentatie, "Serial.available() Get the number of bytes (characters) available for reading from the serial port". Receptorul (RX) interfetei seriale foloseste buffere de 64 de octeti. Serial.available() iti spune cati octeti au fot receptionati si se afla in buffer gata pentru a fi transferati in alta zona de memorie.

 

Citeste cu atentie aici: https://www.arduino.cc/reference/en/language/functions/communication/serial/available/  E prea mult de explicat.

 

8 hours ago, sea said:

din care pin TX sau RX citește date și îi atribuie variabilei letter?

Serial.read() nu citeste din pin. Citirea din pin e treaba hardwareului. Functia te ridica mai sus de nivelul citirii din pin. Serial.read() citeste un octet carea fost deja deserializat, i s-au scos bitii de start si stop, eventual si de paritate si asteapta cumintel sa fie citit direct dintr-un registru paralel de 8 biti.

 

Are dreptate Nico. Trebuie sa te apuci sa citesti zdravan. Ia foaia de catalog a procesorului si uita-te la capitolul care descrie interfata seriala (UART). E o uzina intreaga acolo.

 

Link to comment

Am conectat modulul Wemos ESP8266 D1 mini R2 la PC si am uplodat codul de mai jos in modul:

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

void loop() {
  Serial.println("line1");
  while (Serial.available() == 0);
  Serial.println ("line2");
  Serial.read();  
}

Logica mea imi da cu virgula in secventa loop()

In prima linie a buclei loop(), TX Modul trimite date catre RX PC (line1)

In while modulul asteapta date de la PC; trimit din fereastra Serial Monitor al IDE Arduino, un octet (TX PC -> RX Modul)

Modulul receptioneaza acel octet si transmite "line2" (TX Modul -> RX PC)

Dupa logica mea codul nu ar trebui sa se opreasca aici asteptand ca PC-ul sa ii trimita octeti?

Codul continua iar TX Modul trimite "line1" catre RX PC

 

Multumesc!

Link to comment

Vezi ce se intampla daca vrei sa arzi etape in cunoastere?

while (Serial.available() == 0);

Abordare gresita.

Uite un exemplu care functioneaza:

 

int incomingByte = 0;	// for incoming serial data

void setup() {
	Serial.begin(9600);	// opens serial port, sets data rate to 9600 bps
}

void loop() {

	// reply only when you receive data:
	if (Serial.available() > 0) {
		// read the incoming byte:
		incomingByte = Serial.read();

		// say what you got:
		Serial.print("I received: ");
		Serial.println(incomingByte, DEC);
	}
}

Si ti-l modifici tu cum vrei.

Si ceva mai mult, citeste bine asta: http://forum.arduino.cc/index.php?topic=396450.0  si experimenteaza

Link to comment

@nico_2010 citesc si fac teste ore intregi, insa uneori raman fara raspuns la propriile intrebari.

Exemple care functioneaza am testat din ceea ce oferta arduino.cc, ce ofera blogeri, videoblogeri, etc. Dupa interventia in detaliu a lui @cirip am inceput sa inteleg cum stau lucrurile cu privire la TX si RX, am inceput sa fac teste si sa imi pun intrebi cum functioneaza, altfel nu postam la ora 01:30 noaptea.

Secventa codului de mai jos incerc sa o parcurg pas cu pas si sa inteleg de ce stau lucrurile asa si revin cu intrebarile poate cineva are rabdarea sa imi explice de ce codul functioneaza in modul aceasta.

void loop() {
  Serial.println("line1");
  while (Serial.available() == 0);
  Serial.println ("line2");
  Serial.read();  
}

Multumesc!

Link to comment
void loop() {                                        // inceput bucla; continutul acoladelor se executa pana tai alimentarea
  Serial.println("line1");                      // Scrie la seriala spre calculator "line1"
  while (Serial.available() == 0);       // Asteapta aici pana cand primeste un caracter de la calculator. Aici e singurul loc in care bucla se opreste temporar.
  Serial.println ("line2");                     // Scrie la seriala spre calculator "line2"
  Serial.read();                                     // Citeste seriala, dar rezultatul citirii nu e pus in nicio variabila,  apoi trece mai departe
}                                                            // Sfarsit bucla. De aici se intoarce la inceputul buclei si totul se repeta.

https://www.arduino.cc/reference/en/language/functions/communication/serial/read/

 

Edited by nico_2010
Link to comment

"citesc si fac teste ore intregi, insa uneori raman fara raspuns la propriile intrebari.

Exemple care functioneaza am testat din ceea ce oferta arduino.cc, ce ofera blogeri, videoblogeri, etc. Dupa interventia in detaliu a lui @cirip am inceput sa inteleg cum stau lucrurile cu privire la TX si RX, am inceput sa fac teste si sa imi pun intrebi cum functioneaza, altfel nu postam la ora 01:30 noaptea.

Secventa codului de mai jos incerc sa o parcurg pas cu pas si sa inteleg de ce stau lucrurile asa si revin cu intrebarile poate cineva are rabdarea sa imi explice de ce codul functioneaza in modul aceasta."

 

Am testat programelul tau si constat ca functioneaza conform asteptarilor, respectiv:

La deschiderea ferestrei de comunicatii pentru portul setat apare urmatoarea imagine:

 

forum_arduino.thumb.png.91a0f3685f188b62ab673cd816738cba.png

 

Apoi, daca transmit o valoare (1 in cazul meu), adica scriu 1 si apas "Send":

 

forum_arduino1.thumb.png.a848d082c01878048074f03d9e9d520e.png

 

obtin asta:

 

forum_arduino2.thumb.png.ee42d79af189990d107d9699793c8907.png

 

adica ceea ce se presupune ca trebuia sa faca programul.

Ca urmare, care este nedumerirea ta? Imi pastrez opinia despre incercarea ta de a arde etape!

Edited by nico_2010
Link to comment

Din câte ştiu eu funcţia Serial.read scrie într-un buffer ceea ce citeşte prin port, astfel deşi caracterul este citit la sfârşitul programului el este memorat şi comparat abia la următoarea reiterare a buclei, funcţia while citeşte şi compară de fapt bufferul nu aşteaptă după caracterul "0" blocând bucla.

Link to comment

Serial.available() o data ce a citit date din buffer va fi true pe tot parcursul executie codului, sau returneaza true iar dupa ce s-au epuizat datele din buffer intra in false ?

Link to comment
7 hours ago, sea said:

Serial.available() o data ce a citit date din buffer

Serial.available() nu citeste nimic din buffer. El doar spune cate date sint acolo si de cate ori trebuie sa citeasca Serial.read(). Pana nu ai golit bufferul, Serial.available() o sa tot spuna ca mai e ceva acolo.

Dar cred ca cel mai sigur e sa experimentezi si sa te convingi singur, ca doar ai jucaria pe masa.

Link to comment

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now



×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.Terms of Use si Guidelines