読者です 読者をやめる 読者になる 読者になる

がりらぼ

WindowsRuntimeの応援ブログ

Arduinoのシリアル通信で文字列情報の送信を考える

Arduinoのシリアル通信は基本的に1byteごとにしかポートに来ている情報を読むことができません。

だから、シリアル通信で文字列を渡そうと思ったらなかなか大変です。

そこでシリアル送信側で文字列の最後に終端記号「\0」を送信してもらって、そこまでを読み取るようにします。

WindowsRuntimeの場合このような送信コードで文字列の最後に終端文字を送信します。

private async Task SendDataAsync(string data)
{
    foreach (char c in data.ToCharArray())
    {
        _dataWriter.WriteByte((byte)c);
    }

    _dataWriter.WriteByte((byte)'\0');

    await _dataWriter.StoreAsync();
}

Arduino側では\0を読み込むまではバッファに文字を加えていって、\0を読み込んだら文字列を受け取ったとして処理することとします。

char buff[BUFF_MAX];
int counter = 0;

void loop(){

    if (Serial.available()>0){

        char data = Serial.read();
        buff[counter] = data;

        if (data == '\0'){

            //buff[0]~buff[counter-1]までが文字列となってここでうけとれる
            //シリアル送信側で終端文字\0が最後につけられることが前提
            Serial.write(buff);

            counter = 0;
        }
        else{
            counter++;
        }


    }

}

あとはArduinoはインクルードしなくてもstdlibなどが使えるのでstrtokとかatoiとかで文字列情報を加工すれば多くの情報をシリアルで流すことができます。