回答:
Serial.writeおよびSerial.printの Arduinoサイトから:
Serial.write()
バイナリデータをシリアルポートに書き込みます。このデータは、1バイトまたは一連のバイトとして送信されます。数字の桁を表す文字を送信するには、代わりにprint()関数を使用します。
Serial.print()
データを人間が読めるASCIIテキストとしてシリアルポートに出力します。
Serial.writeはより現実的なものであり、シンプルで高速であり、一度に1バイトずつバイナリを話すように作られています。例:
Serial.write(0x45); // will write 0100 0101 to the cable
一方、Serial.printはより用途が広く、ASCIIからバイナリへの変換を行います。BIN/ HEX / OCT / DECに変換することもできますが、2番目の引数を指定する必要があります
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"
視覚的なシリアル出力を使用したその他の例:
コード:
Serial.write(0x48); // H
Serial.write(0x45); // E
Serial.write(0x4C); // L
Serial.write(0x4C); // L
Serial.write(0x4F); // O
コード:
Serial.print("HELLO");
一方、Serial.println()は、フレームに表示されているように行末2バイト0x0Dおよび0x0Aを追加します
コード:
Serial.println("HELLO");
シリアル出力:
上記の例はすべて正しいですが、より明確な場合があります。...シリアルポートを介して送信されるすべてのデータは、1と0として送信されます。(明らかです...願っています)... 2つのコマンドの違いは、送信されるものが実際にこれらの1と0に/から翻訳される/解釈される方法です。最も明確な例には、番号の送信が含まれます。
番号217を送信する必要があるとしましょう。この番号のバイナリ(1と0)表現は11011001 Serial.write(217)
です。コマンドを使用すると、文字通り11011001を行に送信します。同じ番号の16進表現は0xD9であり、コマンドSerial.write(0xD9)
は同じものを送信します... 11011001。
ここが面白いところです...コマンドを使用する場合、Serial.write("217")
代わりにこれを取得します:00110010 00110001 00110111 ...何?!?!?
文字列が引数として渡されると、個々の文字に分解され、ASCIIに変換されてから、各文字のバイトとして送信されます。以下を使用する場合、まったく同じ出力が得られます。
Serial.write(50);
Serial.write(51);
Serial.write(55);
(00110010 00110001 00110111)
を見てみましょうSerial.print()
。コマンドは、Serial.print(217)
またはSerial.print("217")
両方同じものを出力します:00110010 00110001 00110111. printコマンドは、最初の文字列表現に任意の数を変換してから、コマンドを使用していますので、これはSerial.write()
、個々のASCIIビットとして各文字を送信します。
これは完全な説明ではありませんが、正しい方向に考えさせるのに役立つと思います...
これに答えるさらに別の方法は、Serial.printが文字列を受け入れる場合に、Serial.writeが単一文字を受け入れることを述べることです。いくつかの違いがありますが、これが主な違いです。