Auswertung eines AT-Befehls in C unter Linux (AT+COPS?)

Gast #1488593
Lesenswert?

Hallo Forengemeinde,

ich versuche mich gerade in der Anbindung von einem HUAWEI E160 - USB - 
Sticks zur Verwendung als SMS-Gateway unter C in Linux. Als erstes 
möchte ich anhand des "AT+COPS?"-Befehls feststellen, in welchem Netz 
ich mich im Moment befinde.
Wenn ich also diesen Befehl losschicke, bekomme ich folgende Rückmeldung 
lt. folgendem Quelltext:
1
char string1;
2
netzabfrage();
3
for(;;){
4

5
bytes = read_port(&fd_ser,puffer);
6
            if( bytes > 0){
7
            for (i = 0;i< bytes;i++){
8
            //printf("%c",puffer[i]);
9
            string1 = puffer[i];
10
            
11
            printf("%c",string1);
12
                                    }
13
           printf("\n");
14
                                }

Im Terminal sieht das dann so aus (Ausgabe von string1 mit printf):
1
AT+COPS? 
2

3
+COPS: 0,0,"o2 - de",0
4

5
OK
Meine Frage bezieht sich nun darauf, wie man am geschicktesten das
+COPS: 0,0,"o2 - de",0 aufteilen kann und sich die Information 'o2 - de' 
in einem separaten String abspeichern kann, wenn die Zeile mit '+COPS:' 
beginnt.

Vielen Dank,

MfG

chris
Gast #1488690
Lesenswert?

Vielen Dank für die Antworten,

finde unter google bezüglich ftok() nur.

    key_t ftok(char *pathname, char proj_id);

gibts irgendwo ne Beschreibung, wie ich mit ftok() was filtern kann?

Kann man regex auch in einem stinknormalen C-Programm verwenden? Wenn 
ja, wie ist da die Syntax? Bin leider nicht fündig geworden

MfG

chris
Gast #1488750
Lesenswert?

Vielen Dank für eure konstuktive Hilfe!
Versteh trotzdessen nur die Hälfte.

AT+COPS?

+COPS: 0,0,"o2 - de",0

OK


Das einzige was ich weiß ist, dass ich nach 2x '\n' ein `+COPS:` lesen 
soll. Danach soll ich in der Zeile vom '"' bis zum '"' das 'o2 - de' in 
einen separaten String speichern. Ich weiß allerdings nicht, wo ich 
anfangen soll. Bzw. soll ich direkt von 'fd_ser' mit fgets lesen oder 
den 'string1' mit fgets auslesen?

Sorry, beschäftige mich schon die komplette Woche mit diesem Thema und 
bin schon total verzweifelt.



MfG

chris
Gast #1488849
Lesenswert?

Hallo Chris,
ich möchte mich meinen Vorrednern(schreibern) anschliessen und Dir die 
Funktion strtok() empfehlen.
Du liest die Antwort auf Deinen AT-Befehl in einen String ein. Im 2. 
Schritt zerlegst Du den String in seinen Bestandteile (mit strtok) wobei 
sich hier das Komma als Separator anbietet. D.h du musst strtok in einer 
Schleife aufrufen dazu findest Du ein beispiel in den man-Pages oder in 
der Doku deines Compilers.
Gast #1490026
Lesenswert?

falls noch jemand den code brauchen könnte:

[code]
char * netzname;

int netzabfrage(){
int bytes;
int i;
char puffer[200];


int fd_ser;
fd_ser = open_port();

log_meld("Frage Netznamen ab...\n");

int h;

for (h=0;h==201;h++){  /// PUFFER LÖSCHEN
                    puffer[h] = 0;
                    }
write(fd_ser, "AT+COPS? \r\n",11);
set_cursor(0,11);
netzname = 0;
bytes = read_port(&fd_ser,puffer);
            if( bytes > 0){
            for (i = 0;i< bytes;i++){

                                                     }

            int k=1;
                 char *ptr;
                 set_cursor(0,10);
                 ptr = strtok(puffer, ",");
                       while(ptr != NULL)
                       {
                         k++;

                      //printf("detektion: %d. string--> %s  i--> 
%d",k++,ptr,i); // Debug Print
                        if (k == 4){
                      //set_cursor(8,6);  // DEBUG
                      //printf("%s",ptr); // DEBUG

                         netzname = ptr;
                        }

                      ptr = strtok(NULL, ",");
//            printf("%c",string1); // DEBUG
                        }
printf ("%s", netzname);

}

log_meld("Netz abgefragt.\n");
return 0;
}
Persönliche Seite #1490172
Lesenswert?

Das wird lesbarer, wenn es in [ c ] und [ / c ] eingeschlossen wird 
(ohne Leerzeichen)
1
char * netzname;
2

3
int netzabfrage(){
4
int bytes;
5
int i;
6
char puffer[200];
7

8

9
int fd_ser;
10
fd_ser = open_port();
11

12
log_meld("Frage Netznamen ab...\n");
13

14
int h;
15

16
for (h=0;h==201;h++){  /// PUFFER LÖSCHEN
17
                    puffer[h] = 0;
18
                    }
19
write(fd_ser, "AT+COPS? \r\n",11);
20
set_cursor(0,11);
21
netzname = 0;
22
bytes = read_port(&fd_ser,puffer);
23
            if( bytes > 0){
24
            for (i = 0;i< bytes;i++){
25

26
                                                     }
27

28
            int k=1;
29
                 char *ptr;
30
                 set_cursor(0,10);
31
                 ptr = strtok(puffer, ",");
32
                       while(ptr != NULL)
33
                       {
34
                         k++;
35

36
                      //printf("detektion: %d. string--> %s  i-->%d",k++,ptr,i); // Debug Print
37
                        if (k == 4){
38
                      //set_cursor(8,6);  // DEBUG
39
                      //printf("%s",ptr); // DEBUG
40

41
                         netzname = ptr;
42
                        }
43

44
                      ptr = strtok(NULL, ",");
45
//            printf("%c",string1); // DEBUG
46
                        }
47
printf ("%s", netzname);
48

49
}
50

51
log_meld("Netz abgefragt.\n");
52
return 0;
53
}

Die grottige Formatierung wird dadurch aber auch nicht besser.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren