受信した文字列を分割するにはどうすればよいですか?
サーボの位置のリストをシリアル接続でarduinoに以下のフォーマットで送信しています。
1:90&2:80&3:180
というようにパースされることになります。
サーボ ID : 位置 & サーボ ID : 位置 & サーボ ID : 位置`。
これらの値をどのように分割し、整数に変換すればよいのでしょうか?
52
12
サーボの位置のリストをシリアル接続でarduinoに以下のフォーマットで送信しています。
1:90&2:80&3:180
というようにパースされることになります。
サーボ ID : 位置 & サーボ ID : 位置 & サーボ ID : 位置`。
これらの値をどのように分割し、整数に変換すればよいのでしょうか?
他の回答とは逆に、私は以下の理由で
String
を使用しないようにします。Arduinoのような組み込み環境では(SRAMに余裕のあるMegaでも)、むしろ標準C関数を使いたいところです。
strtok()
: C 言語文字列を区切り文字に基づいて部分文字列に分割する。atoi()
: C の文字列をint
に変換する。そうすると、次のようなコードサンプルになります。
この利点は、動的なメモリ割り当てが行われないことです。コマンドを読み込んで実行する関数の内部で、
input
をローカル変数として宣言することもできます。この関数を使用して、分離文字を基にして文字列を分割できます。
文字列をintに変換します。
このコードのチャンクは文字列を取り、特定の文字に基づいてそれを分離して返します。 分離文字間のアイテム。
のようにすることもできますが、いくつかの点に注意してください。
もし
readStringUntil()
を使用した場合、文字を受け取るまで、またはタイムアウトするまで待機することになります。したがって、現在の文字列では、最後の位置は待つ必要があるため、少し長くなります。このタイムアウトを回避するために、末尾に&
を追加することができます。この動作はモニターで簡単に確認できます。&
を追加した場合と追加しない場合で文字列を送信してみると、タイムアウトの遅延が確認できます。サーボインデックスがなくても、文字列を送信し、その文字列の値の位置でサーボインデックスを取得することができます。
90&80&180&
.サーボのインデックスを使用する場合は、それをチェックする(int
に変換し、ループのインデックス i と一致させる)ことで、メッセージに何も問題がないことを確認することができるかもしれません。readStringUntil`` からの戻り文字列が空でないことを確認する必要があります。もし関数がタイムアウトした場合は、十分なデータを受信していないことになります。
各パートに異なるターミネータを渡す
Stream.readStringUntil(terminator)
を使うことができます。各パートで、次に
String.toInt
を呼び出します。最も簡単な解決策は、scanf()を使用することです。
これにより、次の出力が得られます。
乾杯。!
例:を参照してください。 https://github.com/BenTommyE/Arduino_getStringPartByNr。
PIN番号のAttiny85回路図。 。![ここに画像の説明を入力してください](https://i.stack.imgur.com/IxwmX.png。)。
スケッチコンパイル:
したがって、残りのコードには十分なスペースとメモリがあります。
それはあなたの質問への答えではありませんが、それは誰かに役立つかもしれません。 文字列に特定の接頭辞がある場合は、単に「startsWith」と「substring」を使用できます。 例えば。
次に、「高さ10」を送信します。
"文字列をサブストリングに分割する方法?"は、現在の質問の複製として宣言されています。
このソリューションの目的は、 SDカードファイルにログインした一連の GPS ポジションを解析することです。 「シリアル」から文字列を受信する代わりに、文字列はファイルから読み取られます。
関数は、
StringSplit()
parse a StringsLine = "1.12345,4.56789、hello"
to 3 StringssParams [0] = "1.12345"
、sParams [1] = "4.56789"
`
'sParams [llo
`
` '.1。
文字列sInput
:解析される入力行。 2。char cDelim
:パラメーター間の区切り文字。 3。string sParams []
:パラメータの出力配列。 4。int iMaxParams
:パラメータの最大数。 5。 出力「int」:解析されたパラメーターの数。この関数は、
String :: indexOf()
およびString :: substring()
:に基づいています。そして、使用法は本当に簡単です: