Как получить номер телефона из ответа AT CMGL? - PullRequest
0 голосов
/ 21 августа 2009

У меня есть приложение, написанное на C, которое читает текстовые сообщения от модема с помощью AT-команд. Типичный AT-ответ от модема выглядит следующим образом:

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

Код в настоящее время настроен на получение только идентификатора из этой строки, который является первым числом, и делает это, используя следующий код:

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

Здесь «строка» - это массив символов, содержащий строку из модема, а «запись» - это целое число, в котором хранится идентификатор. Я попытался расширить этот код следующим образом:

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

Я решил, что с помощью% * s отсканирую текст в первой паре кавычек, пропущу его и прочту текст в следующей паре цитат (номер телефона) в массив символов phonenr.

Это не работает (% * s явно читает "REC", а следующие% s ничего не читают).

Дополнительным вызовом является то, что текст не ограничен "REC READ", на самом деле это может быть много вещей, а также текст без пробела в нем.

Ответы [ 4 ]

1 голос
/ 21 августа 2009

Я решил это сейчас с помощью следующего кода:

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

Сначала выполняется поиск номера (% d), затем произвольной строки символов, которые не являются двойными кавычками (и пропускаются они из-за звездочки), и для номера телефона выполняется то же самое. *

Однако я пока не уверен, насколько это надежно.

1 голос
/ 21 августа 2009

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

(обновлено с проверенным рабочим кодом)

0 голосов
/ 21 августа 2009

% s в scanf () читает до пробела.

Вы очень близки к решению.

Чтобы прочитать это;

+ CMGL: 1, «REC READ»

Вам нужно;

"+ CMGL:% d,"% * s% * s "

0 голосов
/ 21 августа 2009

Вы можете использовать strchr (), чтобы найти положение «+» в строке и извлечь номер телефона после нее. Вы также можете попробовать использовать strtok (), чтобы разбить строку с помощью «», и проанализировать 3-ю часть.

...