Arduino Hello World în monitor serial

Bună, ni s-a cerut să programăm ceva care, atunci când introduc ceva în monitorul serial, imprimă Hello world, dar captura este doar imprimă hello world în condițiile în care intrarea dvs. în monitorul serial este o intrare de 3 biți și după aceea trebuie să am un cod care apoi îl oprește de la imprimare iar și iar. singura mea problemă este că nu știu cu adevărat să număr numărul de biți ai unei intrări și, de asemenea, să o opresc de la imprimare continuă.

void setup() { Serial.begin(9600); } void loop() { String readSerial; String input; while(Serial.available() > 0){// put your main code here, to run repeatedly: delay(2); input.concat(String((char)Serial.read())); return input; } Serial.println("HELLO WORLD"); } 

Comentarii

  • Este o sarcină la clasa școlară?
  • Vă rugăm să adăugați codul dvs.
  • Da, este. Și este și o sarcină înainte de lecția efectivă
  • Ce vrei să spui exact prin intrare pe 3 biți? Interfața serială trimite doar octeți întregi. Este vorba despre valori specifice în 3 din cei 8 biți ai unui singur octet?
  • se spune aici că 3 caractere gata să fie citite (octeți) sunt 3 biți? sau presupunerea mea este greșită?

Răspuns

Judecând pe baza comentariilor, aveți câteva cunoștințe de bază. Pentru a învăța cu adevărat, ceea ce ar trebui să învățați în această sarcină, ar trebui să revedeți materialul de învățare sau tutorialele C / C ++ și Arduino pe web Aici îți voi oferi doar câteva indicii cu raționament, care te pot ajuta în rezolvarea sarcinii sarcinilor. desigur, nu este foarte clar, care este exact sarcina aici)

  • Interfața Serial a Arduino (o interfață UART) trimite datele în octeți, unul câte unul și unul după altul (de unde și numele serial). 1 octet este o serie de 8 biți, fiecare dintre ei având o valoare de 1 sau 0. Împreună cei 8 biți formează o valoare, care poate fi exprimată și ca o valoare zecimală de la 0 la 255. De exemplu 01001011 este echivalentul binar al numărului zecimal 75. (Pentru explicații suplimentare google sistemul de numere binare) Datele de octeți pot fi exprimate și ca caractere, așa cum sunt definite în standardul ASCII. Fiecare valoare binară se referă la un caracter specific. Așa se întâmplă în monitorul serial al IDE Arduino. (Pentru mai multe explicații google ASCII)
  • Deoarece datele sunt trimise în serie, pot apărea unele întârzieri în transmisie, care sunt neobservabile de oameni, dar Arduino este suficient de rapid, astfel încât Serial.available() poate returna 0, deoarece în acel moment a avut loc o mică întârziere în transmisie. Prin urmare, este important să prindeți întregul mesaj, înainte de a încerca să lucrați cu el. Puteți face acest lucru fie numărând octeți (așteptând până când cel puțin 3 octeți sunt disponibili în buffer) sau marcând sfârșitul mesajului cu un caracter special (de exemplu, caracterul de linie nouă „\ n”). Există o mulțime de tutoriale pe web despre cum să faceți ambele. Puteți începe cu blogul Majenko .
  • Puteți obține numărul de octeți primiți, cu valoarea returnată Serial.available(). Se va returna 3, când sunt 3 octeți gata de citit în buffer.
  • Dacă definiți o variabilă în void loop(), va fi aruncat când funcția se termină și se redefinește, când funcția pornește din nou (în lumea Arduino funcția void loop() este apelată din nou și din nou pentru totdeauna) . Veți pierde tot conținutul care a fost scris în această variabilă. Dacă doriți să persistați date asupra execuțiilor funcției void loop(), puteți defini variabila în afara oricărei funcții la partea de sus a programului dvs. Această variabilă este apoi globală și va fi definită o singură dată la începutul programului și menținută pe întreaga durată de viață a programului.
  • După cum am scris în comentariu, nu ar trebui să returnați o valoare dintr-o funcție void, s ince void înseamnă mai ales că nu există nicio valoare de returnare. Și revenirea din funcția void loop() va reporni această funcție doar (deoarece ne aflăm în lumea Arduino).
  • Puteți renunța la delay(2). Nu este nevoie de ea. Și dacă funcționează numai cu întârzierea, atunci altceva nu este corect și pur și simplu lucrați cu simptomele în loc de problema reală.

De asemenea, nu ar trebui să încercați să construiți totul pe deține și reinventează roata. În schimb, încercați să priviți exemplele care vin împreună cu IDE-ul Arduino. De exemplu, exemplul SerialEvent, care arată cum să primiți un mesaj serial (care este încheiat cu un caracter de linie nouă „\ n”). De asemenea, aruncați o privire la celelalte exemple conexe. Dacă înțelegeți cum funcționează, veți putea efectua sarcina fără nicio problemă.

Comentarii

  • Bună ziua, cred că ' sunt aproape de obținerea acestuia, dar există o întrebare rapidă oricum despre resetarea serialului.available (); valoare și revenirea la 0?
  • Puteți face Serial.read() fără a utiliza valoarea returnată, până când Serial.available() returnează 0.

Răspuns

Presupunând că schița ar trebui să imprime „Hello World” atunci când caracterul de intrare are 3 biți înălțime. Iată câteva variante diferite de numărare a numărului de biți setați într-un octet.

int bits1(int c) { int res = 0; for (int i = 0; i < 8; i++) { if ((1 << i) & c) res = res + 1; } return (res); } int bits2(int c) { int m = 0x80; int res = 0; do { if (m & c) res++; } while (m >>= 1); return (res); } int bits3(int c) { int m = 0x80; int res = 0; do { res += (m & c) != 0; } while (m >>= 1); return (res); } #define bits4(c) __builtin_popcount(c) #define bits bits4 void setup() { Serial.begin(9600); while (!Serial); } void loop() { if (Serial.available() > 0) { int c = Serial.read(); if (bits(c) == 3) { Serial.print((char) c); Serial.print(":"); Serial.print(c, BIN); Serial.println(": Hello World"); } } } 

Lasă un răspuns

Adresa ta de email nu va fi publicată. Câmpurile obligatorii sunt marcate cu *