PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [gelöst] Sharp Develop VB-Wert aus Textbox in Byte umwandeln



Barthimaeus
14.12.2007, 15:46
Leider bin ich unfähig eine passende Rubrik zu finden, deswegen stelle ich miene Frage jetzt hier. Ich habe mir mit SharpDevelop VB ein kleines Terminalprogramm geschrieben, das in einer Textbox ankommende Daten von der RS232 Schnittstelle ausgibt und einer zweiten Textbox, deren Inhalt über RS232 an AVR geschickt wird. Das empfangen klappt wunderbar und vollkommen verlustfrei. Nur das verschicken der Daten noch nicht. Ich vermute, dass es daran liegt, dass man den Inhalt der Textbox sich standartmäßig in einer String Variable befindet. Deswegen wollte ich mir mit der val() Funktion abhilfe verschaffen. Nur leider scheint er nur das erste Zeichen in der Textbox zu übertragen
->wenn ich 24 schicke meldet mir mein AVR eine 2 zurück, ist es 114 bekomme ich eine 1, usw.

Das Programm auf dem Mikrocontroller (ATTINY13) schickt lediglich den von der RS323 Schnittstelle empfangenen Wert unverändert zurück.

Der fürs verschicken zuständige Code im Terminalprogramm sieht so aus:


Sub Button2Click(ByVal sender As Object, ByVal e As EventArgs)
serialport1.WriteLine(val(textbox2.Text))
End Sub


Der Code auf dem AVR sieht so aus:


$hwstack = 22
$regfile = "attiny13.dat"
$crystal = 9600000
Baud = 9600

Open "comb.1:9600,8,n,1,INVERTED" For Output As #1
Open "comb.2:9600,8,n,1,INVERTED" For Input As #2

Dim Num As Byte

Do
Get #2 , Num
Put #1 , Num
Wait 1

Loop

End


Vielen herzlichen dank schon im Vorraus und ich hoffe, dass mir niemand die falsche Rubrik all-zu böse nimmt :Weihnacht

BastelWastel
14.12.2007, 18:34
val() sagt mir spontan nichts.
Aber hast du mal versucht deinen String in einzelne Zeichen zu splitten und an val() zu übergeben?

So Richtung.. serialport1.WriteLine(val(erstes Zeichen) & val(zweites Zeichen) & val(drittes Zeichen) & .......)

Wär mal so'n Schuß ins Blaue von mir

Barthimaeus
14.12.2007, 19:00
ok, ich denke ich hab das Problem gefunden. Wenn ich sage serialport1.WriteLine(textbox2.Text) und sich in textbox2.text eine 2stellige Zahl befindet so betrachtet VB jede Stelle als ein eigenes Byte. Mein AVR empfängt allerdings nur ein Byte und nicht 2. Konvertiere ich mittels val() den Inhalt eines Strings in eine Zahl, so konvertiert er sie in eine Integervariable. Diese benötigt allerdings auch zwei Bytes. Man kann es drehen und wenden wie man will, aber der Datenverlust ist vorprogrammiert. Nur leider fehlt mir noch die Lösung...

Aber auch das war nicht das Problem. Das Problem liegt darin, dass die writeline() Funktion nur Strings annimmt, beim verschicken also die ASCII Codes verschickt. Wenn man also serialport1.writeline(1) ausführt so empfängt der AVR nicht 1 sondern den ASCII code von 1 -> 49. Aus meinen Programmieranfängen mir Free/QBasic kannte ich zum Glück aber noch die CHR Funktion, mit der man einen ASCII Code in sein zugeordnetes Zeichen umwandeln kann. Somit kann man mit
serialport.writeline(CHR(X)) jede beliebige Zahl übertragen, ohne immer auf die ASCII Tabelle schauen zu müssen.