Forum: PC-Programmierung Auswertung eines AT-Befehls in C unter Linux (AT+COPS?)


von chris (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Dafür bieten sich reguläre Ausdrücke an (regex), wie sie auch das von 
der Kommandozeile her bekannte grep verwendet.

von Gerry E. (micky01)


Lesenswert?

Du könntest auch die Funktion ftok hernehmen.

von chris (Gast)


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

von P. S. (Gast)


Lesenswert?

Also laut meiner manpage ist ftok fuer was voellig Anderes... Ich wuerde 
spontan ganze Zeilen mit fgets lesen und mit strtok_r zerlegen.

von Gerry E. (micky01)


Lesenswert?

Peter Stegemann schrieb:
> Also laut meiner manpage ist ftok fuer was voellig Anderes... Ich wuerde
> spontan ganze Zeilen mit fgets lesen und mit strtok_r zerlegen.

Ja , da habe ich mich vertan, Peter. Danke.

von P. S. (Gast)


Lesenswert?

Wobei ein ftok, das Tokens direkt vom File liest, auch nett waere :-)

von chris (Gast)


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

von Jürgen Röck (Gast)


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.

von chris (Gast)


Lesenswert?

Hat wunderbar geklappt, Vielen Dank!

von chris (Gast)


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

von Rufus Τ. F. (rufus) Benutzerseite


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.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.