如何从AT CMGL响应中检索电话号码?

我有一个用C编写的应用程序,它使用AT命令从调制解调器读取文本消息。 调制解调器的典型AT响应如下所示:

+CMGL: 1,"REC READ","+31612123738",,"08/12/22,11:37:52+04" 

代码当前设置为仅从此行检索id,这是第一个数字,并使用以下代码执行此操作:

 sscanf(line, "+CMGL: %d,", &entry); 

这里,“line”是包含来自调制解调器的行的字符数组,“entry”是存储id的整数。 我尝试像这样扩展这段代码:

 sscanf(line, "+CMGL: %d,\"%*s\",\"%s\",", &entry, phonenr); 

我想我会使用%* s来扫描第一对引号中的文本并跳过它,然后将下一对引号(电话号码)中的文本读入phonenr字符数组。

这不起作用(%* s显然读取“REC”,下一个%s不读取任何内容)。

一个额外的挑战是文本不限于“REC READ”,它实际上可能是很多东西,也是一个没有空间的文本。

Sscanf不是很适合解析,而是使用strchr。 没有error handling:

 #include  int main(void) { const char *CGML_text = "+CMGL: 1,\"REC READ\",\"+31612123738\",,\"08/12/22,11:37:52+04\""; char *comma, *phone_number_start, *phone_number_end; comma = strchr(CGML_text, ','); comma = strchr(comma + 1, ','); phone_number_start = comma + 2; phone_number_end = strchr(phone_number_start, '"') - 1; printf("Phone number is '%.*s'\n", phone_number_end + 1 - phone_number_start, phone_number_start); return 0; } 

(使用经过测试的工作代码更新)

我现在解决它的方式是使用以下代码:

 sscanf(line, "+CMGL: %d,\"%*[^\"]\",\"%[^\"]", &entry, phonenr); 

这将首先扫描一个数字(%d),然后扫描不是双引号的任意字符串(并跳过它们,因为星号),对于电话号码,它会做同样的事情。

但是,我不确定这是多么强大。

您可以使用strchr()在字符串中查找“+”的位置,然后在其后面提取电话号码。 您也可以尝试使用strtok()将字符串拆分为“”,并分析第3部分。

scanf()中的%s读取直到空格。

你非常接近解决方案。

读这个;

+ CMGL:1,“REC READ”

你需要;

“+ CMGL:%d,”%* s%* s“