Hallo,
ich habe ein Problem beim empfangen von UART nachrichten auf einem
Atmega328P.
Eigentlich habe ich alles so gemacht, wie es im Datenblatt steht. Doch
beim Empfangen bleibt mein Kontroller hängen. Vielleicht seht ihr, was
falsch ist?
1 | void uart_transmit( unsigned char data )
|
2 | {
|
3 | while(!(UCSR0A & (1<<UDRE0)));
|
4 | UDR0 = data;
|
5 | }
|
6 |
|
7 | void uart_sendString(char *StringPtr)
|
8 | {
|
9 | while(*StringPtr != 0x00)
|
10 | {
|
11 | uart_transmit(*StringPtr);
|
12 | StringPtr++;
|
13 | }
|
14 | }
|
15 |
|
16 | uint8_t uart_gets( char* Buffer, uint8_t MaxLen )
|
17 | {
|
18 | char NextChar;
|
19 | uint8_t StringLen = 0;
|
20 |
|
21 | NextChar = uart_getc(); // Warte auf und empfange das nächste Zeichen
|
22 |
|
23 | // Sammle solange Zeichen, bis:
|
24 | // * entweder das String Ende Zeichen kam
|
25 | // * oder das aufnehmende Array voll ist
|
26 | while( NextChar != '\n' && StringLen < MaxLen - 1 ) {
|
27 | *Buffer++ = NextChar;
|
28 | StringLen++;
|
29 | NextChar = uart_getc();
|
30 | }
|
31 |
|
32 | // Noch ein '\0' anhängen um einen Standard
|
33 | // C-String daraus zu machen
|
34 | *Buffer = '\0';
|
35 |
|
36 | return StringLen;
|
37 | }
|
38 |
|
39 |
|
40 | static unsigned char uart_getc( void )
|
41 | {
|
42 | // Wait for data to be received
|
43 | while ( !(UCSR0A & (1<<RXC0)) ) ;
|
44 | // Get and return received data from buffer
|
45 | return UDR0;
|
46 | }
|
Wie gesagt, das senden geht. In meiner while-schleife:
1 | if ( (UCSR0A & (1<<RXC0)) )
|
2 | {
|
3 |
|
4 | PORTB |= (1 << PINB5);
|
5 | uartReceiveLength = uart_gets( line, sizeof(line));
|
6 | uart_sendString(line);
|
7 | PORTB &= ~(1 << PINB5);
|
8 | }
|
line ist in der main definiert
an PortB Pin5 ist eine LED angehängt. Diese bleibt am leuchten.