kostenloser Webspace werbefrei: lima-city


[VBA-Excel] - RS232 auslesen

lima-cityForumProgrammiersprachenBasic

  1. Autor dieses Themas

    clonekrieger

    Kostenloser Webspace von clonekrieger

    clonekrieger hat kostenlosen Webspace.

    Hi zusammen,
    ich programmiere seit kurzem für einen Bekannten ein Auswertungsprogramm in Excel. Genauer muss ich eine RS232 Schnittstelle abgreifen und die Daten, die mir daraus gesendet werden verarbeiten. Den zweiten Teil hab ich zum Großteil erledigt - der Rest ist noch finetuning.
    Ich wollte jetzt mal von euch wissen, ob jemand schonmal mit VBA aus Excel 2003 es geschafft hat, erfolgreich RS232 auszulesen mit einem USB-Serien Adapter. Ich weiß, dass VBA das theoretisch kann, siehe M$ Seite:
    http://msdn.microsoft.com/de-de/library/system.io.ports.serialport.aspx
    Nur hab ich das Gerät nicht zu Hause und kann es mir zur Zeit auch nicht organisieren. Wenn jemand schon Erfahrung damit hat, wäre mir sehr geholfen. Ich habs mal in C# programmieren lassen von nem Kumpel und da ging es super.

    Danke im Voraus,
    clone
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. ja was ist jetzt das problem ?

    Mach eine Eingabe wo der Anschlussname eingegeben werden kann und schreibe den auf einen String, selbiges kannst du mit Baudrate und Metrik machen (Datentypen beachten)

    Dann initialisierst du ein Objekt mit einem der Konstruktoren und den entsprechenden Optionen.

    Dann öffnest du eine Verbindung mit der Methode "Open"

    Dann liest du deine Daten, bei einem Messgerät sind das üblicherweise ganze Zeilen, dann würde sich "ReadLine" anbieten, dabei musst du aufpassen das du ein geeignetes Zeilenende erhältst, ob das so ist kann man nur mit der Hardware prüfen z.B. über ein serielles Terminal wie Putty, TerraTerm oder Hterm.

    Wenn die Daten nicht zeilenweise kommen musst du eben bitweise lesen und schauen wo ein Messwert zuende ist.

    Das Ganze schreibst du dir dann da hin wo du es in deiner Tabelle benötigst, wenn du fertig bist schließt du den Port mit "Close"

    Das Beispiel aus der Doku ist doch eigentlich straightforward, nimm es halt mal in ein separates Projekt und bau es um bis es richtig liest und bau es dann ein.
  4. Autor dieses Themas

    clonekrieger

    Kostenloser Webspace von clonekrieger

    clonekrieger hat kostenlosen Webspace.

    Ich weiß halt nur nicht, ob's auch funktioniert. Ich hab das ganze Script erst in AutoIt programmiert und dann festgestellt, dass ich die Schnittstelle nicht vernünftig ansteuern kann.
    In C# hab ichs ja hinbekommen und ich hab einzig Schiss, dass mein Programmieraufwand jetzt zum zweiten Mal für die Tonne ist.
    Da ich das Gerät nicht bekommen kann zur Zeit wird sichs noch etwas bis zum finalen Testen hinziehen und ich hab Zeit, mehr Features zu implementieren.
    Außerdem hab ich vllt noch eine Frage zu VBA:
    Ich hab MySQL Script, was die Benutzung einer MySQL-DB aus VB raus erlaubt. Kennt einer ein Script, mit dem auch bei den SELECT Abfragen eine Angabe des WHERE parameters möglich ist? Scheint mit diesem Script nicht zu gehen, weswegen ich zur Zeit ALLES in ein Array ausgebe und dann per For Schleifen alles durchscanne, bis ich habe, was ich in der DB gesucht habe. Das sorgt dafür, dass ich mal schnell n paar tausend Abfragen raushauen muss, was einfacher gehen könnte.
    Primär gehts mir aber hier um die Möglichkeit der Schnittstellenauslesung mit RS232 und wenn das einer schonmal gemacht hab, bin ich beruhigt!
    lg
    clone


    ' Establish connection to the database
    
    server_name = "127.0.0.1" ' Enter your server name here - if running from a local computer use 127.0.0.1
    database_name = "test1" ' Enter your database name here
    user_id = "root" ' enter your user ID here
    password = "" ' Enter your password here
    
    Set conn = New ADODB.Connection
    conn.Open "DRIVER={MySQL ODBC 3.51 Driver}" _
    & ";SERVER=" & server_name _
    & ";DATABASE=" & database_name _
    & ";UID=" & user_id _
    & ";PWD=" & password _
    & ";OPTION=16427" ' Option 16427 = Convert LongLong to Int: This just helps makes sure that large numeric results get properly interpreted
    
    '-------------------------------------------------------------------------
    ' Various Actions
    
    ' Define variables (not all of the variables will be required for each action)
    vtype = Array("Text", "LongText", "Int(10)", "Float", "Double", "Date", "Time") ' array of commonly used MySQL variable types
    table1 = "wk1"
    table2 = "secondtable"
    field1 = "fieldtitle1"
    field2 = "fieldtitle2"
    
    '-------------------------------------------
    ' Create or remove tables
    
    ' Remove table from database
    GoTo skipremove
    sqlstr = "DROP TABLE " & table1
    conn.Execute sqlstr
    skipremove:
    
    ' Create a new blank table with the specified fields
    GoTo skipcreate
    sqlstr = "CREATE TABLE " & table1 & "(" _
    & field1 & " " & vtype(1) & "," _
    & field2 & " " & vtype(2) _
    & ")"
    conn.Execute sqlstr
    skipcreate:
    
    '---------------------------------------------
    ' Add, remove or extract records from an existing table
    
    ' Erase entire table contents but do not remove the table
    GoTo skiperase
    sqlstr = "DELETE FROM " & table1
    conn.Execute sqlstr
    skiperase:
    
    ' Extract MySQL table data to first worksheet in the workbook
    GoTo skipextract
    Set rs = New ADODB.Recordset
    sqlstr = "SELECT * FROM " & table1 ' extracts all data
    rs.Open sqlstr, conn, adOpenStatic
    '
    With Tabelle10.Range(Cells(1, 1), Cells(2, 5)) ' Enter your sheet name and range here
    .ClearContents
    .CopyFromRecordset rs
    End With
    skipextract:
    
    ' Write new entries to a table from the first sheet of the workbook
    GoTo skipwrite
    With Sheets(1)
    For i = 1 To 10000
    If Cells(i, 1) = "" Then Exit For
    sqlstr = "INSERT INTO " & table1 & " SET " _
    & field1 & " = '" & Cells(i, 1) & "', " _
    & field2 & " = '" & Cells(i, 2) & "'"
    conn.Execute sqlstr
    Next i
    End With
    skipwrite:
    
    '-----------------------------------------------------------------------
    ' Close connections
    On Error Resume Next
    rs.Close
    Set rs = Nothing
    conn.Close
    Set conn = Nothing
    On Error GoTo 0
    End Sub


    Beitrag zuletzt geändert: 6.5.2014 21:47:41 von clonekrieger
  5. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    clonekrieger schrieb:
    Ich weiß halt nur nicht, ob's auch funktioniert. Ich hab das ganze Script erst in AutoIt programmiert und dann festgestellt, dass ich die Schnittstelle nicht vernünftig ansteuern kann.
    In C# hab ichs ja hinbekommen und ich hab einzig Schiss, dass mein Programmieraufwand jetzt zum zweiten Mal für die Tonne ist.

    Da hier niemand as verwendete Geräte kennt oder besitzen wird, wird dir hier jetzt niemand zielgerichtet weiterhelfen können. Wenn du das bereits in C# implementiert hast bzw. implementieren hast lassen, dann ist ja offensichtlich bekannt, wie mit der Schnittstelle umzugehen ist. Du brauchst nun ja lediglich den Code von C# nach VB.Net zu portieren, und gut ist's. Da ist lediglich die Syntax ein wenig anders.
    Alles in allem wird dir auch nichts anderes übrig bleiben, als dein Stück Software dann auch mit der Hardware zu testen, alles andere ist bloß Vermutung, Raten, was auch immer ;-)
    Kennt einer ein Script, mit dem auch bei den SELECT Abfragen eine Angabe des WHERE parameters möglich ist? Scheint mit diesem Script nicht zu gehen

    Wie wär's denn damit, den existierenden Code für die MySQL-Abfrage zu ergänzen und anzupassen?
    sqlstr = "SELECT * FROM " & table1 & " WHERE blabla = `wasweißichdenn`" ' extracts requested data
    rs.Open sqlstr, conn, adOpenStatic
  6. Autor dieses Themas

    clonekrieger

    Kostenloser Webspace von clonekrieger

    clonekrieger hat kostenlosen Webspace.

    burgi schrieb:
    Du brauchst nun ja lediglich den Code von C# nach VB.Net zu portieren, und gut ist's. Da ist lediglich die Syntax ein wenig anders.

    Dann bin ich ja beruhigt :)

    burgi schrieb:
    Kennt einer ein Script, mit dem auch bei den SELECT Abfragen eine Angabe des WHERE parameters möglich ist? Scheint mit diesem Script nicht zu gehen

    Wie wär's denn damit, den existierenden Code für die MySQL-Abfrage zu ergänzen und anzupassen?
    sqlstr = "SELECT * FROM " & table1 & " WHERE blabla = `wasweißichdenn`" ' extracts requested data
    rs.Open sqlstr, conn, adOpenStatic

    Ich mag ja vielleicht doof schreiben, aber ganz soo doof bin ich nicht. Es scheint da irgendein Problem mit dem ODBC-Treiber zu geben (siehe Bild):
    http://i.epvpimg.com/y2ncg.jpg
    Excel gibt mit dann den Fehler in der Zeile rs.Open sqlstr, conn, adOpenStatic aus (logischerweise :) ).
    Wennde mir damit noch weiterhelfen könntest wäre klasse! (Hinweis: Variable table1 ist sinnreich gewählt :) daran liegts nicht).

    Beitrag zuletzt geändert: 7.5.2014 9:03:43 von clonekrieger
  7. burgi

    Co-Admin Kostenloser Webspace von burgi

    burgi hat kostenlosen Webspace.

    Den Spaltennamen "Name" gibt es?
    und ist dieser dann auch vom Typ Integer? Oder doch eine Zeichenkette ...
    Ohne die WHERE-Klausel funktioniert die Abfrage? Versuch doch mal
    SELECT * FROM " & table1 & " WHERE 1"

    Wenn das funktioniert, muss es was mit den anfangs gestellten Fragen zu tun haben, aber WHERE funktioniert dann grundsätzlich ;-)
  8. Autor dieses Themas

    clonekrieger

    Kostenloser Webspace von clonekrieger

    clonekrieger hat kostenlosen Webspace.

    Ich bin so ein Genius...
    Verdammte hacke... Folgendes: Ich habe das Leerzeichen zwischen " und WHERE vergessen. Ich dachte nur bei deinem Post "Warum hat der da noch ein Leerzeichen?" Denke kurz nach und haue meine Stirn auf den Tisch. Habe mal ne Testabfrage gemacht und läuft erste Sahne. Ich hasse mich für solche Anfängerfehler...
    Trotzdem danke, dass es jetzt läuft (*Horizont erweitert*)
    lg
    clone
  9. für die Zukunft noch ein Tipp, falls du was testen willst, was du nciht hast:

    http://www.heise.de/download/com-port-data-emulator-1152574.html

    Es gibt für diverse Dinge Emulatoren, gerade aus dieser Problematik heraus, dass man etwas für etwas entwickelt und es dann nciht testen kann, weil man es nicht hat. in diesem Beispiel wird eine Binärdatei hinterlegt, die das enthält, was du von dem gerät erwartest und kannst dann testen, ob du drauf kommst und ob dein Programm diese Daten wie erwartet durchexerziert. Für andere Stufen, falls deine Schnittstelle zu dem Gerät noch nciht fertig wäre, könntest du festschreiben, was du erwartest, das in der Struktur aufbereiten und dann liefern lassen von einer Testklasse zum Beispiel. Dieses Vorgehen nennt man auch Unit-Tests
  10. Autor dieses Themas

    clonekrieger

    Kostenloser Webspace von clonekrieger

    clonekrieger hat kostenlosen Webspace.

    Das ist mal genau das, was ich brauche! Danke für den Tipp - hatte nicht erwartet, dass es sowas gibt!
    Nachdem ich jetzt den MySQL Krams umgeschrieben hab, hab ich die Laufzeit erstmal gezehntelt (läuft jetzt ratz-fatz).
    lg
    clone
  11. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!