Daten über COM-DSchnittstelle einlesen

  • VB6

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von Unknown.

    Daten über COM-DSchnittstelle einlesen

    Hallo,

    ich bin VB (Version 5)-Hobbynutzer und mache die statistische Auswertung der Daten meiner Wetterstation mit einem kleinen, selbst geschriebenen Programm.
    Dazu übertrage ich mittels des Programms die Daten aus einer von der Wetterstationssoftware angelegten Dat-Datei in eine Excel-Datei und es werden die gewünschten Auswertungen ausgeführt.

    Die Wetterstation überträgt alle 10 Sekunden einen Datenblock via COM-Schnittstelle an den PC.

    In der *.dat Datei wird der Datenblock in einer Zeile wie folgt abgelegt:
    04:15:00 0,0 0,0 0,0 110 108 111 5,1 5,0 5,1 97 97 97 5,0 5,0 5,0 1014,0 1014,0 1014,0 19,6 19,6 19,6 46 46 46 0,0 5,0 5,0 5,0

    (Uhrzeit MaxTemperatur MinTemperatur MittelwertTemperatur MaxLuftdruck MinLuftdruck usw. / immer mit Leerzeichen getrennte Werte)

    Ich möchte die Daten gerne direkt mit einem VB-Programm einlesen.
    Das gelingt mir aber nur bedingt.

    Folgende Befehlsfolge liest mir scheinbar den ganzen Datenblock in einem für mich nicht auswertbaren Format ein.

    Sub Einlesen()
    Dim Instring As String
    MSComm1.CommPort = 1
    MSComm1.InputMode = comInputModeBinary
    MSComm1.Settings = "9600,N,8,1"
    MSComm1.InputLen = 0
    MSComm1.PortOpen = True
    Do
    DoEvents
    Loop Until MSComm1.InBufferCount >= 180
    Instring = MSComm1.Input
    Eingabezelle = Instring
    lblEmpfang.Caption = Eingabezelle
    MSComm1.PortOpen = False
    End Sub

    Bei InputMode: MSComm1.InputMode = comInputModeBinary
    erhalte ich:
    ? ???%?????? ???:???????????????????????????c?8???C??=??Â????? ?
    und bei InputMode: MSComm1.InputMode = comInputModeText
    Ï 0% p ‡1%%

    Wie kann ich den Datenblock richtig zerlegen bzw. ein sinnvolles Format erhalten?

    Für einen Tipp wäre ich sehrdankbar

    Volker Kunz


    Kannst du einen Block posten wie er von der Wetterstation
    geschickt wird und dann den Block den du über MScomm
    erhälst ? Ich kann da so auch schwer was erkennen.
    Wolltest du eigentlich Excel aus dem Spiel lassen oder
    sollte die Wetterstationssoftware nicht mehr verwendet
    werden ? Denn ansonsten könntest du einfach die
    Daten die die Wetterstationssoftware in der dat Datei
    anlegt auslesen.
    Hallo Trippel As,

    Danke für die schnelle Antwort.

    ich kenne das Format der Daten, welche von der Wettertsation kommen leider nicht.

    Mein Ziel ist es die Weterstationssoftware zu umgehen, da ich die graphischen Darstellungen der Messwerte für meine Homepage nutzen möchte.

    Nach genauer Überlegung bin ich auch der Meinung, daß die Station nur "normale" Werte überträgt. Das ablegen der Datenblöcke (mit Max, Min usw.) und die Festlegung des Speicherintervalls (1 bis 15 Minuten) wird ja in der Software festgelegt. Dami kommt wahrscheinlich auch die Uhrzeit nicht aus der Station sondern vom PC.

    Kann mann die empfangenen Daten Bit- oder Byte-weise anzeigen? Da könnte man evtl, Rückschlüsse auf das Format ziehen??

    Gruß Volker
    Kann mann die empfangenen Daten Bit- oder Byte-weise anzeigen? Da könnte man evtl, Rückschlüsse auf das Format ziehen??


    Du kannst den Zeichencode mittels Asc() ermitteln,
    oder einfach den zurückgegebenen Text einem
    Byte-Array zuweisen, allerdings wird dann aufgrund
    der internen Unicode Formatierung von Visual Basic
    jedes Zeichen ein abschließendes Chr$(0) haben.
    Mit ASC(Eingabezelle) erhalte ich eine Zahl. Allerdings nur die erste des Strings (sagt mein VB-Buch)
    Könnte mann den Sting in die einzelnen Zahlen zerlegen hätte ich gewonnen.

    Kann mann die Daten durch Löschen des jeweils gelesenen Zeichens schrittweise lesen??

    Wäre das mit der ARRAY-Funktion möglich. Wenn ja wie??

    Danke für die Hilfe

    Volker

    Mit ASC(Eingabezelle) erhalte ich eine Zahl. Allerdings nur die erste des Strings (sagt mein VB-Buch)
    Könnte mann den Sting in die einzelnen Zahlen zerlegen hätte ich gewonnen.

    Kann mann die Daten durch Löschen des jeweils gelesenen Zeichens schrittweise lesen??


    In der Tat gibt Asc nur das erste Zeichen eines Strings
    zurück, du musst allerdings keine Zeichen löschen du
    kannst die Zeichen entweder einem Byte Array zuweisen,
    und dann in einer Schleife durchlaufen,
    dann hat jeder 2. Eintrag im Byte-Array allerdings den
    Wert 0 (wie im letzten Post schon erwähnt wegen
    der Unicode Formatierung) was eine doppelte
    ausführzeit in der Schleife bedeuten würde.
    Deshalb würd ich den effizienteren Weg nehmen und
    jedes zurückgegebene Zeichen mit Asc() prüfen.
    Um (ein) einzelne(s) Zeichen aus einem String auszulesen
    gibt es die Funktion Mid. Dem 1. Parameter gibst du
    den String über, aus dem du (ein) Zeichen auslesen willst,
    der 2. Parameter bestimmt ab der wievielten stelle
    ausgelsen werden soll, bedenke das der String bei
    Mid bei der Position 1 anfängt, und der 3., optionale,
    Parameter bestimmt wieviele Zeichen zurückgegeben
    werden sollen. Die Mid Funktion gibt dann einen String
    zurück der diese Zeichenfolge enthält.

    Da du jedes Zeichen einzeln überprüfen willst, läufst
    du, wie oben erwähnt, jedes einzelne Zeichen in
    einer Schleife durch, dir ist die Länge des zurückgegebenen
    Strings bekannt und du willst immer 1 Zeichen auslesen
    also benutzt du eine For schleife die von 1 bis der
    Länge des Strings geht:


    Dim i as Integer

    For i = 1 to Len(MSComm.Input) 'Oder der String
    'der die zurückgegebenen Zeichen enthält

    MsgBox "Zeichencode: " & Asc(Mid(MSComm.Input, i))
    'Ich würd das mit irgendeiner TextBox ersetzen, da das
    'sonst ziemlich nervig ist
    Next i