Rexus
Lt. Commander
- Registriert
- Mai 2006
- Beiträge
- 1.401
Hi,
über Excel möchte ich gerne Daten von einem Messgerät anfordern und einlesen. Das Messgerät ist über einen USB-Port mit dem PC verbunden, und wird mir im Geräte-Manager unter den seriellen RS232 Schnittstellen (COM4-Port) angezeigt.
Ich bin Anfänger in Sachen VBA-Programmierung. Daher habe ich mir ein Modul zum Öffnen/Lesen/Schreiben/Schließen von COM-Ports runtergeladen, welches die Schnittstelle mit Hilfe der kernel32-Library ansteuert. Ich versuche zunächst, den COM-Port zu öffnen. Leider schlägt mein Code fehl.
Hier die relevanten Teile vom runtergeladenen ComPort-Modul:
Über ein zweites Modul (das mit einem Button auf der Excel-Oberfläche verknüpft ist) rufe ich die OpenComPort-Funktion auf:
Die Ausgabe bzw. der Wert von OpenComPort ist FALSE.
Beim Abarbeiten bin ich inzwischen soweit gekommen:
Der CreateFile-Befehl schlägt fehl, ich erhalte bei dem Debug.Print Befehl (Line 174) folgende Fehlermeldung im VBA-Editor:
Wobei der ErrorCode (angefordert über GetLastError() in Line 172) an der Stelle irgendwie nichts aussagt...?
INVALID_HANDLE_VALUE habe ich mir auch ausgeben lassen, der Wert ist "-1" (Line 181). Was bedeutet das?
Ich denke, es gilt herauszufinden, weshalb der Befehl CreateFile (Line 154) fehlschlägt. Hat jemand eine Idee?
über Excel möchte ich gerne Daten von einem Messgerät anfordern und einlesen. Das Messgerät ist über einen USB-Port mit dem PC verbunden, und wird mir im Geräte-Manager unter den seriellen RS232 Schnittstellen (COM4-Port) angezeigt.
Ich bin Anfänger in Sachen VBA-Programmierung. Daher habe ich mir ein Modul zum Öffnen/Lesen/Schreiben/Schließen von COM-Ports runtergeladen, welches die Schnittstelle mit Hilfe der kernel32-Library ansteuert. Ich versuche zunächst, den COM-Port zu öffnen. Leider schlägt mein Code fehl.
Hier die relevanten Teile vom runtergeladenen ComPort-Modul:
Code:
Option explicit
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
' 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
'-------------------------------------------------------------------
'
'Routine: OpenComPort
'-------------------------------------------------------------------
' Parameters : strPortName - name of the port to open
' strSettings - port settings in the format
' "baud=9600 parity=N data=8 stop=1"
' lPortHandle - set to port handle on success
' Returns : Boolean representing success
' Synopsis : opens named communications port for synchronous
' i/o. The handle returned should be used in
' subsequent calls
'
'
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
Über ein zweites Modul (das mit einem Button auf der Excel-Oberfläche verknüpft ist) rufe ich die OpenComPort-Funktion auf:
Code:
Option Explicit
Public strPortName As String
Public strSettings As String
Public lPortHandle As Long
Public OpenComPort As Boolean
Public lErr As Integer
Public Sub OpenCOM4()
strPortName = "COM4"
strSettings = "baud=115200 parity=0 data=8 stop=1"
'lPortHandle = 4
Call ComPort.OpenComPort(strPortName, strSettings, lPortHandle)
Worksheets("Tabelle1").Range("A1").Value = OpenComPort
End Sub
Die Ausgabe bzw. der Wert von OpenComPort ist FALSE.
Beim Abarbeiten bin ich inzwischen soweit gekommen:
Der CreateFile-Befehl schlägt fehl, ich erhalte bei dem Debug.Print Befehl (Line 174) folgende Fehlermeldung im VBA-Editor:
Failed to open comport ( err = 0)
Wobei der ErrorCode (angefordert über GetLastError() in Line 172) an der Stelle irgendwie nichts aussagt...?
INVALID_HANDLE_VALUE habe ich mir auch ausgeben lassen, der Wert ist "-1" (Line 181). Was bedeutet das?
Ich denke, es gilt herauszufinden, weshalb der Befehl CreateFile (Line 154) fehlschlägt. Hat jemand eine Idee?