- fchao-Sinus-Wechselrichter AliExpress         
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

    LiFePo4 Akku selber bauen - Video
    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
    36
    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
    36
    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
  •  

Labornetzteil AliExpress