OPEN COM
From QB64 Wiki
The OPEN COM statement is used to access a computer's Serial port COM1 or COM2 address using an OPEN statement.
- OPEN "COMn: Speed, Parity, Bits, Stopbit, [Options]" [FOR mode] AS #P [LEN = bytesize]
- QB64 can open any COMn port number. Qbasic could only open COM1 or COM2, but 3 and 4 could be swapped.
- 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.
- Speed(baud rate): 50, 150, 300, 600, 1200, 1800, 2400, 9600(QB max), 19200 or 115200(QB64 max) 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
- 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 MAC versions
- Below m is the timeout in milliseconds 1 to 65535. Zero ignores a timeout. Default m = 1000 :
- CD[m] : Time until timeout of DCD (Carrier Detect) line in. CD0 ignores timeouts.
- CS[m] : Time until timeout of CTS (Clear to Send) line in. CS0 ignores timeouts.
- DS[m] : Time until timeout of DSR (Data Set Ready) line in. DS0 ignores timeouts.
- OP[m] : Time until data lines become active. If timeout then OPEN fails! OP0 ignores timeouts.
- If any timeouts occur the OPEN will fail or port access will stop!
- 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.
- INPUT mode can use INPUT # or INPUT$. OUTPUT mode can use PRINT # or PRINT #, USING.
- RANDOM or BIN modes can use INPUT #, INPUT$, PRINT #, GET or PUT. BIN cannot set a buffer size!
- Note: If random use LEN = to set size of random buffer(default LEN = 128). Use multiples of 128 for larger buffers.
- NOTE: NT or XP computers need a program like PortTalk to access COM or other ports with Qbasic only!
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!"
See also:
- INPUT$, PRINT #
- LOC, INKEY$, OPEN
- GET #, PUT #
- Port Access Libraries (COM or LPT)
- Enumerating Windows Ports