OPEN COM: Difference between revisions
Jump to navigation
Jump to search
Code courtesy of Hydrofoiler
Navigation:
Main Page with Articles and Tutorials
Keyword Reference - Alphabetical
Keyword Reference - By usage
Report a broken link
No edit summary |
No edit summary |
||
(7 intermediate revisions by the same user not shown) | |||
Line 6: | Line 6: | ||
{{ | {{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_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}} "COM port number #", port$ 'any COM port number available | {{Cl|INPUT}} "COM port number #", port$ 'any COM port number available | ||
Line 68: | Line 68: | ||
{{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}}{{ | {{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]] | * [[Port Access Libraries]] | ||
* [[ | * [[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):
- 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 |
See also
- BINARY, RANDOM
- INPUT$, PRINT #
- LOC, INKEY$, OPEN
- GET #, PUT #
- Port Access Libraries
- Enumerating Windows Ports