Forum: Mikrocontroller und Digitale Elektronik Messdaten über USB direkt in Excel darstellen


von Rico H. (Firma: FHNW) (2she)


Lesenswert?

Guten Tag miteinander

Ich würde gerne wissen, wie ich meine Messdaten, welche über eine 
USB-Schnittstelle mit PuTTy problemlos dargestellt werden können, auch 
direkt in Excel augelistet werden können, d.h. nachwievor die neuen 
Werte in neue Zeilen gepusht werden könen?

Nach stundenlangem gegoogle bin ich immer wieder auf verschiedenste 
xls-files gestossen, wobei leider keines dabei gewesen ist, welches 
diese Aufgabe übernimmt. Im programmieren bin ich leider nicht der 
Beste, als dass ich es selbst coden könnte;)

An der USB Schnittstelle liegen folgende Daten an:

Sens1:,Sens2:,Sens3:,Sens4:,Sens5:,Sens6
13,14,13,14,14,11
13,13,12,13,14,12

Im Excel-Sheet sollte dann die Darstellung wiefolgt aussehen:

Sens1:|Sens2:|Sens3:|Sens4:|Sens5:|Sens6
______|______|______|______|______|_____
13    |14    |13    |14    |14    |11
______|______|______|______|______|_____
13    |13    |12    |13    |14    |12
______|______|______|______|______|_____

Schon im Vorraus besten Dank für Eure Hilfe!

von c-hater (Gast)


Lesenswert?

Rico H. schrieb:

> Ich würde gerne wissen, wie ich meine Messdaten, welche über eine
> USB-Schnittstelle mit PuTTy problemlos dargestellt werden können, auch
> direkt in Excel augelistet werden können, d.h. nachwievor die neuen
> Werte in neue Zeilen gepusht werden könen?

Indem du eine Bibliothek besorgst und installierst, die es Excel 
erlaubt, auf die serielle Schnittstelle zuzugreifen (von sich aus kann 
Excel das nicht) und ein VBA-Programm schreibst, was dann diese 
Bibliothek benutzt.

von Rico H. (Firma: FHNW) (2she)


Lesenswert?

c-hater schrieb:
> Indem du eine Bibliothek besorgst und installierst, die es Excel
> erlaubt, auf die serielle Schnittstelle zuzugreifen (von sich aus kann
> Excel das nicht) und ein VBA-Programm schreibst, was dann diese
> Bibliothek benutzt.

Du meinst sowas?:

Private Sub connect() 'Call this procedure to open the serial port
 '---------------Excel-specific part of code----------------
  Dim sh As Shape
  Dim Reader As StrokeReader 'Go to Tools->References and add the 
reference to StrokeReader ActiveX

  'This will insert the ActiveX into the current document
  Set sh = 
ActiveSheet.Shapes.AddOLEObject("STROKESCRIBE.StrokeReaderCtrl.1")

  Set Reader = sh.OLEFormat.Object.Object

'---------------Common code for Excel and Word----------------
'The shape name must match to CommEvent handler procedure name, see 
below
  sh.Name = "Reader"

  Reader.Port = 9 'Connect to COM9  ---  Please specify YOUR port number 
here
  Reader.Connected = True

  'Check the port is available
  If Reader.Error Then
    MsgBox Reader.ErrorDescription 'Or show the error description
    Exit Sub
  End If

  Reader.BaudRate = 9600 'Data transfer speed
  Reader.DataMode = Text 'Incoming data will be reported as a text 
string


  Reader.Send "123ABCD" 'How to transmit some data to serial port
  'Shorten pins 2 and 3 of the serial port connector to receive this 
data back
  'by the CommEvent handler procedure

End Sub


'Simple serial port event handler.
'Expects only incoming data notifications and ignores all other 
notification types
Private Sub Reader_CommEvent(ByVal Evt As StrokeReaderLib.Event, _
                             ByVal data As Variant)
    If Evt = EVT_DATA Then
        MsgBox data
    End If
End Sub

von c-hater (Gast)


Lesenswert?

Rico H. schrieb:

> Du meinst sowas?:
[...]

Ja. Nun wäre bloß noch zu klären, woher dieser "StrokeReader" stammt. Im 
Lieferumfang von Excel ist er nicht, soweit ich weiß.

Ich benutze für solche Zwecke immer mscomm.ocx, welches aus VB6 stammt 
und leider keine Freeware ist.

Es gibt aber meines Wissens nach eine in Delphi geschriebene Freeware, 
die ein sehr ähnliches ActiveX-Control bereitstellt. Der Name dieser 
Lösung fällt mir jetzt allerdings um's Verrecken nicht ein. Ich glaube 
mich aber erinnern zu können, daß das Ding auf SourceForge gehostet 
wird.

von Hannes L. (hannes)


Lesenswert?

c-hater schrieb:
> mscomm.ocx, welches aus VB6 stammt

Hmmm, VB6 kann aber auch mit Elexs.dll von Burkhard Kainka umgehen, das 
auf COM-Schnittstellen zugreifen kann. Ob's auch über USB geht, weiß ich 
nicht. Es ist aber zumindest schonmal Freeware.

http://www.elexs.de/elexs2/elexsdll.htm

Ich habe sie vor Jahren einmal hier verwendet:
http://www.hanneslux.de/mobast/index.html

...

von Rainer V. (rudi994)


Lesenswert?

Viele Leute mit gleichen Problemen, wenige mit guten Lösungen :

Hier im Forum :  Beitrag "Daten von COM port in Excel einlesen"
Weitere unter der Suchfunktion : "RSAPI", "Daten über COM" usw.

Website von M. Schwimmer  http://michael-schwimmer.de/xlMain.htm
Thema  72: Datenübertragung mit der seriellen Schnittstelle
Thema 117: Serielle Schnittstelle #2 (Office 2010)

Elektronik-Labor, B. Kainka, Elexs, AK Modulbus: Verwendung RSAPI.dll
Buchtip "MSR mit Word und Excel"  http://www.b-kainka.de/buch2.htm
FAQ zu "MSR mit Word und Excel"  http://www.b-kainka.de/msrwefaq.htm

Programmier-Beispiel VBA-RSAPI für Interface "Serai 812" 
http://www.elexs.de/modulbus/technik/serai.html

Office Forum  http://www.office-loesung.de/ , Suche: RSAPI USB Excel
Daten von Schnittstelle holen und in Office einbinden
http://www.office-loesung.de/ftopic21028_0_0_asc.php

USB Com-Port, RS232, Daten auslesen und direkt in Excel einbinden
http://www.office-loesung.de/ftopic452544_0_0_asc.php
http://www.office-loesung.de/ftopic58639_0_0_asc.php
http://www.office-loesung.de/ftopic328007_0_0_asc.php
Am Ende der Threads gibt es oft noch Links zu ähnlichen Beiträgen.

Datenerfassung per Schnittstelle, z.B. im Menü Standardprogramme 
(Extract!, Serikey! u.a.)  http://www.serielleschnittstelle.de/

Software zur Datenerfassung, USB, RS232 u.a., Einbindung in Excel u.a.
http://www.tec-it.com/de/software/data-acquisition/Default.aspx

von Rico H. (Firma: FHNW) (2she)


Angehängte Dateien:

Lesenswert?

So, hab nun folgendes gefunden.
Zum Einen die benötigte Bibliothek für Excel und zum Andern ein 
Beispielcode um die Schnittstelle zu überprüfen und die Daten zu loggen.

Jetzt hab ich noch das Problem, dass die Daten in HEX ausgegeben werden, 
gibt es hier jemanden, der Ahnung von VB-Codes hat??
Beim Ersten hinschauen sind mir folgende Zeilen des Codes ins Auge 
gestochen:

    If lDataLenth >= 1 Then
        'bytes to Hex string
        For l = 0 To lDataLenth - 1
            s = s & Right("0" & Hex(buffer(l)), 2)
        Next l

        'show information in the panel
        lIndex = lIndex + 1
        lblIndex5.Caption = lblIndex4.Caption
        lblIndex4.Caption = lblIndex3.Caption
        lblIndex3.Caption = lblIndex2.Caption
        lblIndex2.Caption = lblIndex1.Caption
        lblIndex1.Caption = CStr(lIndex)
        lblInBuffer5.Caption = lblInBuffer4.Caption
        lblInBuffer4.Caption = lblInBuffer3.Caption
        lblInBuffer3.Caption = lblInBuffer2.Caption
        lblInBuffer2.Caption = lblInBuffer1.Caption
        lblInBuffer1.Caption = Format(s, "!&&" & ReCopyStr(31, " &&"))

        'show data in the Excel file
        lMinLenth = Val(cboDataLenth.Text)
        lMinLenth = IIf(lMinLenth >= 1, lMinLenth, 1)
        If lDataLenth >= lMinLenth Then
            lCount = lCount + 1         'input data counter

            If lCount = 1 Then
                sngBegin = sngNow       'get the begin time(when first 
data income)
                If BAUDRATE_IN_FIRST_DATA Then
                    stData.Cells(2, 5 + (lDataLenth \ 2)) = 
LVal(Right(s, 2) & "00")  'get baudrate value
                End If
            End If

            lRow = lCount + 1       'Row number
            If lRow = 65536 Then bStopFlag = True       'auto stop when 
sheet is full

            stData.Cells(lRow, 1) = (sngNow - sngBegin)
            stData.Cells(lRow, 2) = s

            If lDataLenth >= 2 Then stData.Cells(lRow, 5) = LVal(Mid(s, 
1, 4))
            If lDataLenth >= 4 Then stData.Cells(lRow, 6) = LVal(Mid(s, 
5, 4))
            If lDataLenth >= 6 Then stData.Cells(lRow, 7) = LVal(Mid(s, 
9, 4))
            If lDataLenth >= 8 Then stData.Cells(lRow, 8) = LVal(Mid(s, 
13, 4))
            If lDataLenth >= 10 Then stData.Cells(lRow, 9) = LVal(Mid(s, 
17, 4))
            If lDataLenth >= 12 Then stData.Cells(lRow, 10) = 
LVal(Mid(s, 21, 4))
            If lDataLenth >= 14 Then stData.Cells(lRow, 11) = 
LVal(Mid(s, 25, 4))
            If lDataLenth >= 16 Then stData.Cells(lRow, 12) = 
LVal(Mid(s, 29, 4))
            If lDataLenth >= 18 Then stData.Cells(lRow, 13) = 
LVal(Mid(s, 33, 4))
            If lDataLenth >= 20 Then stData.Cells(lRow, 14) = 
LVal(Mid(s, 37, 4))
            If lDataLenth >= 22 Then stData.Cells(lRow, 15) = 
LVal(Mid(s, 41, 4))
            If lDataLenth >= 24 Then stData.Cells(lRow, 16) = 
LVal(Mid(s, 45, 4))
        End If
    End If


Ist es möglich die Daten Dezimal darzustellen? Wenn ja, wie?
Besten Dank im vorraus

von ;o) (Gast)


Lesenswert?

Ich mache dass normalerweise immer mit CSV-Dateien.

Ich speichere die Daten einfach als Tabulator getrenntem Text
Man kann aber auch die Beistriche als Trennzeichen verwenden.

Wenn man diese CSV-Datei mit Excel öffnet, werden die Texte richtig 
interpretiert und in das Tabellenblat eingefügt, wo man sie 
weiterverarbeiten kann.

Wenn ich die Daten ins laufende Excel "live" einlesen will verwende ich 
VBA und greife auf die Windows API zu.

Da kann man dann auf die serielle Schnittstelle(Hardware- / Software 
RS232) zugreifen ohne irgendetwas installieren zu müssen.

Die Befehle stehen hier:
http://msdn.microsoft.com/en-us/library/Aa363194

Also einfach zuerst mit CreateFile den Handle zur Schnittstelle 
erstellen, dann mit SetCommState und SetCommTimeouts konfigurieren und 
zum Schluss mit ReadFile und WriteFile Daten senden und lesen.
Und am Ende, wenn man die Schnittstelle nicht mehr benötigt wird der 
Handle mit CloseHandle geschlossen.

Die API-Befehle muss man dem VBA aber noch bekannt geben bevor man sie 
verwendet.
CreateFile:
http://www.vbarchiv.net/api/api_createfile.html

SetCommState:
http://www.activevb.de/rubriken/apikatalog/deklarationen/setcommstate.html

SetCommTimeouts
http://www.activevb.de/rubriken/apikatalog/deklarationen/setcommtimeouts.html

Den Aufbau der Structe findet man im VBA.

von Rainer V. (rudi994)


Lesenswert?

Rico H. schrieb:
> Ist es möglich die Daten Dezimal darzustellen?

Ich kann es jetzt leider nicht ausprobieren, aber ich denke, daß es in
VBasic für Excel die Funktion Val(...) zur Umwandlung 
String->Dezimalzahl gibt, wobei Dezimalzahl dann eben eine Zahl und 
keine Zeichenkette ist.
Das ist in der Tabellenzelle i.d.R. egal. Funktion LVal(...) kenne ich 
nicht, sie macht wohl String->Hexzahl, wobei ich nicht sicher bin, ob 
man das so in eine Zelle schreiben kann. Muß leider weg, bis später.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.