14

Arduino (C 言語) 区切り記号付きの文字列を解析 (シリアル インターフェイス経由で入力)

ここで答えが見つかりませんでした:/

シリアル インターフェイス (Serial.read()) を介して、コンマで区切られた 3 つの数字の単純な文字列を arduino に送信したいと考えています。これらの 3 つの数値の範囲は 0 ~ 255 です。

例えば。 255,255,255 0,0,0 1,20,100 90,200,3

私がする必要があるのは、arduino に送信されたこの文字列を 3 つの整数 (r、g、b としましょう) に解析することです。

したがって、100,50,30 を送信すると、arduino はそれを次のように変換します。

int r = 100
int g = 50
int b = 30

たくさんのコードを試しましたが、どれもうまくいきませんでした。主な問題は、文字列 (一連の文字) を整数に変換することです。おそらく区切り文字の目的で strtok_r があると思いましたが、それだけです。

提案をありがとう:)

4

9 に答える 9

27

あなたが実際に尋ねた質問に答えるために、String オブジェクトは非常に強力であり、まさにあなたが求めていることを行うことができます。構文解析規則を入力から直接制限すると、コードの柔軟性と再利用性が低下し、やや複雑になります。

文字列には indexOf() と呼ばれるメソッドがあり、特定の文字の文字列の文字配列内のインデックスを検索できます。文字が見つからない場合、メソッドは -1 を返す必要があります。関数呼び出しに 2 番目のパラメーターを追加して、検索の開始点を示すことができます。あなたの場合、区切り文字はコンマであるため、次のように呼び出します。

int commaIndex = myString.indexOf(',');
//  Search for the next comma just after the first
int secondCommaIndex = myString.indexOf(',', commaIndex + 1);

次に、そのインデックスを使用して、String クラスの substring() メソッドを使用して部分文字列を作成できます。これは、特定の開始インデックスで始まり、2 番目のインデックス (指定されていない場合はファイルの終わり) の直前で終わる新しい文字列を返します。したがって、次のようなものを入力します。

String firstValue = myString.substring(0, commaIndex);
String secondValue = myString.substring(commaIndex + 1, secondCommaIndex);
String thirdValue = myString.substring(secondCommaIndex + 1); // To the end of the string

最後に、String クラスの文書化されていないメソッド toInt() を使用して整数値を取得できます。

int r = firstValue.toInt();
int g = secondValue.toInt();
int b = thirdValue.toInt();

String オブジェクトとそのさまざまなメソッドの詳細については、Arduino のドキュメントを参照してください。

于 2013-01-13T18:57:10.737 に答える
11

使用しsscanfます。

const char *str = "1,20,100"; // assume this string is result read from serial
int r, g, b;

if (sscanf(str, "%d,%d,%d", &r, &g, &b) == 3) {
    // do something with r, g, b
}

文字列のストリームを解析する場合は、ここで私のコードを使用してください ex:255,255,255 0,0,0 1,20,100 90,200,3コンマ区切り文字列の解析関数

于 2016-02-03T04:41:27.120 に答える
1

データを読み込むために、次のようなことをしたいと思います。

String serialDataIn;
String data[3];
int counter;


int inbyte;

void setup(){
  Serial.begin(9600);
  counter = 0;
  serialDataIn = String("");
}

void loop()
{
    if(serial.available){
        inbyte = Serial.read();
        if(inbyte >= '0' & inbyte <= '9')
            serialDataIn += inbyte;
        if (inbyte == ','){  // Handle delimiter
            data[counter] = String(serialDataIn);
            serialDataIn = String("");
            counter = counter + 1;
        }
        if(inbyte ==  '\r'){  // end of line
                handle end of line a do something with data
        }        
    }
}

次に、atoi()を使用してデータを整数に変換し、それらを使用します。

于 2012-06-17T06:35:07.747 に答える
-3
    String myString = "dfsdfgsafhffgsdvbsdvdsvsdvsdsdfdfsdsff|date|recipt|weight|time|date|";

    // the setup routine runs once when you press reset:
    void setup() {                
        Serial.begin(9600); 
    }


// the loop routine runs over and over again forever:
void loop() {
 int Index1 = myString.indexOf('|');
int Index2 = myString.indexOf('|', Index1+1);
int Index3 = myString.indexOf('|', Index2+1);
int Index4 = myString.indexOf('|', Index3+1);
int Index5 = myString.indexOf('|', Index4+1);
int Index6 = myString.indexOf('|', Index5+1);
String secondValue = myString.substring(Index1+1, Index2);
String thirdValue = myString.substring(Index2+1, Index3);  
String fourthValue = myString.substring(Index3+1, Index4); 
String fifthValue = myString.substring(Index4+1, Index5); 
String firstValue = myString.substring(Index5+1, Index6); 
//Serial.println(Index1);
//
Serial.println(secondValue);
Serial.println(thirdValue);
Serial.println(fourthValue);
Serial.println(fifthValue);
Serial.println(firstValue);
delay(14000);
    }
于 2016-05-19T06:09:13.700 に答える
-3

@cstrutton - 'indexOf' の使用に関する優れた提案。プロジェクトの時間を大幅に節約できました。1つの小さなポインタですが、

3 番目の値が表示されないことに気付きました (ゼロとして戻ってきていました)。少し遊んで、http://arduino.cc/en/Tutorial/StringIndexOfのドキュメントを 調べてみると、最後の値に lastIndexOf を使用できることに気付きました。

以下は、正しい 3 番目の値を提供する 2 行の変更です。

int lastCommaIndex = myString.lastIndexOf(',');

String thirdValue = myString.substring(lastCommaIndex+1); // To the end of the string
于 2013-04-02T03:27:51.930 に答える