OPEN COM: Difference between revisions

From QB64 Phoenix Edition Wiki
Jump to navigation Jump to search
No edit summary
No edit summary
 
(9 intermediate revisions by the same user not shown)
Line 6: Line 6:




{{Parameters}}
{{PageParameters}}
* ''Speed'' (baud rate): 50, 150, 300, 600, 1200, 1800, 2400, '''9600''' (QBasic's maximum), 19200 or '''115200''' ('''QB64''''s maximum).
* ''Speed'' (baud rate): 50, 150, 300, 600, 1200, 1800, 2400, '''9600''' (QBasic's maximum), 19200 or '''115200''' ('''QB64''''s maximum).
* ''Parity'': '''N''' (none), E (even), O (odd), S (space) or M (mark). Note: If 8 bits, use parity N for numerical data.
* ''Parity'': '''N''' (none), E (even), O (odd), S (space) or M (mark). Note: If 8 bits, use parity N for numerical data.
Line 25: Line 25:


{{PageDescription}}
{{PageDescription}}
* '''If any optional CD, CS, DS or OP timeouts occur the OPEN will fail or port access will stop. Try 0 to ignore.'''  
* '''If any optional CD, CS, DS or OP timeouts occur the OPEN will fail or port access will stop. Try 0 to ignore.'''
* '''QB64''' can open any COM''n'' port number from 1 to 9.
* '''QB64''' can open any COM''n'' port number from 1 to 9.
* See Windows System '''Device Manager''' for COM port numbers and port addresses &H3F8, &H2F8, &H3E8 and &H2E8.
* See Windows System '''Device Manager''' for COM port numbers and port addresses &H3F8, &H2F8, &H3E8 and &H2E8.
* Four commas are required after the Speed, Parity, Bits, and Stopbit, even if none of the Options are used.
* Four commas are required after the Speed, Parity, Bits, and Stopbit, even if none of the Options are used.
* Other [[OPEN]] ''options'' are optional and in any order separated by commas within the OPEN command [[STRING|string]].(See list below)
* Other [[OPEN]] ''options'' are optional and in any order separated by commas within the OPEN command [[STRING|string]].(See list below)
* The optional FOR access ''mode'' can be [[OUTPUT]], [[INPUT (file mode)|INPUT]] or [[RANDOM]] (default mode when no FOR statement is used).  
* The optional FOR access ''mode'' can be [[OUTPUT]], [[INPUT (file mode)|INPUT]] or [[RANDOM]] (default mode when no FOR statement is used).
* '''Currently, QB64 only supports [[OPEN]] FOR [[RANDOM]] access using the [[GET]]/[[PUT]] commands in [[BINARY|BIN]] mode.'''
* '''Currently, QB64 only supports [[OPEN]] FOR [[RANDOM]] access using the [[GET]]/[[PUT]] commands in [[BINARY|BIN]] mode.'''
* '''Use the BIN option listed below for [[BINARY]] byte mode port access.'''
* '''Use the BIN option listed below for [[BINARY]] byte mode port access.'''
Line 36: Line 36:
* Use the [[LOC]](portnumber) function to determine that there is data in the receive buffer when the value is greater than 0.
* Use the [[LOC]](portnumber) function to determine that there is data in the receive buffer when the value is greater than 0.
* OPEN AS number can use a [[FREEFILE]] value. Numbers used by files already open '''cannot''' be used by OPEN COM.
* OPEN AS number can use a [[FREEFILE]] value. Numbers used by files already open '''cannot''' be used by OPEN COM.
* [[Keywords_currently_not_supported_by_QB64#Keywords_Not_Supported_in_Linux_or_MAC_OSX_versions|Keyword Not Supported in Linux or MAC versions]]
* '''[[Keywords currently not supported by QB64#Keywords_not_supported_in_Linux_or_macOS_versions|Keyword not supported in Linux or macOS versions]]'''




{{PageExamples}}
{{PageExamples}}
''Example 1:'' Checking to see if a COM port exists. If the port does not exist QBasic will cause a Windows access error.  
''Example 1:'' Checking to see if a COM port exists. If the port does not exist QBasic will cause a Windows access error.
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|ON ERROR}} {{Cl|GOTO}} Handler  
{{Cl|ON ERROR}} {{Cl|GOTO}} Handler
FF = {{Cl|FREEFILE}}
FF = {{Cl|FREEFILE}}
comPort$ = "COM1:"                        'try a COM port number that does not exist
comPort$ = "COM1:"                        'try a COM port number that does not exist
{{Cl|CONST}} comMode$ = "9600,N,8,1,CS0,DS0"      'Use 0 to avoid timeouts  
{{Cl|CONST}} comMode$ = "9600,N,8,1,CS0,DS0"      'Use 0 to avoid timeouts
{{Cl|OPEN}} comPort$ + comMode$ {{Cl|FOR...NEXT|FOR}} {{Cl|RANDOM}} {{Cl|AS}} FF  
{{Cl|OPEN}} comPort$ + comMode$ {{Cl|FOR...NEXT|FOR}} {{Cl|RANDOM}} {{Cl|AS}} FF
{{Cl|IF...THEN|IF}} errnum = 0 {{Cl|THEN}} {{Cl|PRINT}} "COM exists!
{{Cl|IF...THEN|IF}} errnum = 0 {{Cl|THEN}} {{Cl|PRINT}} "COM exists!


K$ = {{Cl|INPUT$}}(1)  
K$ = {{Cl|INPUT$}}(1)
{{Cl|END}}  
{{Cl|END}}


Handler:  
Handler:
errnum = {{Cl|ERR}}  
errnum = {{Cl|ERR}}
{{Cl|PRINT}} "Error:"; errnum
{{Cl|PRINT}} "Error:"; errnum
{{Cl|RESUME}} {{Cl|NEXT}}  
{{Cl|RESUME}} {{Cl|NEXT}}
{{CodeEnd}}
{{CodeEnd}}
: ''Explanation:'' QB64 may create error 68 if COM is not found. Use a zero CD, CS, DS or OP timeout value to avoid COM timeouts.
: ''Explanation:'' QB64 may create error 68 if COM is not found. Use a zero CD, CS, DS or OP timeout value to avoid COM timeouts.
Line 61: Line 61:


''Example 2:'' Opening a COM port with the BIN, CS0 and DS0 options in '''QB64'''.
''Example 2:'' Opening a COM port with the BIN, CS0 and DS0 options in '''QB64'''.
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|DIM}} bytestr {{Cl|AS}} {{Cl|STRING}} * 1  'one byte transfers
{{Cl|DIM}} bytestr {{Cl|AS}} {{Cl|STRING}} * 1  'one byte transfers
{{Cl|INPUT}} "{{Cl|COM}} port number #", port$  'any COM port number available
{{Cl|INPUT}} "COM port number #", port$  'any COM port number available


{{Cl|OPEN}} "{{Cl|COM}}" + port$ + ":9600,N,8,1,BIN,CS0,DS0" {{Cl|FOR (file statement)|FOR}} {{Cl|RANDOM}} {{Cl|AS}} #1
{{Cl|OPEN}} "COM" + port$ + ":9600,N,8,1,BIN,CS0,DS0" {{Cl|FOR (file statement)|FOR}} {{Cl|RANDOM}} {{Cl|AS}} #1
{{Cl|DO}} 'main loop
{{Cl|DO}} 'main loop
     'receive data in buffer when LOC > 0
     'receive data in buffer when LOC > 0
     {{Cl|IF}} {{Cl|LOC}}(1) {{Cl|THEN}}  
     {{Cl|IF}} {{Cl|LOC}}(1) {{Cl|THEN}}
       {{Cl|GET}} #1, , bytestr
       {{Cl|GET}} #1, , bytestr
       {{Cl|PRINT}} "[" + bytestr + "]";
       {{Cl|PRINT}} "[" + bytestr + "]";
     {{Cl|END IF}}
     {{Cl|END IF}}
     'transmit (send)
     'transmit (send)
     k$ = {{Cl|INKEY$}}
     k$ = {{Cl|INKEY$}}
     {{Cl|IF}} {{Cl|LEN}}(k$) = 1 {{Cl|THEN}}
     {{Cl|IF}} {{Cl|LEN}}(k$) = 1 {{Cl|THEN}}
       k = {{Cl|ASC}}(k$)
       k = {{Cl|ASC (function)|ASC}}(k$)
       {{Cl|IF}} k >= 32 {{Cl|THEN}}    'ignore control key codes
       {{Cl|IF}} k >= 32 {{Cl|THEN}}    'ignore control key codes
           {{Cl|PRINT}} ">" + k$ + "<";
           {{Cl|PRINT}} ">" + k$ + "<";
Line 82: Line 82:
     {{Cl|END IF}}
     {{Cl|END IF}}
{{Cl|LOOP}} {{Cl|UNTIL}} k$ = {{Cl|CHR$}}(27)
{{Cl|LOOP}} {{Cl|UNTIL}} k$ = {{Cl|CHR$}}(27)
{{Cl|CLOSE}} #1: {{Cl|PRINT}} "Finished!" '' ''
{{Cl|CLOSE}} #1: {{Cl|PRINT}} "Finished!"
{{CodeEnd}}
{{CodeEnd}}




''Example 3:'' Sending string data from one COM port to another requires predefined length strings:
''Example 3:'' Sending string data from one COM port to another requires predefined length strings:
{{CodeStart}} '' ''
{{CodeStart}}
{{Cl|DIM}} {{Cl|SHARED}} ByteIn {{Cl|AS}} {{Cl|STRING}} * 1 'One byte transfers
{{Cl|DIM}} {{Cl|SHARED}} ByteIn {{Cl|AS}} {{Cl|STRING}} * 1 'One byte transfers
{{Cl|DIM}} {{Cl|SHARED}} Byte4 {{Cl|AS}} {{Cl|STRING}} * 4 'Four byte transfers
{{Cl|DIM}} {{Cl|SHARED}} Byte4 {{Cl|AS}} {{Cl|STRING}} * 4 'Four byte transfers
Line 98: Line 98:
{{Cl|PUT}} #1, , Byte4 'Send the 4 byte command.
{{Cl|PUT}} #1, , Byte4 'Send the 4 byte command.


Start# = {{Cl|TIMER}}
Start# = {{Cl|TIMER (function)|TIMER}}
{{Cl|DO...LOOP|DO}} {{Cl|UNTIL}} {{Cl|LOC}}(2) <> 0 'Check if there is data received at com2
{{Cl|DO...LOOP|DO}} {{Cl|UNTIL}} {{Cl|LOC}}(2) <> 0 'Check if there is data received at com2
     {{Cl|IF...THEN|IF}} {{Cl|TIMER}} - Start# > .5 {{Cl|THEN}} {{Cl|EXIT DO}} 'Exit loop if no data arrives within .5 seconds.
     {{Cl|IF...THEN|IF}} {{Cl|TIMER (function)|TIMER}} - Start# > .5 {{Cl|THEN}} {{Cl|EXIT DO}} 'Exit loop if no data arrives within .5 seconds.
{{Cl|LOOP}}
{{Cl|LOOP}}


Line 112: Line 112:
{{Cl|DO...LOOP|DO}} {{Cl|UNTIL}} {{Cl|LOC}}(2) = 0 'Read data from COM2 until there is no more data.
{{Cl|DO...LOOP|DO}} {{Cl|UNTIL}} {{Cl|LOC}}(2) = 0 'Read data from COM2 until there is no more data.
     {{Cl|GET}} #2, , ByteIn
     {{Cl|GET}} #2, , ByteIn
     {{Cl|PRINT}} {{Cl|ASC}}(ByteIn);
     {{Cl|PRINT}} {{Cl|ASC (function)|ASC}}(ByteIn);
{{Cl|LOOP}}
{{Cl|LOOP}}
{{Cl|END}} '' ''
{{Cl|END}}
{{CodeEnd}}{{small|Code courtesy of forum member Hydrofoiler}}
{{CodeEnd}}
{{Small|Code courtesy of Hydrofoiler}}




{{PageSeeAlso}}
{{PageSeeAlso}}
* [[BINARY]], [[RANDOM]]  
* [[BINARY]], [[RANDOM]]
* [[INPUT$]], [[PRINT (file statement)|PRINT #]]
* [[INPUT$]], [[PRINT (file statement)|PRINT #]]
* [[LOC]], [[INKEY$]], [[OPEN]]
* [[LOC]], [[INKEY$]], [[OPEN]]
* [[GET|GET #]], [[PUT|PUT #]]
* [[GET|GET #]], [[PUT|PUT #]]
* [[Port Access Libraries]] {{text|(Includes full LPT and COM port descriptions with downloadable DLL library)}}
* [[Port Access Libraries]]
* [[Windows_Libraries#Windows_Ports|Enumerating Windows Ports]]
* [[Windows Libraries#Windows_Ports|Enumerating Windows Ports]]




{{PageNavigation}}
{{PageNavigation}}

Latest revision as of 22:55, 19 February 2024

The OPEN COM statement is used to access a computer's serial port COM.


Syntax

OPEN "COMn: Speed, Parity, Bits, Stopbit, [Options]" [FOR {RANDOM|BINARY|OUTPUT|INPUT}] AS #P [LEN = byteSize]


Parameters

  • Speed (baud rate): 50, 150, 300, 600, 1200, 1800, 2400, 9600 (QBasic's maximum), 19200 or 115200 (QB64's maximum).
  • Parity: N (none), E (even), O (odd), S (space) or M (mark). Note: If 8 bits, use parity N for numerical data.
  • Bits = number of bits/byte: Valid numbers: 5, 6, 7 or 8
  • Stopbit = number of stop bits: Valid numbers: 1, 1.5 or 2
  • Optional COM port Options (separated by commas):
  • ASC : ASCII byte mode. End of line = CHR$(13). End of file = CHR$(26)
  • BIN : Binary byte mode. Default mode if ASC is not used(option not required).
Below ms is the timeout in milliseconds 1 to 65535. Zero ignores a timeout. Default without ms = 1000 :
  • CD[ms] : Time until timeout of DCD (Carrier Detect) line in. CD0 ignores timeouts.
  • CS[ms] : Time until timeout of CTS (Clear to Send) line in. CS0 ignores timeouts.
  • DS[ms] : Time until timeout of DSR (Data Set Ready) line in. DS0 ignores timeouts.
  • OP[ms] : Time until data lines become active. If timeout then OPEN fails, OP0 ignores timeouts.
  • RB[b] : Size of receive buffer in bytes when used. Default when not used = 512 bytes
  • TB[b] : Size of transmit buffer in bytes when used. Default when not used = 512 bytes
  • RS  : Supress detection of Request to Send (RTS) line.


Description

  • If any optional CD, CS, DS or OP timeouts occur the OPEN will fail or port access will stop. Try 0 to ignore.
  • QB64 can open any COMn port number from 1 to 9.
  • See Windows System Device Manager for COM port numbers and port addresses &H3F8, &H2F8, &H3E8 and &H2E8.
  • Four commas are required after the Speed, Parity, Bits, and Stopbit, even if none of the Options are used.
  • Other OPEN options are optional and in any order separated by commas within the OPEN command string.(See list below)
  • The optional FOR access mode can be OUTPUT, INPUT or RANDOM (default mode when no FOR statement is used).
  • Currently, QB64 only supports OPEN FOR RANDOM access using the GET/PUT commands in BIN mode.
  • Use the BIN option listed below for BINARY byte mode port access.
  • The LEN statement is also optional. The default record size is 512 bytes when not used.
  • Use the LOC(portnumber) function to determine that there is data in the receive buffer when the value is greater than 0.
  • OPEN AS number can use a FREEFILE value. Numbers used by files already open cannot be used by OPEN COM.
  • Keyword not supported in Linux or macOS versions


Examples

Example 1: Checking to see if a COM port exists. If the port does not exist QBasic will cause a Windows access error.

ON ERROR GOTO Handler
FF = FREEFILE
comPort$ = "COM1:"                         'try a COM port number that does not exist
CONST comMode$ = "9600,N,8,1,CS0,DS0"      'Use 0 to avoid timeouts
OPEN comPort$ + comMode$ FOR RANDOM AS FF
IF errnum = 0 THEN PRINT "COM exists!

K$ = INPUT$(1)
END

Handler:
errnum = ERR
PRINT "Error:"; errnum
RESUME NEXT
Explanation: QB64 may create error 68 if COM is not found. Use a zero CD, CS, DS or OP timeout value to avoid COM timeouts.


Example 2: Opening a COM port with the BIN, CS0 and DS0 options in QB64.

DIM bytestr AS STRING * 1  'one byte transfers
INPUT "COM port number #", port$  'any COM port number available

OPEN "COM" + port$ + ":9600,N,8,1,BIN,CS0,DS0" FOR RANDOM AS #1
DO 'main loop
    'receive data in buffer when LOC > 0
    IF LOC(1) THEN
       GET #1, , bytestr
       PRINT "[" + bytestr + "]";
    END IF
    'transmit (send)
    k$ = INKEY$
    IF LEN(k$) = 1 THEN
       k = ASC(k$)
       IF k >= 32 THEN     'ignore control key codes
           PRINT ">" + k$ + "<";
           bytestr = k$: PUT #1, , bytestr
       END IF
    END IF
LOOP UNTIL k$ = CHR$(27)
CLOSE #1: PRINT "Finished!"


Example 3: Sending string data from one COM port to another requires predefined length strings:

DIM SHARED ByteIn AS STRING * 1 'One byte transfers
DIM SHARED Byte4 AS STRING * 4 'Four byte transfers

Byte4 = CHR$(254) + CHR$(175) + CHR$(0) + CHR$(3) 'Command code to query all 4 banks of switch input board.

OPEN "COM1:115200,N,8,1,BIN,CS0,DS0" FOR RANDOM AS #1 'Open port used to send commands.
OPEN "COM2:115200,N,8,1,BIN,CS0,DS0" FOR RANDOM AS #2 'Open port used to receive commands.

PUT #1, , Byte4 'Send the 4 byte command.

Start# = TIMER
DO UNTIL LOC(2) <> 0 'Check if there is data received at com2
    IF TIMER - Start# > .5 THEN EXIT DO 'Exit loop if no data arrives within .5 seconds.
LOOP

IF LOC(2) = 0 THEN 'If no data was received.....
    PRINT "No data received from COM port."
    END
END IF

PRINT "Received from COM2:";

DO UNTIL LOC(2) = 0 'Read data from COM2 until there is no more data.
    GET #2, , ByteIn
    PRINT ASC(ByteIn);
LOOP
END
Code courtesy of Hydrofoiler


See also



Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link