-
        

Ergebnis 1 bis 5 von 5

Thema: UART mit Fleury Library

  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    15.06.2010
    Beiträge
    5

    UART mit Fleury Library

    Anzeige

    Hallo,

    ich hatte schon vor einigen Tagen hier gepostet, doch muss ich das Posting erstmal zur Seite legen. Zunächst einmal habe ich folgendes Problem.

    Ich möchte mit der Library von Peter Fleury einen String auf eine ATMega128 schicken und einmal als Echo zurückbekommen. Abgeschlossen werden soll der String mit '#'. Doch irgendwie funktioniert das alles nicht so, wie ich möchte. Könnte mir bitte jemand helfen.

    Danke und Gruß,
    Matze

    Code:
    #include <stdlib.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    
    #include "uart.h"
    
    /* define CPU frequency in Mhz here if not defined in Makefile */
    #ifndef F_CPU
    #define F_CPU 14745600UL
    #endif
    
    #define UART_BAUD_RATE      9600  
    
    int main()
    {
    	char Eingabe[10];
      	unsigned int Count;
    	unsigned int c;
    
     	uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );
    	sei();
    	for(;;)//ever
    	{
    		c = uart_getc();
    	 	if ( !(c & UART_NO_DATA )) //es gibt Daten
       	 	{
           		Count = 0;
    			while ( (char) c != '#' )
           		{
            		if (Count < 10 && (! (c & UART_NO_DATA) ) )
    				{
             			Eingabe[Count++] = (char) c;
    					c = uart_getc(); 
            		}
           		} 	
    	   	Eingabe[Count] = '\0';  //Sequenz von Zeichen in einen String					 		
    		}
    		uart_puts( "\nEmpfangen: \"" );
         	uart_puts( Eingabe );
         	uart_puts( "\"" );
    	} 	//for(;;)-Ende
    } 		//main-Ende

  2. #2
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Mache dir nochmal Gedanken über die genaue Position der Zeile "c = uart_getc();" innerhalb der while-Schleife. So wie es jetzt ist, wird aus der while-Schleife unweigerlich eine Endlosschleife nach den ersten 1-3 Zeichen.
    MfG
    Stefan

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    15.06.2010
    Beiträge
    5
    Oh, ja, danke. Habe es geändert. Jetzt klappt es.

    Durch eine Erweiterung nun ein weiteres Problem.
    Wenn über die Schnitstelle (hTerm) eine 10 bzw. 35 gesendet wird, soll der µC etwas machen, was aber bisher nicht klappt. Ich glaube, dass das an den Konvertierungen char<->integer liegen könnte, doch komme ich selber nicht weiter und brauche nochmal eure Unterstützung. Danke

    Code:
    #include <stdlib.h>
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <avr/pgmspace.h>
    #include <util/delay.h>
    
    /* define CPU frequency in Mhz here if not defined in Makefile */
    #ifndef F_CPU
    #define F_CPU 14745600UL
    #endif
    
    #define UART_BAUD_RATE      9600  
    
    int main()
    {
    	char Eingabe[100];
      	unsigned int Count;
    	unsigned int c;
    	unsigned int Word;
    
     	uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) ); 
    	sei();
    	for(;;)//ever
    	{
    		c = uart_getc();
    	 	if ( !(c & UART_NO_DATA )) //es gibt Daten
       	 	{
           		Count = 0;
    			while ( (char) c != '\r' ) //Bis RETURN 
           		{
            		if (Count < 100 && (! (c & UART_NO_DATA) ) )
    				{
             			Eingabe[Count++] = (char) c;
            		}
    			c = uart_getc(); 
           		} 	
    	   	Eingabe[Count] = '\0';  //Sequenz von Zeichen in einen String
    		uart_puts( " Empfangen: \"" );
         	uart_puts( Eingabe );
         	uart_puts( "\"" );
    		Word = (int) Eingabe;
    		if (Word == 10)
    		{
    			tue etwas
    		}
    		else if (Word == 35)
    		{
    			tue etwas anderes
    		}
    		}
    		
    	} 	//for(;;)-Ende
    } 		//main-Ende

  4. #4
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Ich glaube, dass das an den Konvertierungen char<->integer liegen könnte
    Richtig, denn die Zeile "Word = (int) Eingabe; " ist (sorry) totaler Quatsch. Was du da in "Word" speicherst, ist die Adresse des Strings. Schau dir die Funktion "atoi" an.
    MfG
    Stefan

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    15.06.2010
    Beiträge
    5
    Danke. Mit "atoi" klappt es. Wieder etwas dazu gelernt.

Berechtigungen

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