also ich hab dich leider nicht verstanden... sry aber könntest du das nochmal erklären?
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?
Linus Torvalds, Entwickler von LinuxIch will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
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,
So würde ich es auch machen. Allerdings als Text.Beide Variablen in eine Variable packen:
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
GrußCode:$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
Christopher
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.
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>
...
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
Das war einer der Gründe, warum ich am Anfang auf ASCII gesetzt habe und dann dabei geblieben bin.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.
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.
Das ist doch 'ne gute Idee. Insbesondere für Messwerte ist sowas doch praktisch.nimm als Trennzeichen der beiden Werte ein Semikolon ( ; ) dann kannst du das Zeugs auch als CSV - Datei ins Excel importieren und ev. aufbereiten.
Ich sende übrigens immer HEX-ASCII, also 00-FF
Spart mir ein Byte![]()
Gruß
Christopher
Immer empfehlenswert beim Datenaustausch versch. Plattformen.Zitat von chr-mt
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.
mfg robert
Wer glaubt zu wissen, muß wissen, er glaubt.
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
Lesezeichen