Forum: PC-Programmierung EXCEL + serielle Schnittstelle


von Mirko S. (Gast)


Lesenswert?

Gibt es eine Möglichkeit in EXCEL auf die RS232 zuzugreifen?
Wenn ja, wo finde ich einen Beispielcode?

von Jens Dinspel (Gast)


Lesenswert?

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

von Mirko S. (Gast)


Lesenswert?

Ja kannst du mir mal deinen Versuche per E-Mail zusenden?
Gibt es niemand der so was schon mal gemacht hat?

von EZ81__ (Gast)


Lesenswert?

Keine Ahnung davon, nur gerade eben drüber gestolpert:
http://www.mikrocontroller.net/forum/read-4-194813.html

von Mirko S. (Gast)


Lesenswert?

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?

von AndreasH (Gast)


Lesenswert?

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

von Mikro S. (Gast)


Lesenswert?

Hallo AndreasH,

danke für den Code.
Kannst du mir deine Excel Datei hier ins Forum reinposten?

MFG

von Mikro S. (Gast)


Angehängte Dateien:

Lesenswert?

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

von Mikro S. (Gast)


Lesenswert?

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.

von AndreasH (Gast)


Lesenswert?

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

von Axel R. (Gast)


Lesenswert?

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 ---

von Mirko S. (Gast)


Lesenswert?

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?

von Bruno (Gast)


Lesenswert?

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..

von Andreas S. (andreash)


Lesenswert?

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

von H_S (Gast)


Lesenswert?

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?

von H_S (Gast)


Angehängte Dateien:

Lesenswert?

...wie kann ich auf die COMPORT Funktionen zugreifen?

von H_S (Gast)


Lesenswert?

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?

von H_S (Gast)


Lesenswert?

...habs noch immer nicht geschafft!
Ich hasse VBA und EXCEL!

von Sebastian B. (Gast)


Lesenswert?

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.

von H_S (Gast)


Lesenswert?

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).

von Sebastian (Gast)


Lesenswert?

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.

von Karsten77 (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.