PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : mehrere Daten über UART senden



MAxK
26.05.2005, 17:08
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

x-ryder
26.05.2005, 17:15
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...

chr-mt
26.05.2005, 18:34
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...

PicNick
26.05.2005, 19:47
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>
...

chr-mt
26.05.2005, 21:58
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

PicNick
27.05.2005, 07:36
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