Hallo Checker,
ich möchte über Access2010ff und Win7/10 die serielle Schnittstelle RS232 z.B. COM1 bedienen.
>> Hat jemand eine Idee oder noch besser ein Beispiel, wie man die API-Funktion in Access2010 einbinden kann ????
u.a. Welche Verweise muss ich im VBA-Modul selektieren und Wie muss ich die Funktion deklarieren ?
Bisher verwendete ich die XMCommVBA.ocx (im Beispiel:"Me.MSComm."), die nicht mehr unterstützt wird.
Die Kommunikation ging einfach:
1) "output" senden
2) mit Timer die Daten des Geräts in das Textfeld "Antwort" schreiben bis nix mehr kommt.
------------
Private Sub Senden_Click()
Dim Buffer As String
'Schnittstelle öffnen
Me.MSComm.Interval = 55
Me.MSComm.PortOpen = True
'Befehlsstring an das Gerät senden.
Me.MSComm.output = "WER?" + Chr(13) + Chr(10)
Me.Form.TimerInterval = 2000
Me.Antwort = ""
' *** weiterer Ablauf in Form_Timer
End sub
---------------------
Private Sub Form_Timer()
Dim L As Long
L = Len(Me.Antwort)
Me.Antwort = Me.Antwort & MSComm.Input
If Len(Me.Antwort) = L Then
Me.Form.TimerInterval = 0
'Port schließen
Me.MSComm.PortOpen = False
End If
End Sub
--------------------
COM-Einstellungen:
Me.MSComm.CommPort = 1
Me.MSComm.Settings = "9600,N,8,1" 'Baudrate Parity Datenbits Stopbits
Me.MSComm.RTSEnable = 0
Me.MSComm.DTREnable = 0
Hiiiiiiilfe
VG
Hallo Peter,
Ich verstehe nix von Hardware-Schnittstellen, habe aber die Tage dieses
hier gelesen. Vielleicht hilft es ja, wenn es kein X-Post ist.
http://www.ms-office-forum.net/forum/showthread.php?t=346279 (http://www.ms-office-forum.net/forum/showthread.php?t=346279)
gruss ekkehard
Servus Ekkehard,
vielen Dank für Deine schnelle Antwort.
Die Möglichkeit, die COM-Schnittstelle als Datei anzusprechen ist ein guter Tipp.
Zum Kommunizieren mit Text-Steuerzeichen aber für mich nicht ideal.
Eine API-Lösung würde mir besser gefallen.
Viele Grüße, Peter
Hallo Peter,
Sorry, weitere Hilfe kann ich bei dem Thema leider nicht leisten.
gruss ekkehard
Ist Deine Suchmaschine kaputt? Serial port programming on Visual Basic with Windows API (https://strokescribe.com/en/serial-port-vb-winapi.html)
Danke @ Ekkehard + Lachtaube
boooh, meterlanger Code
Den hau ich in ein Modul rein und probier's mal.
:-\
VG.
Zitat von: Peter.29 am Oktober 02, 2017, 15:29:16
Danke @ Ekkehard + Lachtaube
boooh, meterlanger Code
Beide Codes arbeiten grundsätzlich auf die selbe weise.
Nur bietet der File-Zugriff via API umfassende Möglichkeiten im Gegensatz zu den implentierten VBA Methoden.
LG Markus
API funkzt !
Hab' den "API" Link von Lachtaube verwendet und nach meinen Bedürfnissen angepasst:
----------------
'Aufruf der Sub:
V0_WR232 = "Hello World" + Chr(13) + Chr(10) + "i bins"
Init_Com "COM1"
'zusätzliche eingefügte Variablen zur Datenübergabe
Global V0_RD232 As String ' da stehen dann die empfangenen Daten drin
Global V0_WR232 As String ' z.B. V0_WR232 = "Hello World" + Chr(13) + Chr(10) + "i bins"
Global V0_RDBytes As Integer 'Anz. empfangener Bytes
'Änderungen an der Sub: -----------------------------
'COMPO: Übergabe COM-Port mit Sub-Aufruf z.B. init_com "COM1"
Public Sub Init_Com(COMPO As String)
'....
V0_RD232 = "" 'globale Übergabe-Variablen für RD Daten rücksetzen
V0_RDBytes = 0
Dim fina As String 'filename
fina = "\\.\" & COMPO
h = CreateFile(fina, GENERIC_READ Or GENERIC_WRITE, 0, 0, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
'....
d.BaudRate = 9600 'an Gerät anpassen
d.StopBits = ONESTOPBIT
d.Parity = NOPARITY
'...
timeouts.ReadIntervalTimeout = 50 'The max. time in milliseconds between arrival of any two bytes
timeouts.ReadTotalTimeoutConstant = 5000 '=5 Sekunden The max. time the ReadFile() function will wait for data.
'....
Dim sendtxt As Variant
sendtxt = V0_WR232 'von Übergabevariable
Dim sWrite(1 To 100) As Byte 'Einzelzeichen des String zum Schreiben <100 Zeichen ggf. erhöhen
Dim j As Long
For j = 1 To Len(sendtxt)
sWrite(j) = Asc(Mid(sendtxt, j, 1))
Next j
'...
'nicht benutzt:
' rc = WriteFile(h, bWrite(1), 6, wr, 0) 'wr indicates how many bytes went to the port.
'dafür:
rc = WriteFile(h, sWrite(1), Len(sendtxt), wr, 0) 'wr indicates how many bytes went to the port.
'...
Dim bRead(1 To 65500) As Byte 'We want to receive up to 65500 bytes.
rc = ReadFile(h, bRead(1), 65500, rd, 0) 'rd indicates how many bytes received from the port.
'...
'sData = StrConv(bData, vbUnicode)
Dim s As String
Dim i As Long
For i = 1 To rd
' s = s & Hex(bRead(i)) & " " ersetzt
s = s & Chr(bRead(i))
Next i
' Empfangene String-Daten in Variablen zur Datenübergabe schreiben
V0_RD232 = s
V0_RDBytes = rd
--------------------
Danke nochmal ! bb