[VBA-Excel] - RS232 auslesen
lima-city → Forum → Programmiersprachen → Basic
abfrage
abfragen
angabe
array
beispiel
code
datum
hardware
http
jemand
niemand
parameter
port
problem
schnittstelle
server
set
testen
url
zeile
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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. -
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 -
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
-
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 -
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 -
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 -
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 -
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage