Forum: Mikrocontroller und Digitale Elektronik UART Empfang


von C++ newbies (Gast)


Lesenswert?

hallo Zusammen !
ich habe ein Verständnisfrage und zwar geht um folg. Codezeile in dem 
Beispiel von UART Tutorial
1
void uart_gets( char* Buffer, uint8_t MaxLen )
2
{
3
  uint8_t NextChar;
4
  uint8_t StringLen = 0;
5
 
6
  NextChar = uart_getc();         // Warte auf und empfange das nächste Zei
7
 
8
                                  // Sammle solange Zeichen, bis:
9
                                  // * entweder das String Ende Zeichen kam
10
                                  // * oder das aufnehmende Array voll ist
11
  while( NextChar != '\n' && StringLen < MaxLen - 1 ) 
12
{
13
    *Buffer++ = NextChar;
14
    StringLen++;
15
    NextChar = uart_getc();
16
  }
17
 
18
                                  // Noch ein '\0' anhängen um einen 
19
                                  // C-String daraus zu machen
20
  *Buffer = '\0';
21
}

--> while( NextChar != '\n' && StringLen < MaxLen - 1 )

Es soll aber heißen Entweder ... Oder...
Hier steht ein UND Operator && zwischen NextChar und StringLen.


Habe ich irgendwas verstanden oder oder war es nur Tipfehler ?

: Bearbeitet durch User
von Uwe Bonnes (Gast)


Lesenswert?

Ein neuerer GCC wird in der letzten Zeile fehlende Klammern bemängeln.

von Uwe (Gast)


Lesenswert?

> while( NextChar != '\n' && StringLen < MaxLen - 1 )
da steht
mach weiter solage
(nächstes Zeichen Nicht gleich '\n') UND (noch nicht maximale länge 
ereicht ist)
Also BEIDE Bedingen müssen erfüllt sein die eine eine und die Andere 
sonst hört er auf.

von Karl H. (kbuchegg)


Lesenswert?

1
                                  // Sammle solange Zeichen, bis:
2
                                  // * entweder das String Ende Zeichen kam
3
                                  // * oder das aufnehmende Array voll ist
4
  while( NextChar != '\n' && StringLen < MaxLen - 1 )

Der Kommentar beleuchtet das 'Geschehen' aus der abweisenden 
Perspektive. Was muss geschehen, unter welchen Bedingungen wird die 
Schleife abgebrochen?

Das while im Code funktioniert aber genau anders rum: Unter welcher 
Bedingung wird die while-Schleife ein weiteres mal durchlaufen?

D.h. du musst das, was im Kommentar steht negieren, weil ja von 
'abbrechen' auf 'fortsetzen' umgedacht werden muss.

Und da gilt dann De Morgan
1
  nicht( A Oder B )  <==>   ( nicht A ) und ( nicht B )

wenn du genau schaust, sind die Einzelaussagen dann auch tatsächlich das 
genaue Gegenteil:

aus 'entweder das String Ende Zeichen kam' wird 'NextChar != '\n'. Und 
das ist das genau Gegenteil.

aus 'das aufnehmende Array voll ist' wird 'StringLen < MaxLen - 1'. Was 
ebenfalls die genaue Gegenteilige Aussage darstellt.

Man hätte das ganze auch so schreiben können
1
   while( ! (NextChar == '\n' || StringLen >= MaxLen - 1 ) )

dann würde Code und Kommentar praktisch vollständig übereinstimmenm bis 
auf das ! da vorne, welches daraus resultiert, dass das while ja wissen 
will unter welchen Bedingungen es weiter machen soll, während im 
Kommentar steht unter welchen Bedingungen abgebrochen wird.

Nimmt man diese Version und wendet De Morgan an, dann landet man dann 
eben bei der Version, wie sie im Tutorial steht.

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.