Arduino Hello World a soros monitoron

Szia, arra kértek minket, hogy programozzanak valamit, amit amikor beírok valamit a soros monitorba, a Hello világot kinyomtatja, de a fogás csak ez Helló világot nyomtat, olyan feltételek mellett, hogy a soros monitor bemenete 3 bites bemenet, és utána szükségem van egy kódra, amely megakadályozza, hogy újra és újra nyomtasson. Az egyetlen problémám az, hogy nem igazán tudom, hogyan kell megszámolni egy bemenet bitjeinek számát, és megakadályozni a folyamatos nyomtatást.

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"); } 

Megjegyzések

  • Ez iskolai osztályfeladat?
  • Kérjük, adja hozzá a kódját.
  • Igen. És ez is egy feladat a tényleges lecke előtt
  • Mit értesz pontosan a 3 bites bemenet alatt? A soros interfész csak teljes bájtokat küld. Ez egy-egy bájt 8 bitjének 3-ban található konkrét értékekről szól?
  • itt azt állítja, hogy 3 olvasásra kész karakter (bájt) az, hogy 3 bit? Vagy téves a feltételezésem?

Válasz

A megjegyzésekből ítélve elmarad néhány alapismeret. Ahhoz, hogy valóban megtanulhassa, mit kell megtanulnia ebben a feladatban, olvassa el a tananyagot vagy a C / C ++ és Arduino oktatóanyagokat az interneten Itt csak néhány tippet adok indoklással, amelyek segíthetnek a feladatok megoldásában. (Unfortu valójában nem világos, hogy pontosan mi is van itt a feladat)

  • Az Arduino (egy UART interfész) Serial felülete elküldi az adatokat bájt, egyenként és egymás után (innen a név serial). Az 1 bájt egy 8 bites sorozat, mindegyik 1 vagy 0 értékű. A 8 bit együttesen olyan értéket alkot, amelyet 0 és 255 közötti tizedesértékként is kifejezhetünk. Például a 75-ös tizedesjegy bináris megfelelője. (További magyarázatokért google a bináris számrendszert keresve.) A bájtadatok karakterként is kifejezhetők, ahogyan azokat az ASCII szabvány meghatározza. Minden bináris érték egy adott karakterre utal. Ez történik az Arduino IDE soros monitorán. (További magyarázatért google ASCII)
  • Mivel az adatokat sorozatosan küldi el, előfordulhat, hogy az átvitel során késések tapasztalhatók, amelyeket az emberek észrevehetetlenek, de az Arduino elég gyors, így a Serial.available() parancs 0-t adhat vissza, mert abban a pillanatban egy kis késés történt az átvitelben. Ezért fontos, hogy elkapja az egész üzenetet, mielőtt megpróbálna vele dolgozni. Ezt megteheti akár bájtok számlálásával (megvárva, amíg legalább 3 bájt rendelkezésre áll a pufferben), akár az üzenet végét egy speciális karakterrel (például az új sor “\ n” karakterével) megjelölve. Nagyon sok oktatóanyag található az interneten, hogyan kell mindkettőt megtenni. Kezdheti Majenko blogjával .
  • Megérheti a beérkezett bájtok számát Serial.available(). 3-at ad vissza, ha 3 kész bájt van a pufferben.
  • Ha a , akkor dobja el, amikor a függvény véget ér, és újradefiniálják, amikor a függvény újra elindul (Az Arduino világban a void loop() függvényt örökké újra és újra meghívják) . Elveszít minden, a változóhoz írt tartalmat. Ha meg akarja őrizni az adatokat a void loop() függvény végrehajtása során, akkor a függvényen kívül megadhatja a változót a A program teteje. Ez a változó ekkor globális, és a program elején csak egyszer definiálódik, és a program teljes élettartama alatt megmarad. egy void függvényből, s Az ince void többnyire azt jelenti, hogy nincs visszatérési érték. És visszatérve a void loop() függvényről, csak újraindul ez a függvény (mivel az Arduino világában vagyunk).
  • A . Nincs rá szükség. És ha ez csak késéssel működik, akkor valami más nem stimmel, és csak a tünetekkel dolgozik, hanem a valódi problémával.

Nem szabad megpróbálnia mindent a saját saját és feltalálja a kereket. Ehelyett próbálja meg megnézni az Arduino IDE-hez mellékelt példákat. Például a SerialEvent példa, amely megmutatja, hogyan fogadhatunk egy soros üzenetet (amelyet egy új sor “\ n” karakter zár le). Vessen egy pillantást a többi kapcsolódó példára is. Ha megértette, hogyan működnek, akkor gond nélkül elvégezheti a feladatot.

Megjegyzések

  • Sziasztok még egyszer, szerintem ' m közel van a megszerzéséhez, de azért van egy gyors kérdés, hogy alaphelyzetbe állítsuk a serial.available (); értéket és visszaállítja 0-ra?
  • Megteheti a Serial.read() elemet a visszaadott érték felhasználása nélkül, amíg a Serial.available() 0-ra tér vissza.

Válasz

Feltételezve, hogy a vázlatnak “Hello World” -et kell nyomtatnia, amikor a bemeneti karakter 3 bit magas. Íme néhány különféle változat a bájtban beállított bitek számának megszámlálására.

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"); } } } 

Vélemény, hozzászólás?

Az email címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük