- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Ergebnis 1 bis 8 von 8

Thema: txt über USART senden

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51

    txt über USART senden

    Anzeige

    LiFePo4 Akku selber bauen - Video
    hallo,
    ich sende eine Txt Code über USART, das Problem es liest nur 3 Zahlen dann hört er auf. wie kann man das machen.hier ist der code:
    Code:
    #include <avr/io.h>
    #include <stdlib.h>
    #include <stdint.h>
    #include <avr/interrupt.h>
    #include <util/delay.h>
     
    // 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.
    #ifndef UART_H
    #define UART_H
     
    #define F_CPU 3686400UL
     
    #define BAUD 9600UL
    void uart_init(void)
    {
    UCSR0B |= (1<<TXEN0) |(1<<RXEN0)|(RXCIE0<<1); // UART TX einschalten
    UCSR0C |= (1<<UMSEL01)|(1 << UCSZ01)|(1 << UCSZ00); // Asynchron 8N1
     
    UBRR0H = UBRR_VAL >> 8;
    UBRR0L = UBRR_VAL & 0xFF;
    }
     
    uint8_t uart_getc(void)
    {
    while (!(UCSR0A & (1<<RXC0))) 
    ;
    return UDR0; 
    }
     
    void uart_gets( char* Buffer, uint8_t MaxLen )
    {
    uint8_t NextChar;
    uint8_t StringLen = 0;
     
    NextChar = uart_getc(); 
     
     
    while (1) 
        {
    while( NextChar != ',' && StringLen < MaxLen - 1 ) 
            {
        UDR0=NextChar+1;
        PORTB=NextChar;
        *Buffer++ = NextChar;
    StringLen++;
    NextChar = uart_getc();
         }
        }
     
    *Buffer = '\0';
    }
     
    int main(void)
    {
        DDRB=0xFF;
    char Line[40]; // String mit maximal 39 zeichen
     
         uint8_t c;
         uart_init();
     
         uart_gets( Line, sizeof( Line ) );
     
    while (1) 
    {
     
    }
     
    return 0; // never reached 
    }
    #endif // UART_H
    Geändert von PicNick (23.03.2011 um 13:09 Uhr)

  2. #2
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    (RXCIE0<<1);

    scheint mir verdreht.

    sizeof( Line )

    wird nicht klappen. verwende einfach die Zahl 40 .

    oder besser:
    Code:
    #define  MAXLEN  40
     
    char line [MAXLEN]
     
         uart_gets(Line, MAXLEN) ;
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    und hier:
    void uart_gets( char* Buffer, uint8_t MaxLen )
    soll es so bleiben oder auch ändern

  4. #4
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    nein, das kannst du lassen, wie's is
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    da zeigt er einen Fehler:
    ../TST_22.c:64: error: expected ';', ',' or ')' before numeric constant

  6. #6
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Ahja, das ist, weil die definierte konstante auch "maxlen" heisst (mein fehler).
    ändere einfach die konstante

    #define MAX_LEN 40

    char line [MAX_LEN]

    uart_gets(Line, MAX_LEN) ;
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    23.03.2011
    Beiträge
    51
    das hat auch nicht funktiniert, wenn ich zum Beispiel 123456789 sende, der empfängt nur die 2 erste Zahlen 1 und 2 und der letzte 9, aber dazwischen zeigt er nicht

  8. #8
    Erfahrener Benutzer Roboter Experte Avatar von sternst
    Registriert seit
    07.07.2008
    Beiträge
    672
    Zitat Zitat von PicNick Beitrag anzeigen
    sizeof( Line )

    wird nicht klappen. verwende einfach die Zahl 40 .
    Doch, würde es. sizeof(Line) ist 40.

    Zitat Zitat von amal
    das hat auch nicht funktiniert, wenn ich zum Beispiel 123456789 sende, der empfängt nur die 2 erste Zahlen 1 und 2 und der letzte 9, aber dazwischen zeigt er nicht
    Vermutlich hast du laufend Soft-Resets. Lass das mit dem RXCIE0 weg (egal ob inzwischen korrigiert, oder nicht). Du arbeitest hier doch gar nicht mit Interrupts.

    Übrigens: was hat denn die Endlosschleife in uart_gets da zu suchen?
    MfG
    Stefan

Berechtigungen

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

Solar Speicher und Akkus Tests