String



  • Hallo zusammen!
    Programmiere im moment gerade einen PIC Microcontroller.
    Nun habe ich folgendes Problem. Ein GPS Modul schickt fortlaufen Daten an de PIC, mich interessiert aber nur ein kleiner Teil des gesamten Protokoll,welches geschickt wird, damit ich nicht so viel Daten abspeichern muss.
    Bei jedem Empfang eines Zeichens wird ein Interrupt aufgerufen.

    Jetzt muss nach einem gewissen Wort(Protokollname,$GPRMC), die näachsten 20 Zeichen abgespeichert werden.
    Wie frage ich nun effizient nach diesem Wort(oben gennant) ?
    Sollen 6 ifs in ineinander verpackt werden und nach jedem Buchstaben abgefragt werden, oder kann dies auch einfacher Realisiert werden?

    Danke



  • du kannst man: strstr(3) benutzen, um das Teilstring GPRMC in Eingabestrom zu finden. Vor einer Woche habe ich mir ebenfalls einen kleinen Controller für eine GPS Clock gebaut. Ich hab im Prinzip Zeilenweise gelesen (irgendwann kommt immer ein \n und dann nach $GPRMC gesucht und bis \n gelesen.



  • Oke das werde ich versuchen. Danke für Deine rasche Antwort.



  • Anfänger_99 schrieb:

    ...Bei jedem Empfang eines Zeichens wird ein Interrupt aufgerufen.
    ...

    du könntest jedes zeichen mit dem interrupt in die unten stehende funktion

    int GPRMC ( char c )
    

    reinschicken.
    wenn 6 aufeinander folgende zeichen "$GPRMC" ergeben, wird eine 1 zurückgegeben.
    das nächste zeichen, das du dann empfängst, gehört zu den 20 folgenden, die du speichern möchtest 🙂

    int GPRMC ( char c )
    {
    	static int cnt = 0;
    	int len = 6;
    
    	char *gprmc = "$GPRMC";
    
    	if ( cnt < len && gprmc[cnt] == c )
    	{
    		cnt++;
    	}
    	else
    	{
    		cnt = 0;
    	}
    
    	if ( cnt == strlen(gprmc) ) return 1;
    
    	return 0;
    }
    
    int main() // demo
    {
    	char* stream = "abcd$GPRMChiergehtslos...xyz";
    
    	while(*stream)
    	{
    		if ( GPRMC(*stream++) ) break;
    	}
    
    	// stream zeigt jetzt genau auf das nächste zeichen hinter dem suchwort
    	puts(stream);
    
    	return 0;
    } :)
    


  • agga ugga schrieb:

    [cpp]
    int GPRMC ( char c )
    {
    static int cnt = 0;
    int len = 6;

    char *gprmc = "$GPRMC";

    if ( cnt < len && gprmc[cnt] == c )
    {
    cnt++;
    }
    else
    {
    cnt = 0;
    }

    if ( cnt == strlen(gprmc) ) return 1;

    return 0;
    }

    in einem interrupt sollte man keine rechenzeit verschwenden, auch wenn's bei RS232 nicht so viele interrupts gibt:

    int GPRMC ( char c )
    {
       static int cnt = 0;
       static char *gprmc = "$GPRMC";
    
       if (gprmc[cnt] == c)
       {
          cnt++;
          if (gprmc[cnt] == 0)
          {
             cnt = 0;
             return 1;
          }
       }
       else
       {
          cnt = 0;
       }
       return 0;
    }
    

    🙂



  • ja, das strlen wollt ich eigenlich rausschmeissen, deshalb hatte ich oben ja auch len benutzt.
    unten hatte ich dann vergessen den funktionsaufruf mit len zu ersetzen.
    deine methode ist natürlich noch eleganter, weil sie ohne len, also mit einer variable weniger auskommt. 👍



  • Danke für Eure Antowrten.
    Kann leider nicht compilieren.An was könnte das liegen?



  • Anfänger_99 schrieb:

    Danke für Eure Antowrten.
    Kann leider nicht compilieren.An was könnte das liegen?

    welche fehlermeldung kommt denn bei dir?
    🙂



  • Das ist nur ein Teil der Fehlermeldungen. Ohne den hinzugefügten Code,gab es keine Errors.

    Errors:

    *** Error 27 : Expression must evaluate to a constant
    *** Error 43 Line 91(4,6): Expecting a declaration
    *** Error 43 Expecting a declaration
    *** Error 48 Expecting a (
    *** Error 48 Expecting a (
    *** Error 43 Line 91(19,21): Expecting a declaration
    *** Error 48 Line 91(22,23): Expecting a (
    *** Error 43 Line 92(4,5): Expecting a declaration



  • Anfänger_99 schrieb:

    *** Error 27 : Expression must evaluate to a constant
    *** Error 43 Line 91(4,6): Expecting a declaration
    *** Error 43 Expecting a declaration
    *** Error 48 Expecting a (
    *** Error 48 Expecting a (
    *** Error 43 Line 91(19,21): Expecting a declaration
    *** Error 48 Line 91(22,23): Expecting a (
    *** Error 43 Line 92(4,5): Expecting a declaration

    na, dann zeig doch mal deine zeilen 27...48.
    🙂



  • Auf diesen Zeilen befindet sich genau dieser obengepostete Code.

    int GPRMC ( char c )
    {
       static int cnt = 0;
       static char *gprmc = "$GPRMC";
    
       if (gprmc[cnt] == c)
       {
          cnt++;
          if (gprmc[cnt] == 0)
          {
             cnt = 0;
             return 1;
          }
       }
       else
       {
          cnt = 0;
       }
       return 0;
    }
    


  • da sind keine syntax-errors drin^^
    das sollte sich compilieren lassen. das problem muss wo anders sein.
    🙂


Anmelden zum Antworten