-         

Ergebnis 1 bis 6 von 6

Thema: RS232 P. Fleury Char und String Probleme mal wieder

  1. #1
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311

    RS232 P. Fleury Char und String Probleme mal wieder

    Anzeige

    Hallo Leute,
    ich möchte an meinen µC einen Befehl senden (na so wein Zufall
    Der Befehl soll im Prinzip so aussehen:
    <befehl>
    Das ganze müsste dann so interpretiert werden:

    wenn '<' empfangen, dann
    Command[i]=empfangenes_zeichen
    i++

    wenn '>' empfangen, dann keine weiteren Zeichen mehr aufnehmen.

    Das habe ich bisher so versucht zu realisieren:
    Code:
                    uint8_t c = uart_getc();
    		if (c=='<') RS232.Cmd_Start=1; //RS232.Cmd_Start ist ein Bitfeld
    
    		if (RS232.Cmd_Start==1) {
    			RS232.Cmd[RS232.i]=c; //RS232.Cmd ist ein Char[20]
    			RS232.i++; //ein uint8_t
                    }
    		
    		if (c=='>') { //wenn fertig, '\0' anhängen und Index Resetten
    			RS232.Cmd_Start=0;
    			RS232.Cmd[RS232.i]='\0';
    			RS232.Cmd_Complete=1;
    		}
    
    ...
    woanders
    ...
    
    		if (RS232.Cmd_Complete==1) {
    			lcd_gotoxy(0,1);
    			lcd_puts(RS232.Cmd);
    			uart_puts(RS232.Cmd);
    			RS232.Cmd_Complete=0;
    		}
    Schön und gut, wenn ich nun mit uart_puts(RS232.Cmd) versuche den Befehl zurückzusenden bekomme ich im Terminal nur ein "<". Wieso?
    Wenn ich folgendes sende:

    Code:
     RS232.Cmd[0]='a';
     RS232.Cmd[1]='b';
     RS232.Cmd[2]='c';
     RS232.Cmd[3]='\0';
    
     uart_puts(RS232.Cmd);
    erhalte ich im Terminal "abc", egal ob ich (const char*) RS232.Cmd nehme oder nicht. Ich versteh' nicht, wo mein Denkfehler liegt.
    Vieln Dank,
    Simon

    Hinweis: Es macht auch keinen Unterschied, wenn ich in der Auswertung (unsigned int)c=='>' anstelle von c=='>' verwende, obwohl's eigentlich korrekter wäre.

    P.S.: ATMega32, XTAL=8MHz

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    if (c=='>') { //wenn fertig, '\0' anhängen und Index Resetten


    Wo resetest du denn da i? Bzw. wie initialisiert du RS232.i?

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  3. #3
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Hi Adun.
    RS232.i wird in main initialisiert:
    Code:
    	RS232.i=0;
    	for (;;) { 
    		rs232_gets(); //funktion, wo zeichen zu string gepackt werden sollen...
    		lcd_gotoxy(0,0);
    		lcd_puts("Eingang:");
    		
    		if (RS232.Cmd_Complete==1) {
    			lcd_gotoxy(0,1);
    			lcd_puts(RS232.Cmd);
    			uart_puts(RS232.Cmd);
    			RS232.Cmd_Complete=0;
    		}
    		
    
    	} //ende for
    RS232.i habe ich vergessen zu resetten. Sollte dort hin:
    funktion rs232_gets()

    Code:
    		if (c=='>') {
    			RS232.Cmd_Start=0;
    			RS232.Cmd[RS232.i]='\0';
    			RS232.Cmd_Complete=1;
    			RS232.i=0;
    		}
    Das hatte ich da auch schonmal stehen gehabt. Es macht aber keinen Unterschied. Wo könnte das Problem sein?
    VG Simon

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    04.04.2005
    Ort
    Hamburg
    Alter
    29
    Beiträge
    826
    Mh ... vielleicht hat noch jemand anderes ne idee?

    Andun
    www.subms.de
    Aktuell: Flaschcraft Funkboard - Informationssammlung

  5. #5
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Hi Adun, ich glaube langsam den Fehler zu finden. Und zwar wird das char ab dem '<' immer angehängt. Egal ob danach gleich ein neues char kommt oder eben '0'. Das habe ich folgendermaßen rausgefunden:

    Ich habe mir das eingelesene char-array stur ausgeben lassen:
    Code:
    for (int u=0; u<10; u++) {uart_putc(RS232.Cmd[u]); }
    Wenn ich nun "<hello>" übertrage bekomme ich folgendes zurück:
    "< e l l"
    Wichtig: Die Leerzeichen haben den Decimal-Wert 000. Und dort liegt der Fehler, das muss ich noch rausfiltern.
    Poste meine Ergebnisse hier dann...

  6. #6
    Erfahrener Benutzer Begeisterter Techniker Avatar von PCMan
    Registriert seit
    05.08.2006
    Ort
    Munich
    Beiträge
    311
    Okay, Problem behoben: eine Zeile Code hat's dann getan:
    Code:
    		if (c!=0){		
    		if(c=='<') {
    		 RS232.Cmd_Start=1;
    		} 		
    		if(RS232.Cmd_Start==1) {
    		 RS232.Cmd[RS232.i]=c;
    		 RS232.i++;
    		} 
    		if(c=='>') {
    		 RS232.Cmd[RS232.i]='\0';
    		 RS232.Cmd_Start=0;
    		 RS232.Cmd_Complete=1;
    		 RS232.i=0;
    		}			
    		}
    Das if (c!=0) war's!
    Jetzt geht's so, wie ich mir das vorstelle.
    vG Simon

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •