アフィリエイト広告
アフィリエイト広告

Arduino シリアル通信 Serial.print() を試してみる

前回の「Arduino シリアル通信を試してみる (文字列)」で、シリアルモニターから送られるデータは ASCII コードになっているらしいとわかったわけですが、じゃ Arduino からシリアルモニタへ出力するときはどうなってるのか、調べてみます。

Reference の Serial.print() を確認してみました。

Prints data to the serial port as human-readable ASCII text. This command can take many forms. Numbers are printed using an ASCII character for each digit. Floats are similarly printed as ASCII digits, defaulting to two decimal places. Bytes are sent as a single character. Characters and strings are sent as is.

データは ASCII コードで出力されます。数字も各桁ごとに ASCII コードになるようですね。浮動小数点数も同じですが、小数点以下 2桁になるとのこと。

バイト形式は一つの文字として送るということなので、この場合は数字のようにバラバラにはならないということでしょうか。あとで確認してみましょう。

文字と文字列は「そのまま」です。

では、実際に確認してみます。ちなみに Serial.println() はデータの末尾に改行コード (CR+LF) を付加する関数で、それ以外は Serial.print() と同じです。

文字列を送ってみます。

  1. Serial.println("hoge");

シリアルモニタには「hoge」とそのまま表示されます。内部的には ASCII コードで送るのでしょうが、文字形式は「そのまま」の文字として出力されるということです。

変数ではどうでしょうか。

  1.   char str[]="Hello world!";
  2.   Serial.println(str);

変数の場合も意図したように、そのまま「Hello world!」と表示されました。

数字形式で試してみます。

  1.   int num=65;
  2.   Serial.println(num);

シリアルモニタには「65」と表示されました。この場合は「65」が文字列としてそのまま送信されたということなのでしょう。

浮動小数点数を送ってみましょう。

  1.   float num=12.345678;
  2.   Serial.println(num);

「12.34」と小数点以下 2桁になって表示されました。

数字では表示フォーマットを指定できます。

  1.   int num=65;
  2.   Serial.println(num, BIN);

この場合は「1000001」と 2進数形式で表示されます。あくまでも文字列として扱っているのですから、BIN を指定した場合は改行コードを含んで 9 バイト送信しているということになるのでしょうか。

なお、浮動小数点数の場合はフォーマットで小数点以下の桁数を指定できるようです。

バイト形式を試してみましょう。バイト形式はひとつの文字として送るということでした。

  1.   byte b=B01000001;
  2.   Serial.println(b);

「65」と表示されました。B01000001 は 10 進数の「65」を表していますので、文字列「65」を送信したってことですね。

では、これはどうでしょうか。

  1.   byte b='A';
  2.   Serial.println(b);

文字「A」をバイト形式にして送信すると、シリアルモニタには「65」と表示されました。「A」の ASCII コードの値「65」が送信されたということですね。

フォーマットを指定してみます。

  1.   byte b='A';
  2.   Serial.println(b, BIN);

今度は「1000001」と表示されました。「65」が 2進数形式で送信されたということです。

さてと、こうしてみてくるとなんだか様子がわかってきました。Serial.print() 、Serial.println() では、

  1. 文字も数字も改行コードもすべて ASCII コードにして送信する。シリアルモニタ側では、受け取った ASCII コードに該当する文字を表示する。
  2. 文字形式はそのまま送信する。数字は桁ごとの文字列として送信する。
  3. バイト形式はひとつの値として扱い、その値を文字列として送信する。

ってことです。わかってしまえば当たり前のことですけど、どうやら俺は、数字と ASCII コードを混同してわけわからなくなってしまうようです。

次はもう一度、シリアルモニタから Arduino へ送る場合を試してみたいと思います。

タイトルとURLをコピーしました