Gibt es eine Möglichkeit in EXCEL auf die RS232 zuzugreifen? Wenn ja, wo finde ich einen Beispielcode?
Ja, gibt es.. Ist leider recht kompliziert.. aber machbar Ich selbst habe es mal versucht aber nicht geschafft das laeuft ueber VBS bzw die Makroprogrammierung von Excel
Ja kannst du mir mal deinen Versuche per E-Mail zusenden? Gibt es niemand der so was schon mal gemacht hat?
Keine Ahnung davon, nur gerade eben drüber gestolpert: http://www.mikrocontroller.net/forum/read-4-194813.html
Danke für den Link. Ich habe jetzt mal die XLS Datei geöffnet. Es erscheint Folgende Fehlermeldung: Laufzeitfehler '429' Objekterstellung durch ActiveX-Komponente nicht möglich. Ich muss wahrscheinlich die MScomm installieren, oder?
Du musst gar nichts installieren. Nur die Windows-Funktionen Openfile, Readfile und Writefile aufrufen. HAbe ich schon mehrfach gemacht. Unten habe ich Dir mal eine Funktion zum Öffnen der seriellen Schnittstelle reinkopiert. Du darfst nur nicht ständig die Schnittstelle abfragen ob Zeichen gekommen sind. Dann funktioniert Deine Excel-Anwendung nicht mehr. Am besten über einen Timer zyklisch aufrufen. Type DCB '' patched to proper definition VB32 ill-def DR DCBlength As Long BaudRate As Long fdwFlags As Long ' bit field in C wReserved1 As Integer XonLim As Integer XoffLim As Integer ByteSize As String * 1 Parity As String * 1 StopBits As String * 1 XonChar As String * 1 XoffChar As String * 1 ErrorChar As String * 1 EofChar As String * 1 EvtChar As String * 1 wReserved2 As Integer End Type Type COMMTIMEOUTS ReadIntervalTimeout As Long ReadTotalTimeoutMultiplier As Long ReadTotalTimeoutConstant As Long WriteTotalTimeoutMultiplier As Long WriteTotalTimeoutConstant As Long End Type Type COMSTAT fCtsHold As Long fDsrHold As Long fRlsdHold As Long fXoffHold As Long fXoffSent As Long fEof As Long fTxim As Long fReserved As Long cbInQue As Long cbOutQue As Long End Type ' kernel defined constants ' Public Const OPEN_EXISTING = 3 Public Const GENERIC_READ = &H80000000 Public Const GENERIC_WRITE = &H40000000 Public Const INVALID_HANDLE_VALUE = &HFFFF Public Const MAXDWORD = &HFFFF ' comms Constants ' Public Const PURGE_TXCLEAR = &H4 Public Const PURGE_RXCLEAR = &H8 Public Const CE_RXOVER = &H1 ' Receive Queue overflow Public Const CE_OVERRUN = &H2 ' Receive Overrun Error Public Const CE_RXPARITY = &H4 ' Receive Parity Error Public Const CE_FRAME = &H8 ' Receive Framing error Public Const CE_BREAK = &H10 ' Break Detected Public Const CE_TXFULL = &H100 ' TX Queue is full Public Const SETRTS = 3 ' Set RTS high Public Const SETDTR = 5 ' Set DTR high ' kernel API file i/o functions ' Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal _ lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As _ Long, ByVal lpSecurityAttributes As Long, ByVal dwCreationDisposition As _ Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As _ Long Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long Declare Function GetLastError Lib "kernel32" () As Long Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As _ Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, _ ByVal lpOverlapped As Long) As Long Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As _ Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal _ lpOverlapped As Long) As Long Declare Function CreateThread Lib "kernel32" _ (lpThreadAttributes As Any, ByVal dwStackSize As Long, _ ByVal lpStartAddress As Long, ByVal lParameter As Long, _ ByVal dwCreationFlags As Long, lpThreadID As Long) As _ Long Public Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long) Public Declare Function TerminateThread Lib "kernel32" (ByVal hThread As Long, ByVal dwExitCode As Long) As Long ' Win32 comms functions ' Declare Function SetCommState Lib "kernel32" (ByVal hCommDev As Long, lpDCB _ As DCB) As Long Declare Function SetCommTimeouts Lib "kernel32" (ByVal hFile As Long, _ lpCommTimeouts As COMMTIMEOUTS) As Long Declare Function PurgeComm Lib "kernel32" (ByVal hFile As Long, ByVal _ dwFlags As Long) As Long Declare Function BuildCommDCB Lib "kernel32" Alias "BuildCommDCBA" (ByVal _ lpDef As String, lpDCB As DCB) As Long Declare Function SetCommMask Lib "kernel32" (ByVal hFile As Long, ByVal _ dwEvtMask As Long) As Long Declare Function ClearCommError Lib "kernel32" (ByVal hFile As Long, _ lpErrors As Long, lpStat As COMSTAT) As Long Declare Function SetupComm Lib "kernel32" (ByVal hFile As Long, ByVal _ dwInQueue As Long, ByVal dwOutQueue As Long) As Long Declare Function EscapeCommFunction Lib "kernel32" (ByVal nCid As Long, _ ByVal nFunc As Long) As Long Declare Function GetCommMask Lib "kernel32" (ByVal hFile As Long, lpEvtMask _ As Long) As Long Declare Function GetCommModemStatus Lib "kernel32" (ByVal hFile As Long, _ lpModemStat As Long) As Long Declare Function WaitCommEvent Lib "kernel32" (ByVal hFile As Long, _ lpEvtMask As Long, ByVal lpOverlapped As Long) As Long Public Function OpenComPort(strPortName As String, _ strSettings As String, _ lPortHandle As Long) _ As Boolean Dim tCto As COMMTIMEOUTS Dim tDcb As DCB Dim hPort As Long Dim fRet As Boolean ' ' set the length field of the DCB ' tDcb.DCBlength = Len(tDcb) ' ' get kernel to build a default DCB for us ' based on com settings string ' Call BuildCommDCB(strSettings, tDcb) ' ' open that com port ' hPort = CreateFile(strPortName, _ GENERIC_READ + GENERIC_WRITE, _ 0, _ 0, _ OPEN_EXISTING, _ 0, _ 0) ' ' did we get port open ... ' If hPort = INVALID_HANDLE_VALUE Then ' ' ... no, get the error code from kernel ' Dim lErr As Long lErr = GetLastError() Debug.Print "Failed to open comport( err = " & CStr(lErr) & ")" ' ' setup returns for failure ' fRet = False lPortHandle = INVALID_HANDLE_VALUE Else ' ' ... yes, get port ready for action ' ' ' set port state using DCB we built earlier ' Call SetCommState(hPort, tDcb) ' ' set up buffer sizes and re-initialize comm driver ' Call SetupComm(hPort, 64000, 64000) ' hPort, InQue, OutQue ' ' setup timeout parameters for this port ' tCto.ReadIntervalTimeout = MAXDWORD '' return with whatever is available tCto.ReadTotalTimeoutMultiplier = 0 tCto.ReadTotalTimeoutConstant = 0 tCto.WriteTotalTimeoutMultiplier = 0 tCto.WriteTotalTimeoutConstant = 10000 '' max 10 secs to write data, just to stop locking '' up application if we gowrong Call SetCommTimeouts(hPort, tCto) ' ' turn on DTR / RTS ' Call EscapeCommFunction(hPort, SETDTR) Call EscapeCommFunction(hPort, SETRTS) ' ' setup returns for success ' fRet = True lPortHandle = hPort End If OpenComPort = fRet End Function So habe ich das dann aufgerufen. Sub Workbook_Open() PortName = "Com2" Settings = "baud=2400 parity=E data=7 stop=1" CloseComPort (PortHandle) Rueckgabe = OpenComPort(PortName, Settings, PortHandle) If Rueckgabe = True Then Modul1.Zeitanzeige Else MsgBox "serielle Schnittstelle zur Waage konnte nicht geöffnen werden" Application.Quit End If
Hallo AndreasH, danke für den Code. Kannst du mir deine Excel Datei hier ins Forum reinposten? MFG
Ich habe im Internet eine Beispiel XLS Datei gefunden. Wenn ich auf ausführen drücke erscheint eine Fehlermeldung: Die Makros in diesem Projekt sind deaktiviert. Ja wie kann ich die Makros aktivieren
Ich habe in meiner Anwendung mal einen Button plaziert. Wie kann ich auf das Modul --> ComPort zugreifen? Ich brächte da mal ein Beispiel wie ich dann den Port öffnen kann.
Hallo Mirko, ich kann Dir die Datei nicht zur verfügung stellen weil ich die für einen Kunden von mir gemacht habe, dem der Quellcode zusteht. Du musst in Excel, ich meine in den Optionen, einstellen, dass Makros aktiviert bzw. nur auf Nachfrage aktiviert werden. Ansonsten passt das schon was ich mir im Groben angesehen habe. Zugreifen kannst du auf den comport mit Rueckgabe = ReadComPort(PortHandle, Data, bRead, bToRead) Grüße Andreas
http://www.mikrocontroller.net/forum/read-1-237681.html#237681 es kann passieren, dass auch fehlgeleitete Posts beantwortet werden!!! Vielen Dank für deine Reaktion ---
Hallo Axel, vielen Dank für deine Unterstützung. Leider bin ich in VBA nicht so sehr gut. Ich bekomme es einfach nicht hin. Ich möchte wie gesagt wenn ich einen Button drücke (den ich im Arbeitsblatt eingefügt habe) nur mal den ComPort öffnen und mal ein Zeichen empfangen. Ich bekomme das nicht gebacken. Zuerst mus ich doch das so machen, oder? ComPort.OpenComPort ("COM1","settings....",PortHandle) Ja und bei PortHandle da habe ich Probleme. Wie kann ich korrekt vom ComPort Modul zugreifen?
Hallo, @AndreasH. Super Quellcode. Ich hab' recht lang im Internet gestöpert um via Excel VBA die UART-Schnittstelle zu bedienen. Ohne Erfolg. Erst dieser Thread hier hat es mir ermöglicht. Manchmal Frage ich mich schon wie man auf den obigen Quellcode kommen soll. Verstanden habe ich ihn sofort als ich ihn gesehen habe. Aber drauf kommen ohne copy and paste .... Mhhh..
Hallo Bruno, habe ich mir selber aus den intnet gezogen und abgeändert. Woher weiss ich nicht mehr. Im Prinzip sind dass alles Standard-Windows-Funktionen. Exakt dasselbe habe ich schon in Delphi wie auch in C++ gemacht. Von daher kein grosses Geheimnis. Man muss nur wissen wie man in VBA die PArameter übergibt. Grüße Andreas
Hab mir mal die Datei ComPort.xls heruntergeladen. Ich komme bisher nicht damit zurecht. In meinem Excel Formular hab ich mal ein Button plaziert, mit dem wollte ich nur mal den Com Port 1 öffnen. Klappt nicht! Wie kann ich beim button click auf die Funktionen zugreifen?
Private Sub CommandButton1_Click() ComPort.OpenComPort ("COM2","baud=19200 parity=E data=7 stop=1",PortHandle) End Sub EXCEL VBA meckert da immer.Grrr...was mache ich da falsch? Wie müsste es richtig heissen?
Hallo, also Dein Aufruf schein richtig zu sein. Wie lautet den die Fehler Meldung? Hast Du auch die kernel Funktionen im selben Modul? Aber wie gesagt poste mal die exakte Fehlermeldung. Sebastian B.
Hab es geschafft es ... funktioniert! Ich kann jetzt von meiner ext. Hardware Daten Empfangen. Diese Daten erscheinen bei mir in EXCEL: 8úËúôôÿýôõ¬c!¤C¤c1¬ ZLÿJÎ Þ)áúúþúþÿÿÿÿ¬#%¬ã5oÜiíìÞ|óÏôöþÿ ÿÿÿÿþ¬c Ich habe soeben erfahren das diese ext. Hardware ASCII Zeichen sendet. Das ganze wird dann immer mir \0 abgeschlossen. Leider weiss nicht wie man diese ASCII Zeichen in VBA (EXCEL) umwandeln kann (HEXFORMAT).
Also ich bin wirklich kein VBA Profi, aber die Excel Hilfe spuckt zu den Thema folgendes aus. Typ-Umwandlungsfunktionen Jede Funktion legt für einen bestimmten Datentyp zwingend einen Ausdruck fest. Syntax CBool(Ausdruck) CByte(Ausdruck) CCur(Ausdruck) CDate(Ausdruck) CDbl(Ausdruck) CDec(Ausdruck) CInt(Ausdruck) CLng(Ausdruck) CSng(Ausdruck) CVar(Ausdruck) CStr(Ausdruck) Das erforderliche Argument Ausdruck ist ein Zeichenfolgenausdruck oder ein numerischer Ausdruck.
Hallo, ich habe auch mal eine Frage zu diesem Thema. Ich möchte mit einem Barcodecanner arbeiten, der an die serielle Schnittstelle (com2) angeschlossen ist. Vom Hersteller habe ich die Konfigurationssoftware herunter geladen, da ist ein Terminal Programm bei. In diesem werden meine Daten, also die Ziffernfolge meines EAN Codes korrekt ausgegeben. Nur nützt mir das nichts, ich möchte direkt in Excel scannen. Ich habe aber keinerlei programmiertechnische Kenntnisse. Codes einfügen und anpassen, das schaffe ich wohl noch. Vielen Dank fr jede Hilfe.
Beitrag #5787481 wurde von einem Moderator gelöscht.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.