-1

次のようなデバイス (SIM900) からの応答を解析する必要があります。

\r\n+CIPRXGET:1

+CIPRXGET: 2,1,3
DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER
OK

そのため、sscanf を 2 回使用します。1 回目は最終文字列「OK」を削除し、2 回目はデータを解析します。

char buffer[256] = sim900.getResponse();
char data[256];
int bytesRead, bytesToRead;
sscanf(buffer, "%[^OK]", buffer);
sscanf(buffer, "%*s,%d,%d\r\n%[^\\0]", &bytesRead, &bytesToRead, data);

私の応答は空白 (文字 0x20) で始まり、「\r\n \r\n」(または 16 進表現で「0x0D 0x0A 0x20 0x0D 0x0A」) というダーティな出力が得られました。

すべてを試しましたが、空白文字のみを出力バッファーに正しく解析できません。

4

1 に答える 1

0

問題:

  1. sscanf(buffer, "%[^OK]", buffer);同じバッファへの読み書きを試みます。これは未定義の動作です。別のバッファーを使用します。 @EOF

  2. "%[^OK]"charではないもの'O'とそうでないものをすべて探すため、次の'K'場所で停止します。\r\n+CIPRX ... DATA C

  3. "%*s"insscanf("%*s,%d..."は 2 つのことを行います。1) 先頭のすべての空白文字をスキャンして保存しません。'*'2)すべての非空白文字をスキャンし、(理由により) 保存しません。','次の「すべての非空白文字」は決してないので、sccanf()停止します。

使っsscanf()ていて困ったとき、まずコーディングするのは の戻り値のチェックですsscanf()

OPの全体的な目標については不明ですが、おそらく次のことが役立ちます。

#include <stdio.h>

char *text = 
"\r\n+CIPRXGET:1\r\n+CIPRXGET: 2,1,3\r\nDATA COMPOSED BY A WHITESPACE AND MAYBE OTHER\r\nOK";

int main(void) {
  char data[256];
  int bytesRead, bytesToRead;
  if (sscanf(text, "%*[^,],%d,%d %255[^\r\n]", &bytesRead, &bytesToRead, data) == 3) {
    printf("bytesRead:%d\nbytesToRead:%d\ndata:'%s'\n",bytesRead, bytesToRead, data);
  }
  return 0;
}

出力

bytesRead:1
bytesToRead:3
data:'DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER'
于 2015-12-22T16:20:39.257 に答える