Arduino側で受け取ったカンマ区切りデータを分解する方法を備忘録として纏めておきます。
c言語、javaやProcessingなどの解説サイトでカンマ区切りデータの処理方法はよく見かけるのですが、Arduino側スケッチではあまり紹介されているサイトが少なく、実現するのに手間取りました。今回は実施した2通りの方法を紹介したいと思います。
1つはstrtok()関数を使用した方法。これがまっとうなやり方かと思います。もう一つは2次元配列を使用して処理する方法です。
strtok()関数でカンマ区切りデータを分ける
▼Arduinoスケッチ(strtok()関数使用)▼
int i = 0; char buf[20]; int ch[5]; void setup() { Serial.begin(9600); } void loop() { if (Serial.available()) { buf[i] = Serial.read(); if (buf[i] == 'e') { buf[i] = '\0'; //Serial.println(buf); ch[0] = atoi(strtok(buf, ",")); ch[1] = atoi(strtok(NULL, ",")); ch[2] = atoi(strtok(NULL, ",")); Serial.println(ch[0]); Serial.println(ch[1]); Serial.println(ch[2]); i = 0; } else { i++; } } }
シリアルモニタを使用して動作確認してます。PC側からカンマ区切りデータを送信。文字列最後を認識するため、送信する文字列には最後に ’e’ を付けてます。
受信した文字列を Serial.read()でいったん文字配列 buf [ ] へ格納。 ‘ e ‘ を受信したら、終端文字 ‘ \0 ‘ に書き換えてます。このあたりは受信するデータのルールを決めて適宜変更すればいいかと思います。
文字配列 buf [ ] を strtok()でカンマ区切りにわけつつ atoi()で数値に変換。最後に Serial.println で分けられた数値を表示してます。このスケッチは数値(数字)の受信を前提としてます。
2次元配列を使用してカンマ区切りデータを分ける
この方法は苦肉の策です。最初 strtok()関数での出力がうまくいかず、別の方法でできないかと考えたスケッチです。
▼Arduinoスケッチ(2次元配列を使用)▼
char ch[4][10]; void setup() { Serial.begin(9600); } void loop() { int j = 0; int k = 0; if (Serial.available()) { for (int i = 0; i < 20; i++) { ch[j][k] = Serial.read(); if (ch[j][k] == ',') { ch[j][k] = '\0'; j++; k = 0; } else { k++; } } Serial.println(ch[0]); Serial.println(ch[1]); Serial.println(ch[2]); } }
こちらもシリアルモニタを使用して動作を確認してます。PC側からカンマ区切りデータを送信、受信したデータを順次、2次元配列へ格納していき ‘ , ‘ (カンマ)を受信したら終端文字 ‘ \0 ‘ へ変更し、配列を一段下げるイメージです。この方法だと送信文字列の最後にも ‘ , ‘ (カンマ)が必要になります。
2次元配列のスケッチで動作確認した結果です。strtok()関数を使用したスケッチで動作確認する場合、送信する文字列は数値(数字)で確認して下さい。
送信欄にカンマ区切り文字列を入力して送信ボタンをクリック。
カンマ区切りで分けられた文字列が表示されます。
Arduinoを使用した通信で少し効率の良い制御ができるようになると思います。
コメント