2018年5月27日日曜日

Arduinoのシリアル通信で、カンマ区切りの文字列を読ませる

突然ですが、今回はArduinoのシリアル通信でカンマ区切りの文字列を扱う話です。

パラメータの送信とかで使いたくなるカンマ区切りのデータですが、意外とお手軽に実装できたので紹介したいと思います。





1.解読の流れ
解読の流れとしてはこんな感じ
①シリアル入力をバッファに突っ込む
②strtok関数でトークンに分解して、各変数に読み込む
③atoi関数で数値に変換


2.実装
int angle = 0, mot_sta = 0, power = 0, i = 0;
char buff[30];

void setup() {
  Serial.begin(9600);
}

void loop() {
  if (Serial.available() > 0) {
    buff[i] = Serial.read();
    if (buff[i] == 'e') {
      buff[i] == '\0';
      angle = atoi(strtok(buff, ","));
      mot_sta = atoi(strtok(NULL, ","));
      power = atoi(strtok(NULL, ","));

      Serial.println(angle);
      Serial.println(mot_sta);
      Serial.println(power);
      i = 0;
    } else {
      i += 1;
    }
  }
}

今回のプログラムはangle、mot_sta、powerの3つの変数に値を代入するモノです。
Arduino側に送られてくるフォーマットはこんな感じ

10,20,30,e

末尾の"e"はデータの終端を表す信号で、こいつが出るまでバッファに送られてきたデータを書き出します。
そのあと、strtok関数でバッファの中身を解読します。この関数は一回文字列に対して実行するごとに1つずつトークン(のポインタ)を返します。また2回目以降は対象の文字列を"NULL"にしてあげる必要があります。
それと並行してトークン(のポインタ)をatoi関数に入れることでint型の数値が得られます。atofを使えばfloat型として数値が得られるようです。



今回はここを参考にしました。
http://www9.plala.or.jp/sgwr-t/lib/strtok.html


©2018 shts All Right Reserved.

0 件のコメント:

コメントを投稿