Sari la conținut
ELFORUM - Forumul electronistilor

dilema program


nimeni_altci

Postări Recomandate

Salut

 

Am facut urmatorul program pentru Arduino:

 

int incomingByte = 0; // for incoming serial data

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

void loop() {

// send data 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.write(incomingByte); Serial.print('n'); }}

 

Practic citesc o valoare pe serial si mi.o trimite inapoi.

Am folosit serial monitor sa testez programul.

Cand ii trimit "G" imi returneaza tot "G". La fel merge pentru orice character atata timp cat e doar unul. Dar cand trimit "ggg" , imi trimite de 3 ori "g" unul sub altul. Adica le citeste pe rand. Cum as putea modifica programul ca sa imi citeasca tot stringul odata?

 

Multumesc

Link spre comentariu
  • Răspunsuri 15
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • nimeni_altci

    7

  • Liviu M

    5

  • nico_2010

    1

Vizitator cobru

Ceva de genul:

char sir[64];void loop(){  if(Serial.available()) {      int pos = 0;      while (Serial.available() && pos < 63)         sir[pos++] = Serial.read();      sir[pos] = 0;      Serial.print("ai trimis: ");      Serial.print(sir);      Serial.print("n");  }}

Practic e cam la fel ca ultimul exemplu de la linkul asta https://gist.github.com/94327/2f51486f19d5eeb96dfc701c7f46821cdeac4e22

 

Asta-i varianta C, daca nu-ti pasa ca folosesti mai multa memorie poti folosi si String de C++...  Vezi documentatia la Serial.readString si Serial.readStringUntil (ultimul e foarte util pentru a implementa "comenzi" trimise din serial monitor).

 

Sper ca te ajuta.

Link spre comentariu
Vizitator cobru

Foloseste succesiunea de comenzi de mai jos:

 

  Serial.print("I received: ");

Serial.println(incomingByte);

 

 

Nu e bine, cand serial monitorul trimite "GGG" (3 caractere se scriu dintr-o data, libraria serial le va receptiona deodata) ii va veni inapoi din arduino:

I received: G

I received: G

I received: G

 

Eu am inteles ca trebuie sa apara "I received: GGG"

Link spre comentariu

Da, cobru are dreptate. Multumesc frumos pentru lamurire.Si mai am o curiozitate. Este posibil sa transmit si altceva pe serial? De exemplu sa primesc pe Rx un semnal audio(de dimensiune mica) si sa il trimit pe Tx?

Link spre comentariu

Daca scopul e "doar" transmiterea fara linie noua intre caractere, functioneaza si fara variabile suplimentare.

Variabila sir e necesara daca se doresc alte prelucrari ale datelor receptionate.

void loop() {  int incomingByte = 0;   // for incoming serial data  // put your main code here, to run repeatedly:  // send data only when you receive data:    if (Serial.available() > 0) {      //mesajul de politete      Serial.print("I received: ");      // read the incoming byte:      while(Serial.available()){         incomingByte = Serial.read();         // say what you got:         Serial.write(incomingByte);       }      Serial.print('n'); //linie noua    } }

Este posibil sa transmit si altceva pe serial?

Pe USART poti transmite orice date corect formatate - acelasi numar de biti de start, de biti de stop, de biti de date, paritate... la ambele capete ale sarmei.

Editat de Liviu M
Link spre comentariu

In mod sigur nu doresc doar afisarea, pentru ca nu ar fi prea de folos. Ma interesa si prelucrarea dar am inteles cum se face. Ceea ce vreau sa intreb daca e  posibil e aprinderea unui led(cu 2 Arduino). Sa zicem ca am un led conectat la unul din Arduino, si sa transmit din alt Arduino o comanda seriala care aprinde ledul. Ar fi posibil transmiterea unei litere sa zicem din al doilea arduino, iar cand primul detecteaza acea litera sa dea comanda de aprins ledul. Dar sunt curios daca e direct functie pentru transmiterea seriala de aprindere a ledului.

Link spre comentariu
Vizitator cobru

Daca dai un google search printre primele rezultate gasesti si ceva ce seamana cu ce vrei tu: http://robotic-controls.com/learn/arduino/arduino-arduino-serial-communication

 

In principiu legi RX la TX intre cele doua (RX de la primu la TX de la al doilea si TX de la primu la RX de la al doilea, GND la GND) si pe urma de pe cel care trimite poti face Serial.write() si pe celalalt vei primi cu Serial.read() (ca si cum ar fi trimis textul din serial monitor). Bineinteles, trebuie ca ambele sa aiba aceeasi parametri de comunicare (Serial.begin(aceeasi viteza)).

Link spre comentariu

Ar trebui sa poti, dar nu cu transmisie seriala asincrona (RS232) ca cea folosita la comunicatia cu PC-ul, ci folosind comunicatia SPI.

Din cate stiu eu, arduino o stie si pe asta.

Editat de Liviu M
Link spre comentariu

Pai dupa ce le receptionezi prin SPI de la module (sa zicem intr-un vector), le trimiti si pe seriala la PC.

Ce faci cu ele in PC, n-am idee, ca o se le primesti ca un sir de caractere (adica variabile char, pe 8 biti).

Link spre comentariu

Aici as dori o explicatie mai detaliata. Eu am trimis pe Serial doar caractere(litere, cifre). Cum se poate trimite si un semnal  analogic, ca vocea de exemplu?

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