Arduinoのシリアル通信で文字の入出力:まずは一文字ずつ
Arduinoのシリアル通信を使ってPCとArduino間で文字のやり取りをしてみます。Arduinoのシリアル通信は通常1byteでしか処理できませんので、今回は一文字分の英数字を単純にシリアル通信でやり取りしてみます。
以下のスケッチはPCからシリアルモニタを使って文字を送信し、ArduinoからはそのままPCに文字を送り返すものです。
スケッチ例
void setup(){
Serial.begin(9600); // シリアルポートを9600 bpsで初期化
}
void loop(){
int in;
in = Serial.read(); //バッファから一文字を読み取ります。バッファに何もない場合には「-1」が返されます。
if(in != -1 ){ //もじバッファに文字があるなら(「-1」でないなら)
Serial.write(in); //シリアルに書き込みます。
}
}
スケッチを書き込んだ後、「ツール>シリアルモニタ」でシリアルモニタを開き、文字列を入力してから「送信」をクリックもしくは「Enter」キーを押します。シリアル通信で文字がArduinoに送られます。
例えば「abc」と入力すると、Arduinoのバッファに「abc」が入ります。バッファは128byteありますが処理するのは一文字ずつです。まず「Serial.read()」で「a」が読まれてバッファから「a」が無くなります。文字「a」は変数inに入り、「Serial.write(in)」でシリアルに書き込みます。これでシリアルモニタに「a」が表示されます。同様に「b」「c」と処理され、バッファが空になります。バッファに何も入っていない状態になると「Serial.read()」に「-1」が返され、何もしません。結果としてシリアルモニタには「abc」と表示されます。
一文字分だとこんな感じですが、「文字列」になると大変です。バッファが溢れたり、バッファの途中だったりします。
いずれは文字列の処理も考えたいと思います。通常は文字列の終わり「\n」や「\0」等を定義しておいて処理するのが一般的なようです。
BlocklyDuino Editorで書いてみる
参考までに上記スケッチをBlocklyDuino Editorで書いてみました。
シリアル書き出し時に文字に変換しないと、整数のコードが表示されてしまいます。書き出されるスケッチは以下のようになりました。
int in;
void setup()
{
Serial.begin(9600);
}
void loop()
{
in = Serial.read();
if (in != -1) {
Serial.print((char) in);
}
}
次は「改行」が反映されるに工夫したいと思います。