Arduino Hallo wereld in seriële monitor

Hallo, we werden gevraagd om iets te programmeren dat wanneer ik iets invoerde in de seriële monitor, het Hallo wereld afdrukt, maar de vangst is het alleen drukt hallo wereld af onder de voorwaarden dat uw invoer in de seriële monitor een 3-bits invoer is en daarna moet ik een code hebben die het afdrukken dan steeds weer stopt. mijn enige probleem is dat ik niet echt weet hoe ik het aantal bits van een invoer moet tellen en ook niet kan stoppen met continu afdrukken.

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

Opmerkingen

  • Is dit een opdracht voor een schoolklas?
  • Voeg je code toe.
  • Ja. En het is ook een opdracht vóór de eigenlijke les
  • Wat bedoel je precies met 3-bits invoer? De seriële interface verzendt alleen hele bytes. Gaat het om specifieke waarden in 3 van de 8 bits van een enkele byte?
  • er staat hier dat 3 klaar om gelezen te worden karakter (bytes) is dat 3 bits? of ben is mijn aanname verkeerd?

Antwoord

Afgaande op de opmerkingen, loop je wat basiskennis achter. Om echt te leren, wat je in deze opdracht zou moeten leren, moet je je leermateriaal of C / C ++ en Arduino Tutorials op het web bekijken Hier zal ik je alleen enkele hints geven met redenering, die je kunnen helpen bij het oplossen van de opdrachtopdracht. (Helaas het is natuurlijk niet echt duidelijk wat hier precies de taak is)

  • De Serial -interface van de Arduino (een UART-interface) stuurt de gegevens in bytes, een voor een en een voor een (vandaar de naam serial). 1 byte is een reeks van 8 bits, elk met een waarde van 1 of 0. Samen vormen de 8 bits een waarde, die ook kan worden uitgedrukt als een decimale waarde van 0 tot 255. Bijvoorbeeld 01001011 is het binaire equivalent van het decimale getal 75. (Voor verdere uitleg google het binaire getalsysteem) De bytegegevens kunnen ook worden uitgedrukt als tekens, zoals ze zijn gedefinieerd in de ASCII-standaard. Elke binaire waarde verwijst naar een specifiek teken. Dit is wat er gebeurt in de seriële monitor van de Arduino IDE. (Voor meer uitleg google ASCII)
  • Aangezien de gegevens serieel worden verzonden, kunnen er enkele vertragingen optreden in de verzending, die onmerkbaar zijn voor mensen, maar de Arduino is snel genoeg, zodat de Serial.available() commando kan 0 retourneren, omdat op dat moment een kleine vertraging in de verzending optrad. Daarom is het belangrijk om de hele boodschap op te vangen voordat u ermee aan de slag gaat. U kunt dit doen door ofwel bytes te tellen (wachten tot er tenminste 3 bytes beschikbaar zijn in de buffer) of door het einde van het bericht te markeren met een speciaal teken (bijvoorbeeld het nieuwe-regel-teken “\ n”). Er zijn veel tutorials op internet om beide te doen. U kunt beginnen met Majenko “s blog .
  • U kunt het aantal ontvangen bytes ophalen met de retourwaarde Serial.available(). Het zal 3 retourneren als er 3 klaar zijn om gelezen te worden in de buffer.
  • Als je een variabele definieert binnen de void loop(), het wordt weggegooid wanneer de functie eindigt en opnieuw wordt gedefinieerd, wanneer de functie opnieuw start (in de Arduino-wereld wordt de void loop() -functie keer op keer voor altijd aangeroepen) . U verliest alle inhoud die naar deze variabele is geschreven. Als u gegevens wilt behouden over de uitvoeringen van de void loop() -functie, kunt u de variabele buiten elke functie definiëren aan de bovenaan je programma. Deze variabele is dan globaal en zal slechts één keer aan het begin van het programma worden gedefinieerd en gedurende de hele levensduur van het programma worden vastgehouden.
  • Zoals beschreven in de opmerking mag je geen waarde retourneren van een void functie, s ince void betekent meestal dat er geen retourwaarde is. En als je terugkeert van de void loop() -functie, wordt deze functie alleen opnieuw gestart (aangezien we ons in de Arduino-wereld bevinden).
  • Je kunt de delay(2). Het is niet nodig. En als het alleen werkt met de vertraging, dan is er iets anders niet correct en werkt u alleen met de symptomen in plaats van met het echte probleem.

Probeer ook niet alles op uw computer te bouwen. het wiel bezitten en opnieuw uitvinden. Probeer in plaats daarvan de voorbeelden te bekijken die bij de Arduino IDE worden geleverd. Bijvoorbeeld het SerialEvent voorbeeld, dat laat zien hoe je een serieel bericht kunt ontvangen (dat wordt beëindigd door een nieuwe regel “\ n”). Bekijk ook de andere gerelateerde voorbeelden. Als je begrijpt hoe ze werken, kun je de opdracht zonder problemen uitvoeren.

Opmerkingen

  • Hallo nogmaals, ik denk dat ik ' m bijna gekregen, maar een snelle vraag is hoe dan ook om de serial.available () te resetten; waarde en terugzetten naar 0?
  • U kunt Serial.read() doen zonder de geretourneerde waarde te gebruiken, totdat Serial.available() 0 retourneert.

Answer

Ervan uitgaande dat de sketch “Hello World” moet afdrukken als het invoerteken 3 bits hoog is. Hier zijn een paar verschillende varianten van het tellen van het aantal bits dat in een byte is ingesteld.

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

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *