Forum: Mikrocontroller und Digitale Elektronik Uart empfangsprobleme


von Felix (Gast)


Lesenswert?

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
1
char line[40];

an PortB Pin5 ist eine LED angehängt. Diese bleibt am leuchten.

von Gerald K. (geku)


Lesenswert?

Felix schrieb:
> while ( !(UCSR0A & (1<<RXC0)) )  ;

Wenn kein preemtives  Betriebssystem verwendet wird und kein Zeichen 
empfangen wird, dann friert der Prozessor in der Schleife while ( 
!(UCSR0A & (1<<RXC0)) )   ein.

Ich würde zur Bestätigung in dieser While Schleife einen Portpin toggeln 
lassen.

von jo mei (Gast)


Lesenswert?

Felix schrieb:
> Vielleicht seht ihr, was falsch ist?

Erst wenn du dein komplettes Programm zeigst das nicht funktioniert.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.