UART Empfang

Gast #3337597
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 ?
Gast #3337604
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.
#3337642
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren