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

时间:2009-08-21 12:11:12

标签: c modem at-command scanf

我有一个用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”,它实际上可能是很多东西,也是一个没有空间的文本

4 个答案:

答案 0 :(得分:1)

Sscanf不是很适合解析,而是使用strchr。没有错误处理:

#include <stdio.h>

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;
}

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

答案 1 :(得分:1)

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

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

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

scanf()中的

%s读取直到空格。

你非常接近解决方案。

阅读本文;

+ CMGL:1,“REC READ”

你需要;

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