【prog】Arduino・シリアルで文字列受信するには
閉じる
閉じる

新しい記事を投稿しました。シェアして読者に伝えましょう

×

【prog】Arduino・シリアルで文字列受信するには

2017-01-23 13:48
    とてもアレ臭いタイトルになってしまいましたが、「自分用メモ」であり「過去全く知る機会のなかった自分のような他人へのメモ」であり、多くの人に気づいていただきたいなあと。



     引っ張るのも嫌なので、先に結論を書きます。
     Serial.read()でもSerial.readString()でもなく、
     Serial.readStringUntil(char)を使え!

     です。実にアレな表現だ… 解決策が知りたい方は関数名でググってくださいな。そのほうが早い。では、以下経緯。



     Arduinoでのシリアル通信で、文字列受信に悩んでいる方が多い。いや自分も。
     Serial.read()で飛んで来るのがcharで、"string"との比較が出来ない辺りもつらい。や、Cの頃からそうだからそうなんだけどさあ

     悩むんでググると「文字列を受信する方法」がチョロチョロ出てくるのでやっぱり多くの人の難題なのらしい。
     そこでの解決法が「read()で一文字ずつ取ってきてchar配列に付け足し、終端文字で締める」
     これしかないのかあ…

     で、偶然リファレンスに当たってreadString関数を見つけることになる。なんだ、あるじゃんか。
     早速使ってみると、処理が遅い!!
     あんまり遅いんで測ってみると1001ミリ秒。おっそ…というか、何回やっても定常的に1000ミリ秒かかってる。それはあまりにも綺麗過ぎる。

     んで見返してみる。
     リファレンス(の和訳)にはこう書かれている。(※引用させていただいております)
    シリアルバッファから文字を読み、文字列に書き込む。この関数はタイムアウトすれば終了する。
     あ、これ1000ミリ秒でタイムアウトしてんだ



     readString関数のすぐ横には「readStringUntil()」がある。終端文字を指定し、終端文字が来るかタイムアウトで終了する。
     シリアルモニタからテストしていたので、「';'」を終端文字にして

    if (Serial.available() > 0)
    {
    String str = Serial.readStringUntil(';');
    }

     こんな感じで。
     前後を挟んで計測してみたら1ミリ秒(実際はそれ以下)でした。あとは終端文字を\0とか、他に影響のない文字に変えればこの速度なら実用的ですね



     という訳で
    • readばかりに頼らずreadStringUntilも使おう
    • 一箇所のリファレンスに頼らずあちこち見よう(日本語リファレンスでは抜け出せませんでした)
     という辺りでまとめさせていただきます。

    広告
    コメントを書く
    コメントをするには、
    ログインして下さい。