- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 10

Thema: mehrere Daten über UART senden

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    12.06.2004
    Beiträge
    61

    mehrere Daten über UART senden

    Anzeige

    Powerstation Test
    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

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    01.03.2004
    Ort
    Bielefeld (JA, das gibt es!)
    Alter
    35
    Beiträge
    1.614
    also ich hab dich leider nicht verstanden... sry aber könntest du das nochmal erklären?
    Ich will Microsoft wirklich nicht zerstören. Das wird nur ein gänzlich unbeabsichtigter Nebeneffekt sein.
    Linus Torvalds, Entwickler von Linux

  3. #3
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.06.2004
    Alter
    42
    Beiträge
    232
    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...

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    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

    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
    Gruß
    Christopher

  5. #5
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    28.02.2005
    Ort
    Salzburg
    Alter
    43
    Beiträge
    464
    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.

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.06.2004
    Alter
    42
    Beiträge
    232
    Hi bertl100!
    Mit einem Array is es natürlich viel eleganter, besonders wenn man mehrere Werte mit veränderlichen Längen übergeben möchte...

  7. #7
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    11.04.2005
    Beiträge
    1.469
    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.
    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

  9. #9
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Zitat Zitat von chr-mt
    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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    03.06.2004
    Beiträge
    12
    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

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

LiFePO4 Speicher Test