「Arduino シリアル通信 Serial.print() を試してみる」で、Arduino からシリアルモニタへデータを送るときはすべて文字列として扱っていることがわかりました。文字は ASCII コードとしてシリアルポートへ送られ、シリアルモニタ側では受け取った ASCII コードに対応した文字を表示しています。
では、シリアルモニタから Arduino へ送信する場合はどうでしょうか。簡単なスケッチで試してみます。
-
void setup() {
-
Serial.begin(9600);
-
}
-
void loop() {
-
if(Serial.available() > 0) {
-
int data = Serial.read();
-
Serial.println(data, DEC);
-
}
-
}
シリアルモニタから「A」と送信すると、
65 10
と表示されました。
シリアルモニタ側で「A」と入力すると、文字「A」の ASCII コード (65) がシリアルポートへ送られるはずです。
Arduino 側では、Serial.read() で読み取ったデータを数値変数 data に代入し、Serial.println() で 10 進数のフォーマットで出力しています。そこで表示されたのが「65」ということは、Serial.read() がシリアルポートから送られてきた ASCII コードそのものを読み取っている、ということです。
次に表示されている「10」は、シリアルモニタから送信されるときに付加された改行コード LF のASCII コードです。シリアルモニタでは、入力されたデータは「送信」ボタンを押したときに改行コードを付加してまとめて送出されています。
ということはですよ、入力した文字をそのまま表示させるには、読み取った ASCII コードを文字に変換すればいいんじゃないですか?
-
char data = Serial.read();
-
Serial.println(data);
スケッチの一部を上のように書き換えます。シリアルモニタで「A」と入力すると、
A
と出力されました。ASCII コード (65) を文字変数 data に代入すると、その中身は文字「A」となりますね。そーゆーことです (^_^;)
ところで、「ABC」と入力するとどうなりますか?
A B C
となってしまいます。スケッチをちょっと工夫しましょう。
-
void loop() {
-
if(Serial.available() > 0) {
-
char data = Serial.read();
-
if(10 == data) {
-
data = '¥n';
-
}
-
Serial.print(data);
-
}
-
}
末尾に改行コード LF がついてくるのですから、LF のときだけ改行するようにしました。これで出力は、
ABC
となりました。
- Arduino → シリアルモニタでは、データは文字列としてそのまま送信される。
- シリアルモニタ → Arduino では、データは文字列として送られ、Serial.read() は文字の ASCII コードを読み取る。
これでシリアル通信の状況がわかりました。わかってしまえば、まぁなんてことないですよねぇ (^_^;) たぶん、ね。