PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wer versteht diesen Code?



sebriko
27.02.2008, 23:03
Guten Abend,

ich möchte gerne über eine serielle Schnittstelle Daten senden und habe gehört, dass das mit dem folgenden Bascom-Code gehen soll. Ich verstehe ihn aber nicht ganz. Kann mir jemand erklären, was z.B. die Funktion inkey() genau macht?

Die Variable Z1 ist als String definiert mit der Länge 1.



Sub Senden(was As String * 100)
While Z1 <> "A"
Print Was ; Chr(13)
Waitms 5
Z1 = Inkey()
Wend
Z1 = Inkey()
Z1 = Inkey()
Z1 = Inkey()
Z1 = ""
End Sub


Gruß

Sebastian

bastian07
27.02.2008, 23:54
Abend,
hast du mal in die Bascom Hilfe geschaut?
Da steht das recht gut beschrieben drin.
Willst du dem Atmel nur was senden oder Informationen hin und her schicken?

Also zum senden vom Atmel weg is der standartbefehl Print "tralala" der aber recht viele Resourcen benötigt.
Und zum empfangen gibt es zich verschiedene möglichkeiten.
Ich benutze entweder die möglichkeit über den Interrupt:


On Urxc Onrxd 'Interrupt Empfange String von RXD
Enable Urxc

Enable Interrupts 'Interrupts Global einschalten

Dim S As Byte 'eben das Byte welches empfangen wird

Onrxd: 'isr wenn daten über die serielle schnitstelle kommen
S = Udr
Return

Wobei dann in der Variablen S das Byte steht was er gerade empfangen hat. Oder die andere Variante:


dim B as byte
If Ucsra.rxc = 1 Then 'wenn byte vollständig eingelesen
B = Udr 'Byte aus der UART auslesen
End If


Bei der ersten Methode wir halt nur was gemacht wenn auch tatsächlich Daten ankommen und das Programm wird unterbrochen und bei der zweiten Methode wir halt dauernd abgefragt ob was da is und wenn was da ist dann wird ausgelesen (Pollen)

Gruß Bastian 07

sebriko
28.02.2008, 02:19
Danke für den Beitrag.

Eigentlich möchte ich von Bascom auf eine andere Sprache umsteigen, entweder auf Basic oder C. Bei dem gezeigten Code weiß ich, dass er funktioniert hat, jedenfalls auf meinem alten Atmega32. Daher würde ich ihn schon ganz gerne wieder verwenden. Aber dazu müsste ich ihn unbedingt verstehen.

Bisher verstehe ich nur soviel:

Die este Schleife wird so lange durchlaufen, wie Z1 ungleich "A" ist. In dieser Schleife wird über den Befehl Print eine Variable "Was" gesendet. Das "A" wird irgendwann von inkey() zurückgeliefert.
Liefert inkey() ein "A" zurück, wird 3 mal die Anweisung Z1 = inkey() aufgerufen und danach die Varaible Z1 wieder geleert.

Ich habe aber keine Ahnung, was hier hardwaremäßig vor sich geht.

Sebastian

T.J.
28.02.2008, 08:00
Wie soll man dir denn erklären was die Funktion Inkey() macht, wenn du sie nicht postest?

TobiasBlome
28.02.2008, 17:25
also soweit ich weiß schreibt die Inkeyfunktion das ASCII Zeichen, welches von der seriellen Schnittstelle empfangen wurde in die Variable Z1 (in deinem Fall)

PicNick
28.02.2008, 19:22
Sebriko hat den Code absolut korrekt durchschaut.
Der Sinn von den 3 zusätzlichen Inkey ist aus dem Code heraus nicht ersichtlich,
Wahrscheinlich schickt der Partner in Wirklichkeit den text "ACK" zurück.
Es sollen also nur die Zeichen nach dem "A" gekübelt werden.

"INKEY" schaut nach, ob ein Zeichen empfangen wurde, wartet aber NICHT.
is nix da, wird "0x00"=&H00=d'0' zurückgegeben (nach "Z1", das hat tobias ja auch schon gesagt.

remark:
mit der Uart senden kann man, wenn man erst vorne
$BAUD=9600 (oder sowas) sagt (das initialisiert das Zeugs)

Im Code dann einfach

PRINT "wtltbrnft" (mit Zeilenvorschub <CR><LF>) oder
PRINT "wtltbrnft" ; ohne