3

現在、毎秒数行を出力する Arduino チップに GPS を接続しています。特定の行から特定の情報を抽出したい。

$ÇÐÇÇÁ,175341.458,3355.7870,Ó,01852.4251,Å,1,03,5.5,-32.8,Í,32.8,Í,,0000*57

(登場人物に注意)

この行を に読み込んだ場合、char[]そこから抽出することは可能ですか? (もちろんそうですが、どうやって?)3355.787001852.4251

コンマを数えてから、コンマ2の後に数字をまとめ始め、コンマ3で停止し、2番目の数字に対して同じことをする必要がありますか、それとも別の方法がありますか? 配列を分割する方法は?

これに関するもう 1 つの問題は、この行の先頭に奇妙な文字があるため、この行を特定することです。正常ではなく、奇妙な動作をするため、どうすればチェックできますか?

必要なデータは常に形式がxxxx.xxxxありyyyyy.yyyy、その形式が一意です。つまり、データがどの行にあるかを気にせずにすべてのデータを検索して、そのデータを抽出することができます。ほぼプレグマッチのようですが、 でそれを行う方法がわかりませんchar[]

ヒントやアイデアはありますか?

4

2 に答える 2

2

strtokを使用してカンマの文字列をトークン化 (分割) し、sscanfを使用して数値を解析できます。

編集:Cの例:

void main() {
    char * input = "$ÇÐÇÇÁ,175341.458,3355.7870,Ó,01852.4251,Å,1,03,5.5,-32.8,Í,32.8,Í,,0000*57";

    char * garbage = strtok(input, ",");
    char * firstNumber = strtok(NULL, ",");
    char * secondNumber = strtok(NULL, ",");
    double firstDouble;
    sscanf(firstNumber, "%lf", &firstDouble);
    printf("%f\n", firstDouble);
}
于 2012-08-07T12:47:09.060 に答える
0

文字列の先頭に奇妙な文字がある場合は、末尾から解析を開始する必要があります。

char* input = get_input_from_gps();
// lets assume you dont need any error checking
int comma_pos = input.strrchr(',');
char* token_to_the_right = input + comma_pos;
input[comma_pos] = '\0';
// next strrchr will check from the end of the part to the left of extracted token
// next token will be delimited by \0, so you can safely run sscanf on it 
// to extract actual number
于 2012-08-07T13:10:56.050 に答える