PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : txt über USART senden



amal
23.03.2011, 13:17
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:


#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

PicNick
23.03.2011, 14:16
(RXCIE0<<1);

scheint mir verdreht.

sizeof( Line )

wird nicht klappen. verwende einfach die Zahl 40 .

oder besser:


#define MAXLEN 40

char line [MAXLEN]

uart_gets(Line, MAXLEN) ;

amal
23.03.2011, 14:59
und hier:
void uart_gets( char* Buffer, uint8_t MaxLen )
soll es so bleiben oder auch ändern

PicNick
23.03.2011, 15:03
nein, das kannst du lassen, wie's is

amal
23.03.2011, 15:08
da zeigt er einen Fehler:
../TST_22.c:64: error: expected ';', ',' or ')' before numeric constant

PicNick
23.03.2011, 15:48
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) ;

amal
23.03.2011, 16:48
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

sternst
23.03.2011, 18:51
sizeof( Line )

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


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?