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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.