www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Wer kann mir diesen Basic-Code erklären?


Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Abend,

um mit einem C-Control-Board über ein Terminalprogramm vom PC aus über 
eine serielle Schnittstelle zu kommunizieren, gibt es folgenden 
Demo-Code, bei dem ich nicht verstehe, welches Prinzip hier 
zugrundliegt. Was ich am wenigsten verstehe, ist, warum hier mit einem 
Buffer gearbeitet wird.
Wäre nett, wenn mir jemand den Code erläutern könnte.
    Do While True
        For i=0 To 13
            Serial_Write(0,Text2(i))    ' Ausgabe Terminal: Text eingeben:
        Next
        Do While c<>CR
            c=Serial_Read(0)            ' Zeichen lesen
            Serial_Write(0,c)           ' Zeichen ausgeben
            Buffer(Buf_Index)=c         ' Zeichen im Buffer speichern
            Buf_Index= Buf_Index+1
            If Buf_Index=Limit Then     ' wenn Buffer voll, alle Zeichen ausgeben
                c=CR
                Buffer(Buf_Index)=c
                Serial_Write(0,CR)      ' neue Zeile über die RS232 Schnittstelle gesendet
                Buf_Index= Buf_Index+1
            End If
        End While
        c=0                             ' CR >> alle Zeichen ausgeben
        Serial_Write(0,LF)
        For n=0 To Buf_Index-1
            Serial_Write(0,Buffer(n))   ' Bufferinhalt ausgeben
        Next
        Serial_Write(0,LF)              ' Zeilenvorschub über die RS232 Schnittstelle gesendet
        Buf_Index=0
    End While

Autor: Otto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Programm gibt alle Zeichen direkt aus, sammelt aber zusätzlich alle 
eingegebenen Zeichen, bis "CR" erkannt wird oder das Ende des Buffers 
erreicht ist und gibt dann alle Zeichen aus.

Gruss Otto

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für den Beitrag. Ich frage mich ja, warum es überhaupt sinnvoll 
ist, die Zeichen in einem Buffer zwischenzuspeichern.
Im Grund könnte das Programm doch einfach folgendermaßen lauten:
Do While true
c=Serial_Read(0) 
Serial_Write(0,c)
End While

Der Effekt wäre doch genau derselbe, nur dass die Zeilenumbrüche nicht 
automatisch eingefügt werden, oder?

Gruß

Basti

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Basti wrote:
> Hi,
>
> danke für den Beitrag. Ich frage mich ja, warum es überhaupt sinnvoll
> ist, die Zeichen in einem Buffer zwischenzuspeichern.

Wenn am anderen Ende deines Programms ein menschlicher Benutzer
sitzt, dann wird er dir dafür dankbar sein, wenn er bei einem
Tippfehler mit Backspace das zuletzt getippte Zeichen löschen
kann.
Dazu müssen aber die Zeichen in einem Buffer zwischengespeichert
werden. Bei einem Backspace fliegt dann einfach das letzte Zeichen
aus dem Buffer wieder raus.
Und erst dann, wenn der Benutzer Return drückt, arbeitet das
Programm mit der kompletten Zeile aus dem Buffer weiter.

> Im Grund könnte das Programm doch einfach folgendermaßen lauten:
>
>
> Do While true
> c=Serial_Read(0)
> Serial_Write(0,c)
> End While
> 
>
> Der Effekt wäre doch genau derselbe, nur dass die Zeilenumbrüche nicht
> automatisch eingefügt werden, oder?

Das ist ja auch nur ein Beispiel. Kein reales Programm macht diese
Funktionalität. In der Realität wird ja dann auch mit dem Übertragenen
weitergearbeitet.

Bei Beispielen ist es oft so, dass eine bestimmte Technik (hier
das Sammeln von Zeichen in einem Buffer) gezeigt werden soll.
Die Sinnfrage in diesem konkreten Beispiel steht da oft im
Hintergerund. Es wäre viel zu viel Aufwand eine komplette
Command Line zu implementieren, nur weil man das Sammeln einer
kompletten Zeile demonstrieren möchte. Das würde außerdem von
der zu zeigenden Idee ablenken. Also wird das zu zeigende in
ein absolut minimalistisches Programm eingebettet, wodurch man
sich dann oft die Frage stellt: "Wozu benötige ich diese Technik
in diesem Zusammenhang". Wie gesagt: Das ist oft die falsche Frage.
Vor allem der Zusatz 'in diesem Zusammenhang' sollte nicht vorkommen.
Die Frage muß oft lauten: 'Wo könnte ich diese Technik einsetzen'
und oft ist es so, daß Beispiele diese Frage nicht direkt adressieren.

Autor: Basti (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke für den Beitrag. Der hat mir weitergeholfen. Ich hatte erst die 
Vermutung, dass der Code so umfangreich ist, weil dies in irgendeiner 
Weise mit dem RS232-Protokoll zu tun hat, oder weil man 
Übertragungsstörungen auffangen möchte. Es ist dann wohl eher die 
Absicht, ein benutzerfreundliches Programm zu schreiben, die den Code so 
umfangreich werden lässt und der Mini-Code, den ich gepostet habe, 
müsste es auch tun.

Herzlichst

Basti

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.