- LiTime Speicher und Akkus         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: UART String senden

  1. #1
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    35
    Beiträge
    967

    UART String senden

    Anzeige

    Praxistest und DIY Projekte
    Hallo zusammen,

    mein Ziel ist es, ein beliebigen String über UART zu senden. Meine ersten C Gehversuche sahen aus wie unten im Code. Jedoch erreicht mich am PC immer nur ein "Ha". Sieht also aus, als passt das was mit dem Speicher nicht? Aber müsste der Pointer nicht einfach immer hochgezählt werden? Den ganzen String durch?

    Vielleicht könnt ihr mir helfen.

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    
    #define BAUD        19200UL
    #define UBRR_BAUD   ((F_CPU/(16UL*BAUD))-1)
    
    /*************************************************************************
     Initialisierung vom UART Interface
    *************************************************************************/
    void uart_init(void)
    {
        // Baudrate einstellen (Normaler Modus)
        UBRRH = (unsigned char) (UBRR_BAUD>>8);
        UBRRL = (unsigned char) (UBRR_BAUD & 0x0ff);
    
        // Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
        UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN);
    
        // Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
        UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    
    	// Flush Receive-Buffer (entfernen evtl. vorhandener ungültiger Werte) 
        do
        {
            // UDR auslesen (Wert wird nicht verwendet) 
            UDR;
        }
        while (UCSRA & (1<<RXC));
    
    	// Rücksetzen von Receive Complete Flag 
        UCSRA = (1<<RXC);
    }
    
    /*************************************************************************
     String senden
    *************************************************************************/
    void uart_send(const char *string)
    {		
    	do
        {
    		// ... warten bis der Sendepuffer leer ist ...
        	while (!( UCSRA & (1<<UDRE)))
    			;
    
            UDR = (const unsigned char)*string;
        }
        while (*string++);
    }
    
    /*************************************************************************
     UART Empfangs Interrupt ISR
    *************************************************************************/
    ISR(SIG_UART_RECV)
    {
        unsigned char buffer;
    
        // Daten aus dem Puffer lesen ...
        buffer = UDR;
    }
    Code:
    void uart_init(void);
    
    void uart_send(const char *string);
    Code:
    uart_send("Hallo!" "\r\n");
    Das ist uart.c, uart.h und der Aufruf der Methode in main.c


    Danke schonmal für eure Hilfe

    Grüße,
    hacker
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    Code:
    void uart_send(const char *string)
    {      
       do
        {
          // ... warten bis der Sendepuffer leer ist ...
           while (!( UCSRA & (1<<UDRE)))
             ;
    
            UDR = (const unsigned char)*string;
        }
        while (*string++);
    }
    warum const char *string ? einfach nur char* string reicht doch!

    wie empfängst du den string, mitm terminal ?

    ausserdem ist deine while bedingung falsch, die ist post-increment, d.h. du übermittelst auf jeden fall noch das stringterminal mit, ausserdem ist fragwürdig was der compiler mit den nicht konkadenierten(hoffentlich war das richtig geschrieben) "Hallo!" "\r\n" macht, da müsste mindestens noch ein + dazwischen, oder gleich das '\r''\n' ans ende der uart_send methode verfrachten ...

    zum fehler würd ich jetzt fast vermuten, dass in der schleifenbedingung versucht wird den WERT hinter dem pointer zu inkrementieren (und der ist laut deiner definition "const char* ptr" schreibgeschützt), ich würde sowas immer klammern *(ptr++) bzw. wenn cih den nachfolgenden wert prüfen will *(++ptr)

  3. #3
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    35
    Beiträge
    967
    Danke für die rasche Antwort. Ich hab den Code nun zu folgendem geändert:

    Code:
    void uart_send(char *string)
    {		
    	while (*string)
        {
    		// ... warten bis der Sendepuffer leer ist ...
        	while (!( UCSRA & (1<<UDRE)))
    			;
    
            UDR = (unsigned char)*string;
    
    		string++;
        }
        
    }
    Das mit dem "+" Operator hab ich auch mal ausprobiert, jedoch meckert der Compiler dass "+" für "*string" und "*string" nicht geht. Ich hab es aber auch mal so probiert: "uart_send("Hallo!\r\n"); funktioniert auch nicht.

    Empfangen tu ich am PC mit einem eigen in Java geschriebenem Programm. Ich hab aber auch schon das Hyperterminal ausprobiert. Ankommen tut ausschließlich "Ha"
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    seltsam, sieht eigentlich vollkommen i.o. aus *grübel*

    wo du gesagt hast "selber geschrieben" hab cih schon vermutet dass du vielleicht nur einmal ausliesst und die restlichen bytes im com puffer liegen, aber wenns hyperterminal dasselbe sagt ...

    ich machs über den index und mit for schleife
    Code:
    	for (int i = 0; i < strlen(text); i++)
    	{
    		USART_Transmit(text[i]);
    	}
    	USART_Transmit('\r');
    	USART_Transmit('\n');
    USART_Transmit(...) iss auch nur schleife mit warten und ins UDR schreiben


    für eher unwahrscheinlich halte ich das alte Quarzproblem, aber dennoch, welchen Quarz benutzt du, ist F_CPU vernünftig eingestellt ?

  5. #5
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    35
    Beiträge
    967
    Als Quarz benutze ich 16MHz. Mit einem Bascom Programm funktioniert es tadellos. F_CPU steht auch auf 16000000 im MFile. Muss ich sonst noch irgendwas dem Compiler übergeben oder in der IDE einstellen? Ich benutze AVRStudio mit WinAVR. Ich hab es mal probiert zu simulieren/debuggen. In uart_send bleibt er das dritte mal hier

    Code:
    	// ... warten bis der Sendepuffer leer ist ...
        	while (!( UCSRA & (1<<UDRE)))
    			;
    stecken. Das entspricht auch meinem "Ha" Kann sich das einer erklären, warum er da hängen bleibt?

    Grüße,
    hacker
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  6. #6
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Ceos
    warum const char *string ? einfach nur char* string reicht doch!
    Der String wird in der Funktion nicht verändert, also ist das const hier genau richtig. Das hat nichts mit "reicht doch" zu tun, sondern mit gutem Programmierstil.

    ausserdem ist fragwürdig was der compiler mit den nicht konkadenierten(hoffentlich war das richtig geschrieben) "Hallo!" "\r\n" macht
    Das ist völlig korrektes C, und macht genau das, was der OP davon erwartet.

    da müsste mindestens noch ein + dazwischen
    C != C++


    @ hacker:

    Bekommst du nur ein einzelnes "Ha", oder eine unendliche Abfolge davon? Wenn letzteres, tippe ich auf den Watchdog.
    MfG
    Stefan

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    10.03.2005
    Alter
    35
    Beiträge
    967
    Komisch. Ich hab grad die Interrupts gesperrt. Und siehe da es kommt "Hallo!" an. Aber was hat das mit den Interrupts zu tun?

    Ich bekomme mit sei() nur ein einzelnes "Ha".
    Ich würde ja gern die Welt verändern..., doch Gott gibt mir den Quellcode nicht!

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    vielleicht hast du einen interrupt enabled, den du im code noch nciht eingebaut hast und dein controller schmiert ab ?!

  9. #9
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von Ceos
    vielleicht hast du einen interrupt enabled, den du im code noch nciht eingebaut hast und dein controller schmiert ab ?!
    Dann müsste eine unendliche Abfolge von "Ha"s kommen.
    Ich tippe eher auf eine Endlosschleife in einer ISR, oder einem versehentlichen Deaktivieren des UART in einer ISR.
    MfG
    Stefan

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    39
    Beiträge
    3.416
    stimmt auch wieder ... naja check halt mal die interrupts ^^

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

LiTime Speicher und Akkus