×
INTELLIGENT WORK FORUMS
FOR COMPUTER PROFESSIONALS

Contact US

Log In

Come Join Us!

Are you a
Computer / IT professional?
Join Tek-Tips Forums!
  • Talk With Other Members
  • Be Notified Of Responses
    To Your Posts
  • Keyword Search
  • One-Click Access To Your
    Favorite Forums
  • Automated Signatures
    On Your Posts
  • Best Of All, It's Free!

*Tek-Tips's functionality depends on members receiving e-mail. By joining you are opting in to receive e-mail.

Posting Guidelines

Promoting, selling, recruiting, coursework and thesis posting is forbidden.

Students Click Here

QBasic FAQ

I/O

Another terminal program by qbasicking
Posted: 15 Dec 03

I've refered numerous people to a program called basterm.bas by Mark Kim, so here it is for quick reference.


'BASTerm.BAS Version 1.2d
'A terminal example program in QBASIC (Freeware)
'Copyright (C)1995-1996 Mark Kim
'* Supports basic I/O from/to modem.
'* Supports only COM1 and COM2
'* ANSI support (with ANSI.SYS)
'* No upload or download support in any mode.
'* No guarentee, warentee, or any type of -rentees whatsoever.  Use at your
'  own risk.
'* No distribution after modification.  Parts of this file may be used in
'  others' programs provided that credit is given in proper place(s).  Must
'  include in the credit where the original file (this) can be found.
'Comments via Internet E-Mail to: markkkim@aol.com
'Older versions of the program is available.  Contact the author for info.
'RUN SETUP FROM THE MENU FIRST!!!

'Function/Sub declarations
DECLARE SUB opencom ()     'opens com port for communication
DECLARE FUNCTION menu% ()  'displays menu and accepts&returns input
DECLARE SUB waitforcall () 'waits for a call and connects when modem rings
DECLARE SUB callbbs ()     'calls a place and connects
DECLARE SUB setmodemoption ()  'sets modem option and saves it to a file
DECLARE SUB endprog ()     'ends the program
DECLARE SUB connect ()     'connects and handles output/input to/from modem

'Change this value to other values to change the key that cuts communication
CONST HALT = 27    'ASCII value for Escape key

CLS
COLOR 6
DO    'loop until user tells the program to end program
  item% = menu%    'run menu function and store return value to item integer
  SELECT CASE item%      'run subs according to the option chosen
    CASE 1: waitforcall
    CASE 2: callbbs
    CASE 3: setmodemoption
    CASE 4: endprog
  END SELECT
LOOP UNTIL item% = 4     '4 is the value that ends the loop
SYSTEM                   'exit to DOS, if it was called directly from DOS

'VERSION HISTORY:
' Version 1.0a:
' Version 1.0b:
'   Fixed: Now setmodemoption sub creates CFG instead of INI.
'   Updated: More efficient/modifiable input-from-modem process.
' Version 1.1a:
'   Fixed: Some spelling/grammar errors in comments
'   Updated: Option to print the outgoing data to screen, a process
'     needed when connecting to other terminal programs (not BBS program)
'   (never released)
' Version 1.2a:
'   Fixed: Forgot to add local echo option -- oops!  While I'm at it,
'     options menu added.
'   Updated: ANSI support.  Requires ANSI.SYS to be loaded.  Special thanks
'     to Ariel R. Benzakein (He's a guy!) from AOL for the ANSI tip.
'   Bug: Because the program uses PRINT and PRINT to CON, the alignment of
'     the screen does not look that great.  Oh well.
' Version 1.2b:
'   Fixed: Some unnecessary commentted lines of programming were deleted
'   Fixed: "Local echo enabled" message changed to "Local echo toggled"
' Version 1.2c:
'   Fixed: "END IF without IF" error statement corrected
' Version 1.2d:
'   Fixed: Bug with not printing anything to the screen was fixed (oops!)
'   Updated: ASCII 254 "remarks start indicators" changed to asterisk

'A sub that calls another computer via modem...
'I just call it callbbs because I am testing it on a BBS
SUB callbbs
  COLOR 3
  INPUT "Number to call: ", number$
  opencom  'a sub that opens the com port for communication
  PRINT #1, "ATDT" + number$  'call the number in tone (not pulse)
  PRINT "Calling " + number$ + "...."
  connect  'a sub to processes data and sends/receives it via modem
END SUB

'A sub that processes and exchanges data between the modems
SUB connect
  echo% = 0                   'local echo.  0 = off, 1 = on
  PRINT "Start Typing when modems connect... Press <Esc> for options or to quit:"
  PRINT
  OPEN "CON" FOR OUTPUT AS #3 'open screen for output (to get ANSI support)
  DO
    'User enters stuff
    ch$ = INKEY$              'get a character from keyboard, if any is typed
    IF ch$ = CHR$(HALT) THEN  'if ESC pressed
      PRINT "====== OPTIONS ======="
      PRINT "1. Local echo on/off  "
      PRINT "2. Send HALT character (<ESC> by default)"
      PRINT "3. Close port         "
      PRINT "4. Return to terminal "
      SELECT CASE INPUT$(1)   'input a character and select case at same time
        CASE "1":
          echo% = echo% XOR 1            'toggle echo% between 0 and 1
          PRINT "Local echo toggled. Returning to terminal...."
        CASE "2":
          PRINT #1, CHR$(HALT)           'send #1 the HALT character (ESC)
          PRINT "HALT character sent. Returning to terminal...."
        CASE "3": EXIT DO                'exitting DO closes port
        CASE "4":                        'acknowledges pressing 4, but does X
        CASE ELSE:
          PRINT "Invalid option! Returning to terminal...."
      END SELECT
    ELSEIF ch$ <> "" THEN PRINT #1, ch$; 'if something is typed send to modem
    END IF
    IF echo% = 1 THEN         'if local echo enabled
      PRINT #3, ch$;          'print to monitor using ANSI.SYS, if avail
    END IF
    'Messages received
    'input message:
    ' LOC(1) is zero if nothing is in the buffer.  Otherwise it tells
    ' how big the incoming data is.  So if there is anything in the buffer
    ' input 1 character, the line says:
    IF LOC(1) <> 0 THEN
      inchar$ = INPUT$(1, #1)
    ELSE
      inchar$ = ""
    END IF
    PRINT #3, inchar$;    'print the character (using ANSI.SYS if avail)
  LOOP
  CLOSE #1   'close the file once done
  CLOSE #3   'close the screen of ANSI support
END SUB

'This is how the program ends
SUB endprog
  COLOR 7
  PRINT "Ending Program."
END SUB

'Draws menu and returns the option the user typed
FUNCTION menu%
  DO    'a loop to draw the menu over and over until a valid option is typed
    COLOR 5
    PRINT "==== BASTerm Menu ===="
    PRINT " 1. Wait for a call  "
    PRINT " 2. Call somewhere    "
    PRINT " 3. Set Modem options "
    PRINT " 4. End Program       "
    PRINT "     Choose One: ";       'A semicolon is needed to have cursor
                                     'at the end instead of next line
    LOCATE , , 1: ch$ = INPUT$(1)  'LOCATE,,1 is to show the cursor...
                                   'the cursor is otherwise hidden during
                                   'INPUT$(1) operation
    PRINT : PRINT   'go to the next line then skip a line
  LOOP UNTIL VAL(ch$) >= 1 AND VAL(ch$) <= 4  'until 1,2,3, or 4 is entered
  menu% = VAL(ch$)  'returns the typed option to the function's caller
END FUNCTION

'Opens the comport for communication
SUB opencom
  PRINT "Retrieving COM port data.  Please hold."  'it didn't take long
                                                   'before but it does now!
  'open configuration file to input comport data:
  OPEN "BASTerm.CFG" FOR INPUT AS #2    'open config file for data input
  INPUT #2, comport$    'input the line
  CLOSE #2     'close file
  'open comport using data from the file:
  'RB2048 and TB2048 are the buffer sizes.  Bigger the buffer size the
  'more stable they are.  I think they maybe are used up as the data
  'comes in and out but I think maybe they are the sizes of the data
  'that can be held at once.  This can cause trouble if you Ctrl-Brk
  'during connection to fix parts of the program so make them pretty
  'big.
  OPEN comport$ + ",N,8,1,RB2048,TB2048" FOR RANDOM AS #1
END SUB

'Asks and saves new com port information
SUB setmodemoption
  COLOR 2
  INPUT "COM Port Number (1 or 2): ", portno$
  INPUT "Modem Speed (300, 1200, 2400, etc): ", speed$
  PRINT "Are The Settings Right? ";
  ch$ = INPUT$(1)
  IF ch$ = "Y" OR ch$ = "y" THEN    'if Y or y is entered
    PRINT "Yes"   'print Yes... something fancy here....
    comport$ = "COM" + portno$ + ":" + speed$  'put the data into a variable
    OPEN "BASTerm.CFG" FOR OUTPUT AS #2  'open the config file for output
    PRINT #2, comport$   'store data
    CLOSE #2    'close file
    PRINT "Settings saved."
  ELSE   'anything other than Y or y is entered
    PRINT "No"  'print No... something fancy here....
    PRINT "Disregarding New Settings...."
  END IF
  PRINT
END SUB

'A function that sets the modem to detect ringing and then connect
SUB waitforcall
  COLOR 3
  opencom       'open comport
  PRINT #1, "ATS0=1"    'ATS0=1 is used to connect after 1 ring.
  connect       'make communcation between modems available when the
                'connection is made
END SUB


Back to QBasic FAQ Index
Back to QBasic Forum

My Archive

Close Box

Join Tek-Tips® Today!

Join your peers on the Internet's largest technical computer professional community.
It's easy to join and it's free.

Here's Why Members Love Tek-Tips Forums:

Register now while it's still free!

Already a member? Close this window and log in.

Join Us             Close