Vizitator sea Postat Iunie 16, 2018 Partajează Postat Iunie 16, 2018 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
nico_2010 Postat Iunie 16, 2018 Partajează Postat Iunie 16, 2018 Cred ca ar trebui sa incepi de aici: https://www.arduino.cc/reference/en/ fara sa arzi etape. Dupa ce citesti cu atentie si intelegi cum functioneaza totul te apuci de teste Link spre comentariu
cirip Postat Iunie 16, 2018 Partajează Postat Iunie 16, 2018 (editat) 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 Iunie 16, 2018 de cirip Link spre comentariu
Vizitator sea Postat Iunie 16, 2018 Partajează Postat Iunie 16, 2018 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
mihaicozac Postat Iunie 16, 2018 Partajează Postat Iunie 16, 2018 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
cirip Postat Iunie 17, 2018 Partajează Postat Iunie 17, 2018 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 Postat Iunie 17, 2018 Partajează Postat Iunie 17, 2018 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
nico_2010 Postat Iunie 18, 2018 Partajează Postat Iunie 18, 2018 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 Postat Iunie 18, 2018 Partajează Postat Iunie 18, 2018 @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
cirip Postat Iunie 19, 2018 Partajează Postat Iunie 19, 2018 (editat) 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 Iunie 19, 2018 de nico_2010 Link spre comentariu
nico_2010 Postat Iunie 19, 2018 Partajează Postat Iunie 19, 2018 (editat) "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: Apoi, daca transmit o valoare (1 in cazul meu), adica scriu 1 si apas "Send": obtin asta: 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 Iunie 19, 2018 de nico_2010 Link spre comentariu
mihaicozac Postat Iunie 19, 2018 Partajează Postat Iunie 19, 2018 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 Postat Iunie 19, 2018 Partajează Postat Iunie 19, 2018 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
cirip Postat Iunie 20, 2018 Partajează Postat Iunie 20, 2018 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
Postări Recomandate
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 contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum