Hallo, wir wurden gebeten, etwas zu programmieren, das Hello World druckt, wenn ich etwas in den seriellen Monitor eingebe, aber der Haken ist es nur druckt hallo Welt unter den Bedingungen, dass Ihre Eingabe in den seriellen Monitor eine 3-Bit-Eingabe ist und danach brauche ich einen Code, der verhindert, dass er immer wieder gedruckt wird. Mein einziges Problem ist, dass ich nicht wirklich weiß, wie ich die Anzahl der Bits einer Eingabe zählen und auch verhindern soll, dass sie kontinuierlich gedruckt wird.
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"); }
Kommentare
- Ist dies eine Schulklassenaufgabe?
- Bitte fügen Sie Ihren Code hinzu.
- Ja, das ist es. Und es ist auch eine Aufgabe vor der eigentlichen Lektion
- Was genau meinen Sie mit 3-Bit-Eingabe? Die serielle Schnittstelle sendet nur ganze Bytes. Handelt es sich um bestimmte Werte in 3 der 8 Bits eines einzelnen Bytes?
- Hier steht, dass 3 lesbare Zeichen (Bytes) 3 Bits sind – oder ist meine Annahme falsch?
Antwort
Nach den Kommentaren zu urteilen, bleiben einige Grundkenntnisse zurück. Um wirklich zu lernen, was Sie in dieser Aufgabe lernen sollen, sollten Sie Ihr Lernmaterial oder die C / C ++ – und Arduino-Tutorials im Web überprüfen Hier werde ich Ihnen nur einige Hinweise mit Überlegungen geben, die Ihnen bei der Lösung der Aufgabenaufgabe helfen können. (Leider nat ist nicht wirklich klar, was genau die Aufgabe hier ist)
- Die
Serial
-Schnittstelle des Arduino (eine UART-Schnittstelle) sendet die Daten ein Bytes nacheinander und nacheinander (daher der Nameserial
). 1 Byte ist eine Reihe von 8 Bits, von denen jedes einen Wert von 1 oder 0 hat. Zusammen bilden die 8 Bits einen Wert, der auch als Dezimalwert von 0 bis 255 ausgedrückt werden kann. Beispiel:01001011
ist das binäre Äquivalent der Dezimalzahl 75. (Für weitere Erläuterungen googeln Sie das Binärzahlensystem) Die Byte-Daten können auch als Zeichen ausgedrückt werden, wie sie im ASCII-Standard definiert sind. Jeder Binärwert bezieht sich auf ein bestimmtes Zeichen. Dies geschieht im seriellen Monitor der Arduino IDE. (Für weitere Erklärungen google ASCII) - Da die Daten seriell gesendet werden, kann es zu Verzögerungen bei der Übertragung kommen, die für Menschen nicht erkennbar sind, aber der Arduino ist schnell genug, so dass die
Serial.available()
kann 0 zurückgeben, da in diesem Moment eine kleine Verzögerung bei der Übertragung aufgetreten ist. Daher ist es wichtig, die gesamte Nachricht zu erfassen, bevor Sie versuchen, damit zu arbeiten. Sie können dies tun, indem Sie entweder Bytes zählen (warten, bis mindestens 3 Bytes im Puffer verfügbar sind) oder indem Sie das Ende der Nachricht mit einem Sonderzeichen markieren (z. B. das Zeilenumbruchzeichen „\ n“). Es gibt viele Tutorials im Web, wie man beides macht. Sie können mit Majenkos Blog beginnen. - Sie können die Anzahl der empfangenen Bytes mit dem Rückgabewert
Serial.available()
. Es werden 3 zurückgegeben, wenn 3 lesbare Bytes im Puffer vorhanden sind. - Wenn Sie eine Variable innerhalb von wird weggeworfen, wenn die Funktion endet und neu definiert wird, wenn die Funktion erneut gestartet wird (In der Arduino-Welt wird die Funktion
void loop()
immer wieder für immer aufgerufen). Sie verlieren den gesamten Inhalt, der in diese Variable geschrieben wurde. Wenn Sie Daten über die Ausführung der Funktionvoid loop()
beibehalten möchten, können Sie die Variable außerhalb einer beliebigen Funktion an der definieren Diese Variable ist dann global und wird nur einmal zu Beginn des Programms definiert und gilt für die gesamte Lebensdauer des Programms. - Wie im Kommentar beschrieben, sollten Sie keinen Wert zurückgeben von einer
void
-Funktion, s incevoid
bedeutet meistens, dass es keinen Rückgabewert gibt. Wenn Sie von der Funktionvoid loop()
zurückkehren, wird diese Funktion nur neu gestartet (da wir uns in der Arduino-Welt befinden). - Sie können die . Es besteht keine Notwendigkeit dafür. Und wenn es nur mit der Verzögerung funktioniert, dann stimmt etwas anderes nicht und Sie arbeiten nur mit den Symptomen, stattdessen mit dem eigentlichen Problem.
Außerdem sollten Sie nicht versuchen, alles auf Ihrem aufzubauen das Rad besitzen und neu erfinden. Schauen Sie sich stattdessen die Beispiele an, die mit der Arduino IDE geliefert werden. Zum Beispiel das Beispiel SerialEvent
, das zeigt, wie eine serielle Nachricht empfangen wird (die durch ein Zeilenumbruchzeichen „\ n“ beendet wird). Schauen Sie sich auch die anderen verwandten Beispiele an. Wenn Sie verstehen, wie sie funktionieren, können Sie die Aufgabe problemlos ausführen.
Kommentare
- Hallo nochmal, ich denke ich ' Ich bin kurz davor, es zu bekommen, aber eine kurze Frage ist, wie man die serial.available () zurücksetzt. Wert und zurück auf 0 zurücksetzen?
- Sie können
Serial.read()
ausführen, ohne den zurückgegebenen Wert zu verwenden, bisSerial.available()
0 zurückgibt.
Antwort
Angenommen, die Skizze sollte „Hello World“ drucken, wenn das Eingabezeichen 3 Bit hoch ist. Hier sind einige verschiedene Varianten zum Zählen der Anzahl der in einem Byte gesetzten Bits.
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"); } } }