Verschieben der Daten von Arduino-internen buffer der seriellen Schnittstelle in den Speicher
Den ersten Abschnitt diese tutorial erklärt, wie man Lesen von der seriellen Schnittstelle des Arduino, wenn Sie wissen, wie viele Zeichen, die Sie erhalten.
Den code so etwas wie dieses:
byte buffer = 0;
void setup() {
Serial.begin(9600); //opens serial port, sets data rate to 9600 bps
}
void loop(){
if (Serial.available() >= 8) { //wait for the internal serial buffer to have all 8 characters in it
for (int i=0; i<8; i++) {
buffer[i] = Serial.read(); //move from internal buffer into memory
}
}
Den Teil, den ich nicht verstehe, ist die Zeile unten dargestellt ist:
for (int i=0; i<8; i++) {
buffer[i] = Serial.read();
Wird diese nicht nur speichern das erste bit aus dem internen buffer der seriellen Schnittstelle in alle 8 bit meiner Variablen "buffer"? Sollte nicht der code so etwas wie dieses?
for (int i=0; i<8; i++) {
buffer[i] = Serial.read()[i];
Du musst angemeldet sein, um einen Kommentar abzugeben.
Den buffer der seriellen Schnittstelle eine queue (google: Stapel-vs-queue). Die bytes in der Warteschlange behandelt werden, in der Reihenfolge, wie Sie empfangen wurden.
Serial.read() wird das erste byte aus der Warteschlange, liest es und löscht es. Das nächste mal Seriell.Lesen heißt das nächste byte in der Warteschlange verfügbar ist.
Übrigens, dass ist der Grund, warum es ist eine Serielle.peek-Befehl. Es liest das nächste byte in der Warteschlange, aber nicht löschen. Sie können diese verwenden, um überprüfen Sie die Warteschlange für etwas, ohne das Spülen
UART-Kommunikation ist byte-orientiert. Sie beschäftigen Sie sich nie mit einzelnen bits, dass das, was die UART-hardware ist für.
Nicht So, dass er richtig zu bewegen, das ganze byte.
Es ist ein Fehler im code, es wird nicht kompiliert. Die
buffer
sollten Sie die variable ein array:Und Nein,
buffer[0] = Serial.read();
nicht irgendwie schmieren ein einzelnes bit in Ihre 8 bit sind es nur Kopien ein 8-bit-Wert, werden alle 8 bits von einem Ort zum anderen. Die array-Indizierung Betreiber nie tut, bit-Zugriff auf das C nicht wie das funktioniert.Prüfungen und loops mit 8 da es sich erhalten will, eine einzelne 8-byte-Nachricht, es ist nicht 8, wie in "8 bit".
byte
(ein Arduino und so C++ - Konstrukt) bietet tatsächlich auf bit-Ebene Zugang mit[]
, aber ich denke nicht so. Jedenfalls, die Absicht der code, den Sie verlinkt, ist zu Lesen, 8 bytes über die serielle Schnittstelle in einen Speicher-Puffer. Es gibt keine Notwendigkeit, denken über die einzelnen bits.Serial.read()
ist das gleiche auf jeder iteration der Schleife. So alle 8 Elemente sind, wird derselbe Wert zugeordnet. bei der ersten iteration der Schleife, diebuffer[0] = Serial.read()
, und auf dem zweitenbuffer[1] = Serial.read()
.Serial.read()
ist die gleiche in beiden Fällen. Ist es nicht? Was macht es zu ändern?buffer[i]
zugeordnet (mitSerial.read()
. Alsserial.read()
nicht ändern, dann werden alle 8 Elementebuffer[i]
wird derselbe Wert zugeordnetbyte x = 42;
, das macht fast genau das gleiche außer mit dem Konstanten Wert42
anstatt die ausgelesenen Daten von der UART (Serial.read()
).