sscanf使用空格解析响应

sscanf parse response with whitespaces

本文关键字:响应 空格 sscanf      更新时间:2023-10-16

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

rn+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,%drn%[^\0]", &bytesRead, &bytesToRead, data);

我的响应以空白(字符0x20)开始,得到一个脏输出,即"\r\n\r\n"(或十六进制表示为"0x0D 0x0A 0x20 0x0D 0x0A")。

我尝试了所有的方法,但我不能只正确地将空白字符解析到输出缓冲区中。

问题:

  1. CCD_ 1尝试对同一缓冲区进行读取和写入。这是未定义的行为。使用不同的缓冲区@EOF-

  2. "%[^OK]"查找所有不是'O'也不是'K'char,因此它在rn+CIPRX ... DATA C 处停止

  3. sscanf("%*s,%d..."中的"%*s"做两件事:1)扫描并且不保存所有前导空白字符。2) 扫描而不保存(由于'*')所有非空白字符。"所有非空白字符"后面永远不会有sscanf(buffer, "%[^OK]", buffer);0,因此sccanf()停止。

当使用sscanf()并出现故障时,首先要进行编码的是检查sscanf()的返回值。

目前还不清楚OP的总体目标,但以下内容可能会有所帮助。

#include <stdio.h>
char *text = 
"rn+CIPRXGET:1rn+CIPRXGET: 2,1,3rnDATA COMPOSED BY A WHITESPACE AND MAYBE OTHERrnOK";
int main(void) {
  char data[256];
  int bytesRead, bytesToRead;
  if (sscanf(text, "%*[^,],%d,%d %255[^rn]", &bytesRead, &bytesToRead, data) == 3) {
    printf("bytesRead:%dnbytesToRead:%dndata:'%s'n",bytesRead, bytesToRead, data);
  }
  return 0;
}

输出

bytesRead:1
bytesToRead:3
data:'DATA COMPOSED BY A WHITESPACE AND MAYBE OTHER'