pbean
pbean

Reputation: 717

How to retrieve the telephone number from an AT CMGL response?

I have an application written in C that reads text messages from a modem using AT commands. A typical AT response from the modem looks like this:

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

The code is currently set up to only retrieve the id from this line, which is the first number, and it does so using the following code:

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

Here, "line" is a character array containing a line from the modem, and "entry" is an integer in which the id is stored. I tried extending this code like this:

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

I figured I would use the %*s to scan for the text in the first pair of quotes and skip it, and read the text in the next pair of quotes (the phone number) into the phonenr character array.

This doesn't work (%*s apparently reads "REC" and the next %s doesn't read anything).

An extra challange is that the text isn't restricted to "REC READ", it could in fact be many things, also a text without the space in it.

Upvotes: 0

Views: 2610

Answers (4)

pbean
pbean

Reputation: 717

The way I solved it now is with the following code:

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

This would first scan for a number (%d), then for an arbitrary string of characters that are not double quotes (and skip them, because of the asterisk), and for the phone number it does the same.

However, I'm not sure yet how robust this is.

Upvotes: 1

hlovdal
hlovdal

Reputation: 28268

Sscanf is not very good for parsing, use strchr rather. Without error handling:

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

(updated with tested, working code)

Upvotes: 1

user82238
user82238

Reputation:

%s in scanf() reads until whitespace.

You're very close to a solution.

To read this;

+CMGL: 1,"REC READ"

You need;

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

Upvotes: 0

Todd Li
Todd Li

Reputation: 3279

You can use strchr() to find the position of '+' in the string, and extract the phone number after it. You may also try to use strtok() to split the string with '"', and analyze the 3rd part.

Upvotes: 0

Related Questions