3

作成しているプログラムにATコマンドを使用していますが、sscanf()関数を使用してそれらを解析するのに問題があります。

たとえば、次のコマンドを実行すると、次のようになります。

"AT\r\r\nOK\r\n"

*最初の呼び出しで、「AT」部分のみを取得し、次の「\ r」文字を破棄して、その時点までに読み取られた文字数を確認します。* 2回目の呼び出しでは、「OK」の部分のみを取得し、「OK」文字列の前後にある「\ r \ n」文字を破棄して、その時点までに読み取られた文字数を確認します。

次のsscanf関数呼び出しを作成しました。

index = 0;
sscanf(buffer + index, "%*[\r\n]%[^\r]\r%*[\n]%n", new_buffer, &count);
index += count;

要求した文字列が返されないのはなぜですか?私は何が間違っているのですか?

よろしくお願いします。

4

2 に答える 2

1

おそらく問題はsscanf、キャリッジリターンや改行などの空白文字とあなたの期待をどのように扱うかです。先行する空白を無視sscanf(スキップ)する必要があります。

もう1つの問題は、キャリッジリターンがバッファに到達しないことです。C実装は、入力時にマップ\r\nする必要があり\nます(テキストストリームの場合)。

于 2012-12-05T15:23:59.843 に答える
0

フォーマットを分析してみましょう:

sscanf(buffer + index, "%*[\r\n]%[^\r]\r%*[\n]%n", new_buffer, &count);

'\r'まず、または'\n'文字の最初のシーケンスがスキップされます( %*[\r\n])。次に、次の文字まで'\r'スキャンしてnew_buffer%[^\r])に格納します。

次に、後続のすべての空白文字がスキップされます(\r)。のまでの部分'O'"OK"現在消費されています。

次に、次の改行までのすべての文字が無視されます(%*[^\n])。これで、最後の改行だけが消費されなくなります。次に、消費された文字の数がに格納されcountます。

問題は、フォーマット文字列(もちろん文字セットの外)の空白が、その場所に表示される空白文字のシーケンス全体(おそらく空)を消費することです。\rフォーマット文字列のは、「1文字'\r'」を意味するのではなく、「ここにすべての空白」を意味します。

任意の文字をスキャン(および無視)することで(フォーマットが固​​定されている場合)修正できます('\r'入力が本当に期待どおりである場合は、これが保証されます)。

sscanf(buffer + index, "%*[\r\n]%[^\r]%*c%*[\n]%n", new_buffer, &count);
于 2012-12-05T15:56:27.250 に答える