Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere Daten über UART senden
Hallo,
ich will verschiede Werte die, die Variablen in meinem Bascomprogramm enthalten über die serielle Schnittstelle senden. Wenn ich z.B schreibe :Print temperatur1
und dann Print temperatur2, dann werden diese Werte zwar gesendet aber mein Visual Basic-Programm kann die Werte ja nicht zuordnen. Wie kann ich die senden, damit ich die im Empfangsprogramm richtig zuordnen kann?
Ich hoff ihr habt mich verstanden(;
GRuß Max
also ich hab dich leider nicht verstanden... sry aber könntest du das nochmal erklären?
king-sixXx
26.05.2005, 17:51
Also wenn ich das richtig verstanden hab, sendet dein Controller ständig Themperaturwerte und dein VB Programm weiß nicht, was welche Temperatur ist?
Versuch mal folgendes:
Du hast die zwei Temperaturen (als Beispiel):
Temp1 = 023
Temp2 = 065
Beide Variablen in eine Variable packen:
Temp = 023065
diese Variable dann senden und in VB diese Variable dann wieder in zwei zerlegen...
Hi,
Beide Variablen in eine Variable packen:
So würde ich es auch machen. Allerdings als Text.
Ist aber eine "macke" von mir, alles mit Text zu senden.
Dauert halt länger als direkt ein Byte zu übertragen.
Aber wenn man ASCII sendet, kann man sich das schön im Hyperterminal angucken ;)
Ich setze immer ein oder zwei Starbytes vorne dran um den Anfang besser erkennen zu können.
In VB kann man den String wieder bequem mit dem MID Befehl auseinanderkriegen
$crystal = 8000000
Baud = 9600
Dim Temperatur1 as integer
Dim Temperatur2 as integer
Dim Temp1 as String*3
Dim Temp2 as String*3
Dim Temperatur As String * 7
Dim Startbyte As String * 1
Startbyte = "T"
Do
Gosub Messe_temperaturen
Gosub Umwandeln
Gosub Senden
Loop
End
Senden:
Temperatur = Startbyte + Temp1 + Temp2
Print Temperatur
Return
Umwandeln:
Temp1 = Str(temperatur1)
Temp2 = Str(temperatur2)
Temp1 = Format(temp1 , "000")
Temp2 = Format(temp2 , "000")
Return
messe_temperaturen:
Temperatur1 = 88 'Beispielwert
Temperatur2 = 124 'Beispielwert
'*
'*
'*
return
Gruß
Christopher
bertl100
26.05.2005, 19:36
Also ich mach das anders.
Ich schreibe meine Werte in ein Array und sende es ohne Returnzeichen und mit darauffolgenden definierten Zeichen "|" zusammenhängend in ein VB programm, welches dann das dieses definierte Zeichen als stopbit erkennt und dann die Trennung der Kette durchführen kann und weiterverarbeitet.
king-sixXx
26.05.2005, 19:41
Hi bertl100!
Mit einem Array is es natürlich viel eleganter, besonders wenn man mehrere Werte mit veränderlichen Längen übergeben möchte...
Wenn ihr transparente Daten (binär) übertragt, habt ihr irgendwann das Problemm, daß jedes Trennzeichen auch Teil der Daten sein kann, und dann scheppert's.
Das Argument für ASCII ( str(val) ) ist gut, nimm als Trennzeichen der beiden Werte ein Semikolon ( ; ) dann kannst du das Zeugs auch als CSV - Datei ins Excel importieren und ev. aufbereiten.
Wieso nicht mal ein Standard ?
Wert1 ; Wert2 <CRLF>
...
Wenn ihr transparente Daten (binär) übertragt, habt ihr irgendwann das Problemm, daß jedes Trennzeichen auch Teil der Daten sein kann, und dann scheppert's.
Das war einer der Gründe, warum ich am Anfang auf ASCII gesetzt habe und dann dabei geblieben bin.
Der wichtigste Vorteil für mich ist, mal schnell in die Daten per Terminal "reingucken" zu können.
So kann man problemlos ohne Spezielles Empfangsprogramm Fehler erkennen.
Und mit einem "LCD Sendestring" geht das auch bequem auf's LCD. :D
nimm als Trennzeichen der beiden Werte ein Semikolon ( ; ) dann kannst du das Zeugs auch als CSV - Datei ins Excel importieren und ev. aufbereiten.
Das ist doch 'ne gute Idee. Insbesondere für Messwerte ist sowas doch praktisch.
Ich sende übrigens immer HEX-ASCII, also 00-FF
Spart mir ein Byte ;)
Gruß
Christopher
Das war einer der Gründe, warum ich am Anfang auf ASCII gesetzt habe und dann dabei geblieben bin.
Immer empfehlenswert beim Datenaustausch versch. Plattformen.
Die Conversion str(val) ist halt für den Controller mühsam, da ist die Hex-Version ein möglicher Kompromiss. Nur muß halt dann die Reihenfolge
Intel-Order (LSB first) oder Networkorder/Motorola (Msb first) beachtet werden.
BasCom läßt, glaub' ich, auch Base64 zu.
Meissner
27.05.2005, 11:20
Hallo Max,
das Problemm kann Du auch so lösen:
Mache dir einen Übertragungsprotokoll:
z.B. Sensornummer + Wert + Checksumme
Nun kannst Du die Werte wie gewohnt nacheinander schicken.
Wenn Du sie dann im Recher empfängst, dann überprüft du zuerst die Checksumme. Wenn diese stimmt dann tust mit Mid() Funktion dein Wert herauslesen. Wenn Du dann die Sensornummer liest, dann weist Du genau welcher Sensor es war.
Kleiner Tip:
Jenachdem weiviel Daten anfallen und wie groß diese sind, kann Du die Sachen etwas komprimieren. Damit verringest Du die übertragungsfehler, da Du weniger Sendest. Das dürfte für die Funkübertragung interressant sein.
Wenn Du weniger als 255 Sensoren hast, kannt anstatt der Nummer einfach eine Buchstabe angeben deren Nummer diese Entspricht z.B. für 65 = A. Wenn der Messwertbereich auch 255 nicht übersteigt kann genauso verfahren werden. Wenn diese Übersteigt kannt dann noch eine Buchstabe dazuadieren.
Der Vorteil im Protokoll:
Für z.b. Sensor 61 und temperatur 38,5 Grad
Kann gesendet werden: a + w + checksumme
Also wurde das Protokoll mit genauer Zuordnung und einem Kommawert nur aus 3 Buchstaben sich zusammensetzen.
Die Temperatur muß dann umgerechent werden:
Bsp: Messbereich von 0 - 80 Grad Einzelschritte 0,5 Grad
ergibt: Differen von 80 Grad ist 160 Einteilungen
Gemessene Temperatur w=77 entspricht 77/2 = 38,5 Grad
Ich glaube das dürfte für dein Problemm ausreichend sein.
Gruß
Marius Meissner
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.