Was ist der Unterschied zwischen Serial.write und Serial.print? Und wann werden sie eingesetzt?

26

Was ist der Unterschied zwischen Serial.write und Serial.print? Und wann werden sie eingesetzt?
Beide wurden verwendet, um auf einem seriellen Monitor zu drucken. Worin bestehen die tatsächlichen Unterschiede?

shadab
quelle
Hervorragende Erklärung bpinhosilva! Sie haben mir geholfen, etwas zu verstehen, mit dem ich jetzt sehr deutlich zu kämpfen hatte.
Rory

Antworten:

19

Von der Arduino-Site für Serial.write und Serial.print :

Serial.write ()

Schreibt Binärdaten an die serielle Schnittstelle. Diese Daten werden als Byte oder eine Reihe von Bytes gesendet. Verwenden Sie stattdessen die Funktion print (), um die Zeichen zu senden, die die Ziffern einer Zahl darstellen.

Serial.print ()

Druckt Daten als lesbaren ASCII-Text an die serielle Schnittstelle.

LoganBlades
quelle
17

Serial.write ist bodenständiger, es ist einfach und schnell, es ist so aufgebaut, dass es byteweise binär spricht. Beispiel:

Serial.write(0x45);   // will write 0100 0101 to the cable

Serial.print hingegen ist vielseitiger und führt die Konvertierung von ASCII nach Binär aus. Es kann auch in BIN / HEX / OCT / DEC konvertiert werden. Sie müssen jedoch ein zweites Argument wie dieses angeben

Serial.print(76, BIN) gives "0100 1100"
Serial.print(76, OCT) gives "114"
Serial.print("L", DEC) gives "76"
Serial.print(76, HEX) gives "4C" 

Weitere Beispiele mit visueller serieller Ausgabe:

Code:

  Serial.write(0x48);   // H
  Serial.write(0x45);   // E
  Serial.write(0x4C);   // L
  Serial.write(0x4C);   // L
  Serial.write(0x4F);   // O

SERIELLER AUSGANG: Bildbeschreibung hier eingeben

Code:

  Serial.print("HELLO");

SERIELLER AUSGANG: Bildbeschreibung hier eingeben

Serial.println () hingegen fügt das Ende von Zeile 2 Bytes 0x0D und 0x0A hinzu, wie Sie im Frame sehen können

Code:

  Serial.println("HELLO");

SERIELLER AUSGANG:

Bildbeschreibung hier eingeben

Nassim
quelle
7

Serial.writeSendet Bytes an die serielle Schnittstelle, während Serial.printASCII-Zeichen gesendet werden, damit die Benutzer leicht lesen können.

Einige Geräte verwenden Bytes, um Konfigurationen festzulegen, verwenden normalerweise Datenpakete und Sie müssen die Schreibfunktion verwenden, um mit ihnen zu kommunizieren. Schließlich senden sie Bytes über die serielle Schnittstelle, und Sie können sie interpretieren, indem Sie jedes Byte durchgehen.

bpinhosilva
quelle
5

Alle obigen Beispiele sind korrekt, aber möglicherweise deutlicher. Alle Daten, die über die serielle Schnittstelle gesendet werden, werden als Einsen und Nullen gesendet. (offensichtlich ... ich hoffe) ... Der Unterschied zwischen den beiden Befehlen besteht darin, wie das, was gesendet wird, tatsächlich in diese Einsen und Nullen übersetzt / interpretiert wird. Das klarste Beispiel ist die Übertragung von Nummern.

Angenommen, Sie müssen die Nummer 217 senden. Die binäre Darstellung (1 und 0) dieser Nummer lautet 11011001. Mit dem Befehl Serial.write(217)wird buchstäblich nur 11011001 über die Leitung gesendet. Die Hex-Darstellung der gleichen Nummer lautet 0xD9, und der Befehl Serial.write(0xD9)sendet dasselbe ... 11011001.

Hier wird es interessant ... Wenn Sie den Befehl verwenden Serial.write("217")würden, würden Sie stattdessen Folgendes erhalten: 00110010 00110001 00110111 ... WAS?!?!?
Wenn eine Zeichenfolge als Argument übergeben wird, wird sie in einzelne Zeichen zerlegt, in ASCII konvertiert und dann als Byte für jedes Zeichen gesendet. Sie würden genau die gleiche Ausgabe erhalten, wenn Sie Folgendes verwenden würden:

Serial.write(50);
Serial.write(51);
Serial.write(55);

(00110010 00110001 00110111)

Nun schauen wir uns an Serial.print(). Die Befehle Serial.print(217)oder Serial.print("217")geben beide dasselbe aus: 00110010 00110001 00110111. Dies liegt daran, dass der Druckbefehl zuerst eine beliebige Zahl in eine Zeichenfolgendarstellung konvertiert und dann den Befehl verwendet Serial.write(), um jedes Zeichen als einzelne ASCII-Bits zu senden.

Obwohl dies keine vollständige Beschreibung ist, hoffe ich, dass es Ihnen hilft, in die richtige Richtung zu denken ...

Jerimiah
quelle
3

Eine weitere Möglichkeit, dies zu beantworten, besteht darin, anzugeben, dass Serial.write einzelne Zeichen akzeptiert, während Serial.print Zeichenfolgen akzeptiert. Es mag einige Unterschiede geben, aber dies ist der Hauptunterschied.

linhartr22
quelle