Forum: Compiler & IDEs Endzeichen wird nicht erkannt


von Peter (Gast)


Lesenswert?

Hallo

hab das problem das mein Endzeichen nicht erkannt wird.

ISR(USART_RXC_vect)
{
  static uint8_t str_count=0;
  unsigned char nextChar;
  nextChar = UDR;

   if (uart_string[str_count]=='\n')
        {
       uart_string[str_count] = nextChar;
             str_count++;
  }
  else
  {
      uart_string[str_count] =nextChar;
      str_count=0;
  }
}

Jemand ne Idee? Beim Microcontroller handelt es sich um einen Atmega8.

: Verschoben durch User
von Peter II (Gast)


Lesenswert?

Peter schrieb:
> hab das problem das mein Endzeichen nicht erkannt wird.

und welchen endzeichen schickt du, \r oder \n?

von Peter II (Gast)


Lesenswert?

Wi soll das überhaupt gehen?

Du vergleichst ja immer mit dem zukünfigten wert, dieser ist ja nicht 
mal geschrieben.

 if (nextChar=='\n') {
    uart_string[str_count] = nextChar;
    str_count++;
 }else{
    uart_string[str_count] =nextChar;
    str_count=0;
  }

von Peter (Gast)


Lesenswert?

Sorry war der falsche Quelltext hab natürlich den nextchar verglichen. 
Habe gerade Probiert über Hterm zu schicken. ISR(USART_RXC_vect)
{
  static uint8_t str_count=0;
  unsigned char nextChar;
  nextChar = UDR;

   if (nextChar=='\r\n')
  {
    uart_string[str_count] = nextChar;
    str_count++;
  }
  else
  {
    uart_string[str_count] = nextChar;
    str_count=0;
    senden=1;
  }
}

Wenn der das Endzeichen Empfängt soll das programm mir den uart_string 
schicken was im Hauptprogramm passiert. Bekomme aber nur Datenmüll 
geschickt egal ob auf 9600 Baud oder 19200.
Wenn ich als String "1234" schicke bekomme ich immer nur Stücke zurück
4\n
2\n
4\n
2\r\n

Jemand ne Erklärung?

von Peter II (Gast)


Lesenswert?

if (nextChar=='\r\n')

glaubst du wirklich das es du schaffst zweich zeichen in ein zeichen zu 
bekommen? Und welcher compiler nimmt solchen code überhaupt an?

Deien Baudrate wird nicht stimmen, warum auch immer.

von Stefan E. (sternst)


Lesenswert?

Neben dem '\r\n' zwei weitere Problem:

1) Die Logik des if ist verkehrt herum.
2) Null-Terminierung fehlt.

von Peter (Gast)


Lesenswert?

Also hab folgendes probiert.

if (nextChar=='\n') ging nicht. hat er mir auch müll gesendet.
wenn ich aber putChar("Test"); sende macht er es ohne probleme. 
scheinbar hat er probleme beim empfangen. Hab ein 3686400 Quarz und 
UBRRL  = 23; bei 9600 Baud eingestellt. Das muss auch alles passen.

von Peter (Gast)


Lesenswert?

Beispiel Ich schicke 2 mal "test" mit LF ans newline zeichen

bekomme zurück

e\n
st\n
t\n

von Peter II (Gast)


Lesenswert?

dann zeigt uns doch bitte mal den echten code, also der auch compiliert 
wird.

von Peter (Gast)


Lesenswert?

ISR(USART_RXC_vect)
{
  static uint8_t str_count=0;
  unsigned char nextChar;
  nextChar = UDR;

   if (nextChar=='\n')
  {
    uart_string[str_count] = nextChar;
    str_count++;
  }
  else
  {
    uart_string[str_count] = nextChar;
    str_count=0;
    senden=1;
  }
}

und im main

if(senden)
{
  putChar(uart_string);
  senden=0;
}

  UCSRB |= (1<<RXEN)  | (1<<TXEN)  | (1<<RXCIE);
// UART TX und RX Interrupt einschalten
  UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0);
// Asynchron 8N1 (8Bits, Parity none; 1 Stopbit)
  UBRRL  = 23;
// entspricht 9600 Baud bei 3,686400Mhz

so das dürfte alles sein.

von Stefan E. (sternst)


Lesenswert?

Mein Post von oben hat immer noch Gültigkeit.

von Peter (Gast)


Lesenswert?

Stefan Ernst schrieb:
> 2) Null-Terminierung fehlt.

Bombe schonmal danke für die Antwort hab jetzt erst verstanden was du 
gemeint hast. Hab jetzt
if (nextChar!='\n')
benutzt. aber was meinst du mit Null-Terminierung?

von Peter (Gast)


Lesenswert?

So hat sich alles erledigt. Funktionier jetzt alles bestens. Vielen dank 
für die Hilfe.

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.