- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 10 von 25

Thema: Daten Senden Empfangen Ic -> Pc -> Ic

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2015
    Beiträge
    11
    Hallo,

    habe das Problem mit dem Übertragen gelöst.
    Das habe ich noch nicht ganz verstanden
    sprintf(s, "%d,%c\n", a, a);
    es wird ein Array s erstellt von den Zeichn a, aber was beudet jetzt das %d und das %c.
    Ich vermute mal das das c wird für char steht.

    Wie kann ich am besten ein Array in teile aufteilen. Die Trennstellen sind durch ein komma getrennt.
    Das heist ich bekomme eine Zeichen folge von 12,345,6.
    Dies wandle ich dann in eine Integer Zahl um, aber wie teile ich die dann in z.B, x=12, y=345 und z=6 auf.
    Ich habe da auch schon viel von strtok, sscanf oder strsep gelesen aber so richtig schau bin ich da nicht draus geworden.

  2. #2
    Neuer Benutzer Öfters hier
    Registriert seit
    22.10.2015
    Beiträge
    11
    Hallo,

    so habe die Probleme gelöst es funktioniert alles. Naja fast alles, muss jezt noch mein Kommunikation mit VB.Net hinbekommen (auch schon fast am verzweifeln).

    Ich möchte mich mal bei allen beteiligten bedanken, für die groß Hilfe, viel Dank!

    Das Hauptproblem lag wahrscheinlich darin das mein 12MHz Quarz einen defekt hatte bzw hat, habe das jetzt alles auf dem intern 8MHz laufen und funktioniert alles,
    es waren aber auch noch genug kleine fehler dabei.

    Ich habe mein Aufteilung mit der "strtok" und "strcpy" funktionen erledigt.
    Mit der strtok habe ich auf meine String auf Trennzeichen untersucht
    und mit der strcpy in die entsprechenden Variablen gespeichert.

    Wenn ich jetzt über das RealTerm eine 1,2,3,4\n sende veränderen sich auch die Blink Zeiten entsprechend.

    Hier mal mein Programm
    Code:
    #include <avr/io.h>
    #include <util/delay.h>
    #include <stdlib.h>
    #include <string.h>
    			  
    #define F_CPU 8000000  /* evtl. bereits via Compilerparameter definiert */
    #define BAUD 300      // Baudrate
     
    // Berechnungen
    #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
    #define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
    #define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) 		// Fehler in Promille, 1000 = kein Fehler.
     
    #include <util/setbaud.h>
    
    
    struct _S_DATA S_DATA;
    int Line[9];			//Array vom Typ int
    
    //------------------------------------------------------------------------------------------
    
    //USART initialisieren
    void uart_init(void)
    {
    	//Set Baudrate
    	UBRRH = UBRR_VAL >> 8;
    	UBRRL = UBRR_VAL & 0xFF;
    	
    	UCSRB |= (1<<TXEN) | (1<<RXEN);					//UART TX und RX einschalten
    	UCSRC = (1<<URSEL) |(1<<UCSZ1) | (1<<UCSZ0);	// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    }
    
    //------------------------------------------------------------------------------------------
    
    struct _S_DATA
    {
    	char Rot[2];
    	char RG [2];
    	char GR [2];
    	char GE [2];
    };
    //------------------------------------------------------------------------------------------
    
    //Warteschleife
    void delay_ms(unsigned int ms)
    {
        unsigned int zaehler;   
        while (ms) {
            zaehler = F_CPU / 5000;       
            while (zaehler) {
                __asm volatile("nop");
                zaehler--;
            }
            ms--;
        }
    }
    //------------------------------------------------------------------------------------------
    
    // Zeichen senden
    int uart_putc(unsigned char c)
    {
    	while (!(UCSRA & (1<<UDRE)))
    	{
    	}
    	UDR = c;
    	return 0;
    }
    //------------------------------------------------------------------------------------------
    
    //String senden
    void uart_puts(char *s)
    {
    	while (*s)
        {   /* so lange *s != '\0' also ungleich dem "String-Endezeichen(Terminator)" */
            uart_putc(*s);
            s++;
        }
    }
    //------------------------------------------------------------------------------------------
    
    //Zeichen empfangen
    uint8_t uart_getc(void)
    {
    	while (!(UCSRA & (1<<RXC)))	//warten bis Zeichen verfügbar 
    	;
    	return UDR;					//Zeichen aus UDR an Aufrufer zurückgeben
    
    }
    //------------------------------------------------------------------------------------------
    
    //Sting empfangen
    void uart_gets(char *Buffer, uint8_t MaxLen)
    {
    	uint8_t NextChar;
    	uint8_t StringLen = 0;
     
    	NextChar = uart_getc();         // Warte auf und empfange das nächste Zeichen
     
                                      // Sammle solange Zeichen, bis:
                                      // * entweder das String Ende Zeichen kam
                                      // * oder das aufnehmende Array voll ist
      while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
        *Buffer++ = NextChar;
        StringLen++;
        NextChar = uart_getc();
      }
     
                                      // Noch ein '\0' anhängen um einen Standard
                                      // C-String daraus zu machen
      *Buffer = '\0';
    
    }
    //------------------------------------------------------------------------------------------
    
    //String Zerlegung
    void string_zer(void)
    {
    
    	unsigned char i;			//Case Hochzählung
    	char Trennzeichen[]=",";	//Trennungszeichen
    	char *ptr;					//Variable zum zwischenspeichern
    
    	i = 2;						//Variable i auf 2 setzten
    
    		ptr=strtok(Line, Trennzeichen);	// Line durchsuchen bis zum Trennzeichen und in ptr zwischen speichern
    		strcpy (S_DATA.Rot, ptr);		// Erster Teil in Rot kopiern wo in der Struct _S_DATA liegt
    		while (ptr != NULL)				//weiter durchsuchen bis das nächste Trennzeichen oder Ende kommt
    		{
    			ptr = strtok (NULL, Trennzeichen);	// Line durchsuchen bis zum Trennzeichen oder Ende und in ptr zwischen speichern
    			switch (i)							//Um in Unterschiedlichen Variablen zu speichern
    			{
    				case 2: strcpy(S_DATA.RG,ptr); break;
    				case 3: strcpy(S_DATA.GR,ptr); break;
    				case 4: strcpy(S_DATA.GE,ptr); break;
    			}
    			i++;	//Variable i um eins hochzählen
    		}
    }
    
    //------------------------------------------------------------------------------------------
    
    //Hauptprogramm
    int main(void)
    {
    	//Variablen Deklartion
    	int time = 1000;
    	int time1 = 1000;
    
    	char Buffer[9];			//String mit maximal 8 zeichen
    	int a;					//Umwandlung ascii zu integer
    	
    	DDRB = 0xFF;
    	PORTB = 0xFF;
     
    	uart_init();			// UART einstellen
    
    	while (1)
    	{
    //---------------------------------------------------------------------------------------------	
    		if ((UCSRA & (1<<RXC)))					//überprüfen ob neue Zeichen vorhanden sind
    		{
    			uart_gets(Line, sizeof(Line));		//Zeichen wurden empfangen, jetzt abholen
    
    			string_zer();		//String in seine Teile zerlegen
    	
    			uart_puts(S_DATA.Rot); 
    			uart_puts(S_DATA.GE);
    		
    			a = atoi (S_DATA.Rot);	//Rot in integer wandeln
    			time = a *1000;   // mal 1000 um auf sekunden zu kommen
    
    			itoa (time, Buffer, 10);	//time in char umwandeln
    
    			uart_puts(Buffer);			//Buffer senden
    		}
    //---------------------------------------------------------------------------------------------
    		else
    		{
    		
    			PORTB = 0b00000000;
    			delay_ms(time1);
    			PORTB = 0b00001111;
    			delay_ms(time);
    			PORTB = 0b11110000;
    			delay_ms(time1);
    			PORTB = 0b11111111;
    			delay_ms(time);
    		}
    
    	}
    
    }

Ähnliche Themen

  1. Daten senden und empfangen mit IR
    Von GerdM im Forum Robby RP6
    Antworten: 3
    Letzter Beitrag: 21.06.2009, 12:40
  2. RS232 daten empfangen, senden und auswerten
    Von Crischan im Forum Software, Algorithmen und KI
    Antworten: 62
    Letzter Beitrag: 20.03.2009, 16:10
  3. USART Senden und Empfangen von Daten.
    Von Ferdinand im Forum C - Programmierung (GCC u.a.)
    Antworten: 5
    Letzter Beitrag: 05.02.2009, 22:13
  4. Daten senden/empfangen
    Von FSTII im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 15
    Letzter Beitrag: 29.12.2006, 16:25
  5. Antworten: 1
    Letzter Beitrag: 22.09.2006, 16:33

Berechtigungen

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

LiFePO4 Speicher Test