Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

API für serielle Schnittstelle RS232 z.B. COM1

Begonnen von Peter.29, Oktober 02, 2017, 13:28:13

⏪ vorheriges - nächstes ⏩

Peter.29

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

Beaker s.a.

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
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Peter.29

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

Beaker s.a.

Hallo Peter,
Sorry, weitere Hilfe kann ich bei dem Thema leider nicht leisten.
gruss ekkehard
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

Grüße von der (⌒▽⌒)

Peter.29

Danke @ Ekkehard + Lachtaube

boooh, meterlanger Code
Den hau ich in ein Modul rein und probier's mal.
:-\

VG.

markusxy

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

Peter.29

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