Sari la conținut
ELFORUM - Forumul electronistilor

Serial communication cum si de ce?


Vizitator sea

Postări Recomandate

Vizitator sea

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 spre comentariu
  • Răspunsuri 13
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • cirip

    4

  • nico_2010

    3

  • mihaicozac

    2

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.

 

Editat de cirip
Link spre comentariu
Vizitator sea

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 spre comentariu

La Arduino interfaţa serială implicită este cea pe care îl şi programezi, adică COM-ul aferent USB-ului. În cazul ăsta se aşteaptă după un anumit caracter introdus în fereastra de monitorizare serială din IDE.

Link spre comentariu
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 spre comentariu
Vizitator sea

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 spre comentariu

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 spre comentariu
Vizitator sea

@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 spre comentariu
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/

 

Editat de nico_2010
Link spre comentariu

"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!

Editat de nico_2010
Link spre comentariu

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 spre comentariu
Vizitator sea

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 spre comentariu
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 spre comentariu

Creează un cont sau autentifică-te pentru a adăuga comentariu

Trebuie să fi un membru pentru a putea lăsa un comentariu.

Creează un cont

Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!

Înregistrează un nou cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări