Frage deutsch
~~~~~~~~~~~~~~
Wie kann ich auf die COM-Ports 3 und 4 zugreifen?
 

Question English
~~~~~~~~~~~~~~~
Does QuickBasic support COM3 and COM4 serial ports?
 

Antwort 1
~~~~~~~~~~
[ von Thomas Antoni, 17.6.2002 - 18.3.2004 ]
.
Das geht nicht mit den Hausmitteln von QB - im Gegensatz zu PowerBASIC. Die offizielle Begründung von Microsoft findest Du in Answer 4.
 
Wenn Du es trotzdem versuchen willst, habe ich die folgenden 3 Tipps anzubieten:
 
***
Weitere Infos zu COM3 und COM4 findest Du in Andreas Meiles Know-How-Ecke unter http://dreael.catty.ch/Deutsch/BASIC-Knowhow-Ecke/SerielleKommunikation.html
 
***
Auf der Webseite des QuickBASIC-Gurus Ethan Winer gibt es das Tool "SwapCom", das einfach die COM-Ports 1 und 2 mit den COM-Ports 3 und 4 "vertauscht", so dass diese fortan mit den normalen OPEN COM-Befehlen von QB ansprechbar sind.
 
***
->
PowerBASIC bietet im Gegensatz zu QB eine direkte Unterstützung der COM Ports COM1 ... COM4.
 
 

Antwort 2
~~~~~~~~~~~~
[ von Ch@rly (
karl.pircher*gmx.net ) im QB-Forum, 24.6.2003 ]
.
Grundsätzlich kann man unter Dos nur 2 serielle Schnittstellen zur selben Zeit ansprechen und unter QB nur die COM1 und COM2. Ich hatte einmal ein in QB ein Programm gemacht, welches die Basisadressen von COM1 mit der von COM3, bzw. die COM2 mit der von COM4 austauscht. Da diese beiden normalerweise den selben Interrupt benutzen, ist das ohne Probleme möglich. COM1 und COM3 benutzen den Interrupt 4 und COM2 und COM4 benutzen den Interrupt 3. Das ist auch der Grund, warum z.B. COM1 und COM3 nicht zur selben Zeit betrieben werden können. Leider habe ich das Programm aber nicht mehr.
 
Wenn Du also nur 2 Schnittstellen zur selben Zeit ansprechen musst, dann könnte Dir so ein Umschalten schon weiterhelfen. Eventuell könnte ich noch einmal genauer suchen, ob ich das Programm noch irgendwo auf Diskette habe, oder ich könnte es auch neu programmieren. Wenn Du aber mehre Schnittstellen brauchst, dann musst Du Sie direkt ansprechen. Das geht über den Bios Interrupt 14H. Ich habe das selbst nie gemacht, aber Du findest dazu ausführliche Informationen auf der Steinis Homepage www.franksteinberg.de. Dort findest Du praktisch alles zur Schnittstellenprogrammierung.
 

Antwort 3
~~~~~~~~~~~~
[ von Frank Steinberg (
www.franksteinberg.de ), 25.6.2003 ]
.
Das ist quick & dirty durch Manipulation der Basisadressen im BIOS-Datenbereich möglich, wie das folgende Programm zeigt.
 
Unter Windows NT/2000/XP kann es zu Problemen kommen, weil der Zugriff auf hardwarenahe Dinge sehr restriktiv gehandhabt wird.
 
DECLARE FUNCTION COM13% ()
DECLARE FUNCTION COM24% ()
DECLARE SUB Anzeige (Ergebnis%)
'-- com3und4.bas ----------------------------------------------- >>fst'01<< -
' - Demo, wie man COM 3 und COM 4 in QBasic/Quickbasic/ usw. nutzen kann
' (durch Manipulation der Basisadressen im BIOS-Datenbereich)
' - Achtung COM 1/COM 3 sowie COM 2/COM 4 benutzen jeweils denselben
' Interrupt. Dadurch ist die gleichzeitige Nutzung eingeschraenkt.
' Also z.B. nicht COM 3 nutzen, wenn an COM 1 die Maus haengt!!!
' - PUBLIC DOMAIN
'-- V 20020614 ------------------------------ http://home.arcor.de/steini63 -
CLS : PRINT
PRINT "COM 3 und COM 4 mit QBasic / QuickBasic / ... nutzen >>fst'02<<"
LOCATE 8
'FUNCTION COM13% aufrufen = COM 3 fuer COM 1 einsetzen
'Rueckgabewert ist die Nr. des COM-Ports der mit COM1 angesprochen
'werden kann oder <= 0 bei einem Fehler (-3 = COM 3 nicht vorhanden):
Ergebnis% = COM13%
'
CALL Anzeige(Ergebnis%)
'
'Jetzt kann COM 3 geoeffnet werden; Beispiel:
'OPEN "COM1:600,N,7,1,RS,CS,DS,CD" FOR RANDOM AS #1
' ^ !
'
'Erneuter Aufruf stellt Originalzustand her:
Ergebnis% = COM13%
'
CALL Anzeige(Ergebnis%)
'
PRINT "------------------------------------------------------------------------"
PRINT
'
'FUNCTION COM24% aufrufen = COM 4 fuer COM 2 einsetzen
'Rueckgabewert ist die Nr. des COM-Ports der mit COM2 angesprochen
'werden kann oder <= 0 bei einem Fehler (-4 = COM 4 nicht vorhanden):
Ergebnis% = COM24%
'
CALL Anzeige(Ergebnis%)
'
'Jetzt kann COM 4 geoeffnet werden; Beispiel:
'OPEN "COM2:2400,N,8,1,RS,CS,DS,CD" FOR RANDOM AS #1
' ^ !
'
'Erneuter Aufruf stellt Originalzustand her:
Ergebnis% = COM24%
'
CALL Anzeige(Ergebnis%)
'
SUB Anzeige (Ergebnis%)
'wertet den Rckgabewert von COM13% und COM24% aus und
'zeigt entsprechende Meldungen an.
'
SELECT CASE Ergebnis%
CASE 1
PRINT "Tausch COM 1 - COM 3 zurueckgesetzt."
CASE 2
PRINT "Tausch COM 2 - COM 4 zurueckgesetzt."
CASE 3
PRINT "COM 3 jetzt mit OPEN COM1:... nutzbar!"
CASE 4
PRINT "COM 4 jetzt mit OPEN COM2:... nutzbar!"
CASE IS < 0
PortNr% = Ergebnis% * -1
PRINT "FEHLER! COM"; PortNr%; "nicht gefunden."
CASE ELSE
PRINT "Umbestimmter Fehler!"
END SELECT
PRINT
'
END SUB
'
FUNCTION COM13%
'Ueberschreibt die I/O Basisadresse von COM 1 im BIOS-Datenbereich, mit der
'Basisadresse von COM 3 und macht so COM 3 nutzbar. Bei erneutem Aufruf wird
'der Originalzustand wieder hergestellt. Die FUNCTION liefert folgende Werte:
' 1 = Originalzustand COM 1 = COM 1
' 3 = COM 3 als COM 1 ansprechbar
'-1 = COM 1 nicht gefunden
'-3 = COM 3 nicht gefunden
'
STATIC COM1l%, COM1h%, COM3l%, COM3h%, COMx%
'
DEF SEG = 0 'BIOS-Datensegment setzen
'Beim ersten Aufruf Originaladressen sichern:
IF COMx% = 0 THEN
COM1l% = PEEK(&H400) 'LowByte Basisadresse COM 1
COM1h% = PEEK(&H401) 'HighByte Basisadresse COM 1
COM3l% = PEEK(&H404) 'LowByte ?Basisadresse COM 3
COM3h% = PEEK(&H405) 'HighByte Basisadresse COM 3
COMx% = 1
END IF
'
'Wenn COM 1 nicht vorhanden:
IF COM1l% + COM1h% = 0 THEN COMx% = -1
'
'Wenn COM 3 nicht vorhanden:
IF COM3l% + COM3h% = 0 THEN COMx% = -3
'
IF COMx% = 1 THEN 'Wenn noch nicht getauscht ..
POKE &H400, COM3l% 'LowByte von COM 3 in Datenbereich von COM 1 schreiben
POKE &H401, COM3h% 'HighByte von COM 3 in Datenbereich von COM 1 schreiben
COMx% = 3 'Rueckgabewert setzen
ELSEIF COMx% = 3 THEN 'Wenn bereits getauscht war ...
POKE &H400, COM1l% 'Originaladressen wieder herstellen
POKE &H401, COM1h% '
COMx% = 1 'Rueckgabewert setzen
END IF
'
DEF SEG 'Segment wieder herstellen
'
COM13% = COMx%
'
END FUNCTION
'
FUNCTION COM24%
'Ueberschreibt die I/O Basisadresse von COM 2 im BIOS-Datenbereich, mit der
'Basisadresse von COM 4 und macht so COM 4 nutzbar. Bei erneutem Aufruf wird
'der Originalzustand wieder hergestellt. Die FUNCTION liefert folgende Werte:
' 2 = Originalzustand COM 2 = COM 2
' 4 = COM 4 als COM 2 ansprechbar
'-2 = COM 2 nicht gefunden
'-4 = COM 4 nicht gefunden
'
STATIC COM2l%, COM2h%, COM4l%, COM4h%, COMx%
'
DEF SEG = 0 'BIOS-Datensegment setzen
'
'Beim ersten Aufruf Originaladressen sichern:
IF COMx% = 0 THEN
COM2l% = PEEK(&H402) 'LowByte Basisadresse COM 2
COM2h% = PEEK(&H403) 'HighByte Basisadresse COM 2
COM4l% = PEEK(&H406) 'LowByte ?Basisadresse COM 4
COM4h% = PEEK(&H407) 'HighByte Basisadresse COM 4
COMx% = 2
END IF
'
'Wenn COM 2 nicht vorhanden:
IF COM2l% + COM2h% = 0 THEN COMx% = -2
'
'Wenn COM 4 nicht vorhanden:
IF COM4l% + COM4h% = 0 THEN COMx% = -4
'
'
IF COMx% = 2 THEN 'Wenn noch nicht getauscht ..
POKE &H402, COM4l% 'LowByte von COM 4 in Datenbereich von COM 2 schreiben
POKE &H403, COM4h% 'HighByte von COM 4 in Datenbereich von COM 2 schreiben
COMx% = 4 'Rueckgabewert setzen
ELSEIF COMx% = 4 THEN 'Wenn bereits getauscht war ...
POKE &H402, COM2l% 'Originaladressen wieder herstellen
POKE &H403, COM2h% '
COMx% = 2 'Rueckgabwert setzen
END IF
'
DEF SEG 'Segment wieder herstellen
'
COM24% = COMx%
'
END FUNCTION
 
 
 

Answer 4
~~~~~~~~~~
[ from the QB-FAQ 1 of the Microsoft Knowledge Base at
http://www.microsoft.com ]
 
Question:
Why doesn't QuickBasic support COM3 and COM4 serial ports?
 

Response:
Support for these two additional communications ports requires a larger code size for QuickBasic in both the compiler and the run-time module. Therefore, the decision was made NOT to support COM3 and COM4.
 
The QuickBasic compiler supports the use of serial communications ports COM1 and COM2 through the use of the OPEN "COM" statement.
 
To access COM3 and COM4, it is possible for compiled Basic to call third-party library routines, which are listed in catalogs such as the "Provantage Buyer's Guide" [in the United States: (800) 336-1166, in Canada: (800) 225-1166, Customer Service: (216) 494-8899]. For example, you may want to contact the Software Interphase Company to determine if its QuickComm product supports COM3 and COM4, which are called from Microsoft compiled Basic.
 
 
 
Answer 5
~~~~~~~~~~~~~~~~
[ from Wouter Bergmann Tiest's BASIC-FAQ - www.fys.ruu.nl/~bergmann/basic-faq.html ]
 

How To Control COM3?
 
The below program COMM3.BAS is an example of how to swap COM ports 2 and 3, so you can use COM3.
It came from Maria Mukurasi.
 
'******************************************
' COMM3.BAS
'******************************************
DEFINT C
'-- read Com2 and Com3 adrresses
DEF SEG = 0
Com2 = PEEK(&H402) + 256 * PEEK(&H403)
Com3 = PEEK(&H404) + 256 * PEEK(&H405)
'
'-- swap the Com2 and Com3 adrresses
POKE &H402, Com3 AND 255
POKE &H403, Com3 \ 256
'
POKE &H404, Com2 AND 255
POKE &H405, Com2 \ 256
'
'** The following is a simple test **************************
'** Tested on a Hayes compatible modem (ON COM3) and my friends
'** voice telephone number. Since the ports have been swapped
'** you open COM2 instead of COM3
'
CLS
'
FINO = FREEFILE
OPEN "Com2:2400,N,8,1,RS,DS" FOR RANDOM AS #FINO LEN = 40
'
'--- Dial 999 9999 NB: please substitute this phone number
' it's my friend's and he won't like it if you call
' commas give the phone some time to respond before cutting off
PRINT #FINO, "ATDT 560 6441,,,,,,,,,,,,,"
'
PRINT "Press any key to hang up..."
k$ = INPUT$(1)
'
'--- Hang up the line
PRINT #FINO, "ATH+++"
CLOSE #FINO
'
'-- restore the Com2 and Com3 adrresses
'*** This is very important, if not done you'll have to reset
'*** your system before this test can work again. Also, if you have
'*** some thing connected to the ports, they may be messed up until
'*** after reset.
'
POKE &H402, Com2 AND 255
POKE &H403, Com2 \ 256
'
POKE &H404, Com3 AND 255
POKE &H405, Com3 \ 256
END

 

[ The QBasic-MonsterFAQ --- Start Page: www.antonis.de/faq ]