Forum: Mikrocontroller und Digitale Elektronik UART Fehlfunktion


von Jonas E. (jonas_e43)


Lesenswert?

Hallo zusammen,

Mit folgenden Funktionen sende ich Strings über UART. Nach dem ~50-150 
Mal hängt sich der gesamte Controller auf, bis weitere Daten kommen. 
Könnte dies an den Funktionen liegen?

Empfangen:
1
uint8_t UART_getc(void)
2
{
3
  while (!(UCSRA & (1<<RXC)))   // warten bis Zeichen verfuegbar
4
  ;
5
  return UDR;                   // Zeichen aus UDR an Aufrufer zurueckgeben
6
}
7
8
uint8_t UART_gets(char* buffer, uint8_t maxLength)
9
{
10
  uint8_t index = 0;
11
  
12
  while ( ( buffer[index] = UART_getc() ) != '\0' && index < maxLength )
13
  {
14
    index++;
15
  }
16
  buffer[index] = '\0';
17
  
18
  // bytes read
19
  return index;
20
}
Senden:
1
void UART_putchar(char z)          // Zeichen in UART Ausgang geben
2
{
3
  while ( !(UCSRA & (1<<UDRE)) )        // Warte bis UART Ausgang frei
4
      ;
5
  UDR = z;
6
}
7
  
8
void UART_puts(char *s)            // Zeichenkette (String) in UART Ausgang geben
9
{
10
  while ( *s )
11
  {
12
    UART_putchar(*s);
13
    s++;
14
  }
15
  UART_putchar('\0');
16
}

Vielen Dank im Vorraus

Gruß Jonas

von Karlheinz (Gast)


Lesenswert?

Hallo,

mit
> while ( ( buffer[index] = UART_getc() ) != '\0' && index < maxLength )
>   {
>     index++;
>   }

kann index den Wert von maxLength erreichen und das abschliessende

>   buffer[index] = '\0';

schreibt dann ein Byte über Buffer ... hinaus ins RAM

von Jonas E. (jonas_e43)


Lesenswert?

Danke für die Antwort. Habe das jetzt mal so übernommen:
1
uint8_t UART_gets(char* buffer, uint8_t maxLength)
2
{
3
  uint8_t index = 0;
4
  
5
  while ( index < maxLength && ( buffer[index] = UART_getc() ) != '\0' )
6
  {
7
    index++;
8
  }
9
  if ( index < maxLength )
10
  buffer[index] = '\0';
11
  else
12
  buffer[maxLength - 1] = '\0';
13
  
14
  // bytes read
15
  return index;
16
}
Leider hilft das nichts.
Vielleicht fällt euch ja noch was ein :)
Gruß Jonas

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.