www.mikrocontroller.net

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


Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
char string1;
netzabfrage();
for(;;){

bytes = read_port(&fd_ser,puffer);
            if( bytes > 0){
            for (i = 0;i< bytes;i++){
            //printf("%c",puffer[i]);
            string1 = puffer[i];
            
            printf("%c",string1);
                                    }
           printf("\n");
                                }
                                

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

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

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du könntest auch die Funktion ftok hernehmen.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: P. S. (Gast)
Datum:

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

Autor: Gerry E. (micky01)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: P. S. (Gast)
Datum:

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

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jürgen Röck (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hat wunderbar geklappt, Vielen Dank!

Autor: chris (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;
}

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das wird lesbarer, wenn es in [ c ] und [ / c ] eingeschlossen wird 
(ohne Leerzeichen)
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;
}


Die grottige Formatierung wird dadurch aber auch nicht besser.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.