-1

我需要解析来自设备(SIM900)的响应,如下所示:

\r\n+CIPRXGET:1

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

所以我使用 sscanf 两次:第一次删除最后的字符串“OK”,第二次解析数据。

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”(或十六进制表示“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..."做了两件事 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 回答