-
Zugriff auf Serielle Schnittstelle aus RPG/VARPG
Moin, moin,
ich möchte bzw muss mit RPG/VARPG auf ein Gerät zugreifen, welches über die RS232 Schnittstelle angeschlossen ist. Das Gerät ist ein Handscanner, welcher eine Art RFID Chip ausliest. Dabei muss ich über die serielle Schnittstelle zum einen Befehle an das Gerät senden und zum anderen die Daten die das Gerät aus den Chips ausliest in mein Programm bekommen. Übers Hyperterminal geht das natürlich simpel, aber wie ich überhaupt auf die serielle Schnittstelle mit RPG/VARPG zugreife, darüber finde ich weder hier noch generell im Internet Informationen.
Hat wer von euch Infos wie man sowas bewerkstelligt? Oder ein Beispielprogramm, bei dem ich die generelle Vorgehensweise ersehen kann.
Schon mal danke im vorraus für die Hilfe!!!
Betriebssystem ist V5R2 und VARPG Version ist 5.1.2
Schönen Feierabend nachher!!
MFG KAMPI
-
Hallo Kampi,
bzgl. VARPG und COM-Ports habe ich folgendes gefunden:
Using COM ports in VARPG
by Les Lieurance
This tip from VARPG developer Les Lieurance shows how to open a COM port (or any port of file for that matter) and send information out the port. Les uses three Windows DLL functions, CreateFileA, WriteFile, and CloseHandle, to accomplish the task. Because Les is using Windows DLLs that often require null terminated strings, he appends a null character, X'00', to the end of the strings. To open COM1:, use COM1 in VARPG part ENT1. To open COM2:, use COM2 in VARPG part ENT1.
************************************************** *******************
* Author . . . . : Les Lieurance, Braden Carco Gearmatic *
* Program ID . . : Com port *
* *
* Description . : Sample program to write data to a com port *
* *
* *
* *
************************************************** *******************
HDEBUG(*YES)
D************************************************* ********************
D* Function Prototypes ****
D** ****
D************************************************* **************************
D* Crtfile: CreateFile function from the Kernel32.dll. **Used to Open Com Port**
D************************************************* **************************
D CRTFILE PR 10U 0 ExtProc('CreateFileA')
0002 D DLL('Kernel32.dll')
0003 D Linkage(*StdCall)
D * VALUE OPTIONS(*STRING)
D 10I 0 Value
D 10I 0 Value
D $SEC LIKE(secattr)
D 10I 0 Value
D 10I 0 Value
D 10I 0 Value
D************************************************* **************************
D* WriteFile WriteFile function from the Kernel32.dll **Used to write to com port**
D************************************************* ***************************
D WRTFILE PR 10U 0 ExtProc('WriteFile')
0002 D DLL('Kernel32.dll')
0003 D Linkage(*StdCall)
D 10I 0 VALUE
D * VALUE OPTIONS(*STRING)
D 10U 0 Value
D $WRITE LIKE(WRITE)
D $OVER LIKE(OVERLAP)
D************************************************* ****************************
D* CloseFile CloseHandle function from the Kernel32.djll **Used to close the com port
D************************************************* **************************
D CLOSEFILE PR 10U 0 ExtProc('CloseHandle')
0002 D DLL('Kernel32.dll')
0003 D Linkage(*StdCall)
D 10I 0 VALUE
D************************************************* ****************************
D* Miscellaneous Initializations
D************************************************* ****************************
D secattr ds
D LENGTH 10I 0 INZ(80)
D SECDESC 10I 0 INZ(0)
D BOOL 10I 0 INZ(0)
D name S 10A
D access S 10U 0 INZ(3221225472)
D share S 10U 0 INZ(0)
Dcreate S 10I 0 INZ(3)
Dattr S 10U 0 INZ(128)
Dtemplate S 10I 0 INZ(0)
DBRC S 10U 0
DRET S 10I 0
DRET2 S 10U 0
DWRITE S 10U 0
DOVERLAP S 10U 0
D
D************************************************* ********************
D************************************************* ********************
* Notes: *
************************************************** *******************
*
C START BEGACT PRESS WIN2
C EVAL ENT1= %GETATR('WIN2':'ENT1':'TEXT') Get com port
C EVAL ENT1 = %TRIM(ENT1)+X'00' add null character t
C EVAL ENT2= %GETATR('WIN2':'ENT2':'TEXT') get data
C EVAL ENT2 = %TRIM(ENT2)+X'00' add null character
C*
C*
C Eval BRC = CRTFILE(ENT1:ACCESS:share:secattr: CreateFile function
C create:attr:template)
C Eval RET =WRTFILE(BRC:ENT2:LENGTH:WRITE:OVERLAP) WriteFile Function
C Eval RET2 = Closefile(brc) Close Com Port
C ENDACT
Gruß,
KM
-
Danke KM für den Tipp.
Werde mich da heute mal durcharbeiten und gucken ob ich es zum laufen bringe bzw da überhaupt durchsteige mit meiner kurzen RPG-Erfahrung.
Allen einen schönen und ruhigen Arbeitstag!
MFG KAMPI
-
Also in "ENT1" steht ja das ,was geöffnet werden soll.
Und in "ENT2" was geschrieben werden soll.
Ich habe errausgehfunden, dass wenn ich "ENT1" z.B. mit "C:\test.txt" fülle und "ENT2" mit "Test schreiben", dann öffnet er die Datei test.txt auf C: und schreibt den Inhalt von "ENT2" dort hinein. Anschliessen schliesst er die Datei wieder. Natürlich alles im Hintergrund, also die Datei geht nicht wirklich auf. Er hat halt nur zugriff darauf.
Aber ich will ja auf den Com-Port 1 zugreifen. Also habe ich in "ENT1" einfach "COM1" geschrieben. Leider funzt das aber nicht. In der Variable "RET" steht auch nachher der Fehlercode "0", da nichts geöffnet war, wo er reinschreiben konnte. (Als ich es mit der Datei gemacht habe, wo es ja geklappt hat, war die Variable "RET" auf 1.)
Es muss also daran liegen, was ich in "ENT1" schreibe, die Frage ist jetzt, was muss ich da reinschreiben, um den 1. Com-Port anzusprechen!??
Danke für weitere Hilfe im vorraus.
Habe über die kernel32.dll Funktionen noch folgende Seite gefunden (zwar für VBA, aber da kann man einiges erkennen. Habe so das mit den Fehlercodes und dem öffnen der Datei rausbekomme.
http://www.vbapihelpline.de/ref/func...eFile&Letter=c
Außerdem auf einer Seite noch folgenden VBA Code, der einen Com-Port öffnet, leider kann ich mangels VBA Kenntniss, nicht erkennen, was bei CreateFile steht um den Com Port zu öffnen.
Code:
Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" ( _
ByVal lpFileName As String, _
ByVal dwDesiredAccess As Long, _
ByVal dwShareMode As Long, _
ByRef lpSecurityAttributes As Long, _
ByVal dwCreationDisposition As Long, _
ByVal dwFlagsAndAttributes As Long, _
ByVal hTemplateFile As Long) As Long
'
Private Declare Function CloseHandle Lib "kernel32.dll" ( _
ByVal hObject As Long) As Long
'
Private Const GENERIC_READ As Long = &H80000000
Private Const GENERIC_WRITE As Long = &H40000000
Private Const OPEN_EXISTING As Long = 3
'
Public Function OpenComPort(ByVal sPort As String) As Long
Dim hCom As Long
hCom = CreateFile("\\.\" & sPort, _
GENERIC_READ Or GENERIC_WRITE, _
0, ByVal 0, OPEN_EXISTING, 0, ByVal 0)
OpenComPort = hCom
End Function
'
Public Sub CloseComPort(ByVal hCom As Long)
CloseHandle hCom
End Sub
MFG KAMPI
-
Doch noch mal den VBA Code angeguckt, "ENT1" muss wohl
heissen. Macht den ohne Fehler auf und zu. Wenn ich vorher Hyperterminal geöffnet habe und auf den Port zugegriffen habe, dann läuft das Prog auf nen Fehler, also wird er wirklich den 1. Com Port öfnnen. Was jetzt noch nicht funzt ist der Befehl "lftx" den ich absetzen muss.
MFG KAMPI
-
So Fehler noch weiter eingekreist. Habe als ENT2, also das was gesendet werden soll "lftx" stehen. Habe das jetzt noch mal mit dem schreiben in eine Datei gemacht, um zu gucken was wirklich drin steht, da es über den Com Port immer noch nciht klappt mit dem Befehl, aber ich da ja nicht sehe, was üebrhaupt übertragen wird.
In der Textdatei steht nicht, wie ich angenommen habe nur "lftx" sodern folgendes:
lftx Ð× Ó× Ð× lftx txt ÿÿÿÿ ÿÿÿÿ 3 àÿÿÿÎt t ° Ìt
Wenn ich das sehe, kann ich mir vorstellen warum das über Com Port nicht klappt, weil mein Gerät "lftx" erwartet und nciht das ganze Zeug hintendran.
Waran kann es denn liegen, das son "Müll" noch dahinter steht???
MFG KAMPI
P.S. Sorry das es fast zum monolog hier wird, will nur immer posten was ich zum Problem noch errausgefunden habe.
-
Beim WriteFile muss die zu schreibende Länge korrekt übergeben werden !
-
Danke fuerchau für die Antwort, aber habe folgendes Problem:
Also wenn ich bei Length (80) eintrage, kommt bei nach dem wrtfile in der Variable write 80 zurück. Bei 99 bei Length kommt 99 in write zurück. Wenn ich bei Length mehr eintrage, führt er das wrtfile nciht aus. Wie finde ich denn die Länge von ENT2 raus? Weil der hängt da ja noch son "Müll" dran wie oben beschrieben?
Mfg KAMPI
-
Hallo Kampi,
ich antworte mal einfach.
Testweise würde ich mal folgendes versuchen:
-Eine andere variable für ENT2 (schreiben) mit varying definieren.
- vorher clear auf die variable
- Wert füllen mit X'00'
- länge der variable mit %len ermitteln
- entsprechend Länge mit übergeben.
Vielleicht hilfts
Gruss
Michael
-
WrtFile gibt die Anzahl der geschriebenen Daten zurück !
Die zu schreibende Länge wird im Parameter Length vorgegeben !!!
Schau dir obiges Beispiel GENAU an und nimm ggf. ein C/C++-Handbuch hinzu.
Similar Threads
-
By schatte in forum NEWSboard Linux
Antworten: 12
Letzter Beitrag: 29-01-08, 14:02
-
By marmart in forum IBM i Hauptforum
Antworten: 5
Letzter Beitrag: 25-09-07, 15:29
-
By schatte in forum NEWSboard Windows
Antworten: 7
Letzter Beitrag: 21-11-06, 11:37
-
By pwrdwnsys in forum IBM i Hauptforum
Antworten: 2
Letzter Beitrag: 07-11-06, 15:34
-
By cami in forum IBM i Hauptforum
Antworten: 3
Letzter Beitrag: 27-08-06, 17:31
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- You may not post attachments
- You may not edit your posts
-
Foren-Regeln
|
Erweiterte Foren Suche
Google Foren Suche
Forum & Artikel Update eMail
AS/400 / IBM i
Server Expert Gruppen
Unternehmens IT
|
Kategorien online Artikel
- Big Data, Analytics, BI, MIS
- Cloud, Social Media, Devices
- DMS, Archivierung, Druck
- ERP + Add-ons, Business Software
- Hochverfügbarkeit
- Human Resources, Personal
- IBM Announcements
- IT-Karikaturen
- Leitartikel
- Load`n`go
- Messen, Veranstaltungen
- NEWSolutions Dossiers
- Programmierung
- Security
- Software Development + Change Mgmt.
- Solutions & Provider
- Speicher – Storage
- Strategische Berichte
- Systemmanagement
- Tools, Hot-Tips
Auf dem Laufenden bleiben
|
Bookmarks