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


von Basti (Gast)


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.
1
    Do While True
2
        For i=0 To 13
3
            Serial_Write(0,Text2(i))    ' Ausgabe Terminal: Text eingeben:
4
        Next
5
        Do While c<>CR
6
            c=Serial_Read(0)            ' Zeichen lesen
7
            Serial_Write(0,c)           ' Zeichen ausgeben
8
            Buffer(Buf_Index)=c         ' Zeichen im Buffer speichern
9
            Buf_Index= Buf_Index+1
10
            If Buf_Index=Limit Then     ' wenn Buffer voll, alle Zeichen ausgeben
11
                c=CR
12
                Buffer(Buf_Index)=c
13
                Serial_Write(0,CR)      ' neue Zeile über die RS232 Schnittstelle gesendet
14
                Buf_Index= Buf_Index+1
15
            End If
16
        End While
17
        c=0                             ' CR >> alle Zeichen ausgeben
18
        Serial_Write(0,LF)
19
        For n=0 To Buf_Index-1
20
            Serial_Write(0,Buffer(n))   ' Bufferinhalt ausgeben
21
        Next
22
        Serial_Write(0,LF)              ' Zeilenvorschub über die RS232 Schnittstelle gesendet
23
        Buf_Index=0
24
    End While

von Otto (Gast)


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

von Basti (Gast)


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:
1
Do While true
2
c=Serial_Read(0) 
3
Serial_Write(0,c)
4
End While

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

Gruß

Basti

von Karl H. (kbuchegg)


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:
>
>
1
> Do While true
2
> c=Serial_Read(0)
3
> Serial_Write(0,c)
4
> End While
5
>
>
> 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.

von Basti (Gast)


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

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.