- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: Zeichenketten Auf ATmega übertragen und vergleichen

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51

    Zeichenketten Auf ATmega übertragen und vergleichen

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hi,

    ich versuche mehrere Zeichen(Strings unterschiedlicher Länge) per RS232 vom PC auf den AtMega und zurück zu übertragen.
    Leider hab ich keine Ahnung woran ich erkenne wann das letzte Zeichen übertragen wurde. Deshalb hab ich einfach gesagt die '#' solls sein.
    Leider läuft das so nicht.
    Anbei der Quellcode. Neben dem Interrupt gesteuerte Zeicehempfang läuft noch ein Timer mit dem ich ne Led Blinken lasse.

    Ich bin für jeden Tipp dankbar der Licht in mein Dunkel bringt. :/

    Code:
    #include <avr/io.h> 
    #include "SeriellBiblio.h"
    #include <progmem.h>
    #include <avr/signal.h>
    #include <avr/interrupt.h>
    #include <avr/string.h>
    //Arbeitstakt angeben
    #define SYSCLK 8000000UL
    
    //usart ansprechen
    
    volatile unsigned char *data;
    volatile int count=0;
    volatile unsigned char b;
    
    void timer (void){
    	TIMSK=_BV(TOIE0);					//overflow flag setzen--> ab jetzt kan overflow interrupt ausgelöst werden
    	TCNT0 = 0;                			//Rücksetzen des Timers
    	TCCR0 = _BV(CS02);    				//Prescaler 256
    	sei ();								//interrupts ein
    }
    
    int main(void) {
    	USART_Init ();
    	timer ();
    	//sei();
    	//unsigned char data = 0;
    	DDRB = 0xff;
    	PORTB=0xff;
    	for (;;) {
    	    //data = USART_receive ();
    		//darf erst vergleichen wenn nicth mehr gesendet wird... hmmm
    		if(b=='1'){
    			if (strstr((char*)data, "1#")){
    			 PORTB = 0x00;
    			 data="";
    			}
    			else if (strstr((char*)data, "0#")){
    			 PORTB = 0xff;
    			 data="";
    			}
    			else if (strstr((char*)data, "Steffen#")){
    			 USART_transmit_string("Hallo Steffen");//(char*)data
    			 data="";
    			}
    			else if (strstr((char*)data, "Jana#")){
    			 USART_transmit_string("Hallo Jana");//(char*)data
    			 data="";
    			}
    			b='0';
    		}	
    	}
    	return 0;
    }
    //intterrupt wenn byte empfangen
    SIGNAL (SIG_UART_RECV){
    	data+=UDR;//hänge neues byte an
    	if (UDR=='#')b='1'; //prüft ob Receive complete
    }
    
    //lässt led blinken
    SIGNAL (SIG_OVERFLOW0) {
    	count++;
    	if (count==4){
    	 if(PORTB & (1<<PB0)){
    	  PORTB&=~(1<<PB0);
    	  count=0;
    	 } 
    	 else{
    	  PORTB|=(1<<PB0);
    	  count=0;
    	 }
    	}
    }
    MFG

    Bomb

  2. #2
    Gast
    Hallo

    Versuch es mal so. Ich meine, das UDR Register wird beim ersten Lesezugriff gelöscht.

    Code:
    //intterrupt wenn byte empfangen
    SIGNAL (SIG_UART_RECV){
       unsigned char temp; 
        temp = UDR;
       data+=temp;//hänge neues byte an
       if (temp=='#')b='1'; //prüft ob Receive complete
    }
    MFG
    Dieter

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51
    hi,

    leider mag er noch nicht.
    Ich werd erstmal irgendwo ne led blinken lassen wenn er was empfängt.
    Irgendwo musses noch haken.
    Unter Bascom war die Kommunikation ganz easy möglich. Aber wer weis was ich mir da wieder zusammengeschrieben hab
    MFG

    Bomb

  4. #4
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51
    Hi,
    Ichhab mal ne LED blinken lassen. Also er scheint zu empfangen LED an.
    Auch setzt er den Ausgang wieder Zurück # erkannt.
    Also muss das Problem bei den Stringvergleichen hängen.
    Ich hab für die Stringvergleiche die string.h eingebunden.
    Ich hab irgendwo gelesen das mit der strstr Fkt. ein Stringvergleich realisierbar ist.
    Vielleicht hab ich da was nicht beachtet oder falsch verstanden?Hmm...
    MFG

    Bomb

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.02.2004
    Ort
    Starnberg
    Alter
    47
    Beiträge
    170
    Hallo,

    else if (strstr((char*)data, "Steffen#"))
    Wenn ich mich recht erinnere, vergleicht strstr() bis zum \n-Zeichen (0x00).

    Da das in deiner Zeichenfolge aber nicht vorkommt, vergleicht er bis weißgott wohin, und es wäre reiner Zufall, wenn der Vergleich positiv ist.

    Ich würde das #-Zeichen durch das übliche 0x00 bzw. \n ersetzen.

    Es gab aber auch eine Funktion, die nur n Zeichen vergleicht, mir fällt aber der Name nicht mehr ein

    Ich hoffe es hilft, Martin

    EDIT: Nachtrag

    Du kannst dann auch schreiben:

    Code:
    if (!UDR) b='1';

  6. #6
    Gast
    Hallo

    Ich bin zwar nicht der Pointer Spezi, aber nach meiner Ansicht fehlt erstmal ein String, auf den der Pointer zeigen kann. Data ist ja nur als char definiert.
    Von daher kann es auch immer nur ein Zeichen enthalten.

    MFG
    Dieter

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.02.2004
    Ort
    Starnberg
    Alter
    47
    Beiträge
    170
    Stimmt eigentlich!

    es müsste zumindest heißen:

    volatile unsigned char *data[];

    Und ich glaube, den Typecast auf char* kann man sich sparen.

    Bitte jetzt nicht mit malloc() etc. anfangen, dann krieg ich die Krise

  8. #8
    Gast
    Hi,

    danke für die tips. werde die morgen in aller früh in die tat umsetzen.
    Das mit dem *char[] ging glaub ich nicht(oder hatte ich nur char[] probiert?). man muss ne feste größe angeben oder?
    Soweit ich weis kann man nur in java wirklich dynamische Felder anlegen.
    man müsste in ca also sowas wie volatile unsigned *char[5] oder so schreiben.
    nun gut. Ich probiers morgen nochmal. Neuer Tag neues Glück

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    24.02.2004
    Ort
    Starnberg
    Alter
    47
    Beiträge
    170
    Hallo Gast,

    Ohne Größenangabe gehts nur, wenn du die Variable gleich initialisiert, z.B.
    Code:
    volatile unsigned char *data[] = "Steffen";
    Ansonsten mach die Zahl so groß, dass alles vorkommende reinpasst. Aber dann wieder mit \n abschließen, sonst gehts mit strstr() schief.

    Also:

    Code:
    volatile unsigned char *data[12];
    oder
    volatile unsigned char *data[] = "Steffen\n";
    Du musst natürlich das gleiche vom PC senden.


    Grüsse, Martin

  10. #10
    Benutzer Stammmitglied
    Registriert seit
    09.11.2004
    Ort
    Wernigerode
    Alter
    44
    Beiträge
    51
    Hallo,

    jetzt wieder mal angemeldet .
    Hab ich mir schon gedacht das der Wert fest vorgegeben sein muss.
    ui ui, da kommt ne ganze menge Speicherverschwendung auf mich zu,
    da wie gesagt ja ne variable Anzahl an Zeichen 'rüberkommen' kann.
    Dennoch danke ich probiers gleich aus
    MFG

    Bomb

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen