OPEN

Top  Previous  Next

Action

Opens a device.

 

 

Syntax

OPEN "device" for MODE As #channel

OPEN file FOR MODE as #channel

 

 

Remarks

Device

The default device is COM1 and you don't need to open a channel to use INPUT/OUTPUT on this device.

 

With the implementation of the software UART, the compiler must know to which pin/device you will send/receive the data.

So that is why the OPEN statement must be used. It tells the compiler about the pin you use for the serial input or output and the baud rate you want to use.

COMB.0:9600,8,N,2 will use PORT B.0 at 9600 baud with 2 stop bits.

 

The format for COM1 and COM2 is : COM1: or COM2:

 

There is no speed/baud rate parameter since the default baud rate will be used that is specified with $BAUD or $BAUD1

 

The format for the software UART is: COMpin:speed,8,N,stopbits[,INVERTED]

Where pin is the name of the PORT-pin.

Speed must be specified and stop bits can be 1 or 2.

7 bit data or 8 bit data may be used.

For parity N, O or E can be used.

 

An optional parameter ,INVERTED can be specified to use inverted RS-232.

Open "COMD.1:9600,8,N,1,INVERTED" For Output As #1 , will use pin PORTD.1 for output with 9600 baud, 1 stop bit and with inverted RS-232.

 

 

For the AVR-DOS file system, Device can also be a string or filename constant like

 

"readme.txt" or sFileName

MODE

You can use BINARY or RANDOM for COM1 and COM2, but for the software UART pins, you must specify INPUT or OUTPUT.

 

 

For the AVR-DOS file system, MODE may be INPUT, OUTPUT, APPEND or BINARY.

Channel

The number of the channel to open. Must be a positive constant >0.

 

 

For the AVR-DOS file system, the channel may be a positive constant or a numeric variable. Note that the AVD-DOS file system uses real file handles. The software UART does not use real file handles.

 

 

UART

 

The statements that support the device are PRINT , INPUT , INPUTHEX , INKEY and WAITKEY

 

Every opened device must be closed using the CLOSE #channel statement. Of course, you must use the same channel number.

 

In DOS the #number is a DOS file number that is passed to low level routines. In BASCOM the channel number is only used to identify the channel but there are no file handles. So opening a channel, will not use a channel. And closing the channel is only needed to make the syntax compatible with VB.

 

 

What is the difference?

In VB you can close the channel in a subroutine like this:

 

OPEN "com1:" for binary as #1

Call test

Close #1

End

 

Sub test

Print #1, "test"

End Sub

 

This will work since the file number is a real variable in the OS.

In BASCOM it will not work : the CLOSE must come after the last I/O statement:

 

 

OPEN "com1:" for binary as #1

Call test

End

 

Sub test

Print #1, "test"

End Sub

Close #1

 

 

The INPUT statement in combination with the software UART, will not echo characters back because there is no default associated pin for this.

 

 

AVR-DOS

The AVR-DOS file system uses real file handles. This means that the CLOSE statement can be used at any place in your program just as with VB.

 

 

See also

CLOSE , CRYSTAL, PRINT, LINE INPUT , LOC , LOF , EOF

 

 

 

Example

'-----------------------------------------------------------------------------------------

'name                     : open.bas

'copyright                : (c) 1995-2005, MCS Electronics

'purpose                  : demonstrates software UART

'micro                    : Mega48

'suited for demo          : yes

'commercial addon needed  : no

'-----------------------------------------------------------------------------------------

 

$regfile = "m48def.dat"                                   ' specify the used micro

$crystal = 10000000                                         ' used crystal frequency

$baud = 19200                                               ' use baud rate

$hwstack = 32                                               ' default use 32 for the hardware stack

$swstack = 10                                               ' default use 10 for the SW stack

$framesize = 40                                             ' default use 40 for the frame space

 

 

Dim B As Byte

 

'Optional you can fine tune the calculated bit delay

'Why would you want to do that?

'Because chips that have an internal oscillator may not

'run at the speed specified. This depends on the voltage, temp etc.

'You can either change $CRYSTAL or you can use

'BAUD #1,9610

 

'In this example file we use the DT006 from www.simmstick.com

'This allows easy testing with the existing serial port

'The MAX232 is fitted for this example.

'Because we use the hardware UART pins we MAY NOT use the hardware UART

'The hardware UART is used when you use PRINT, INPUT or other related statements

'We will use the software UART.

Waitms 100

 

'open channel for output

Open "comd.1:19200,8,n,1" For Output As #1

Print #1 , "serial output"

 

 

'Now open a pin for input

Open "comd.0:19200,8,n,1" For Input As #2

'since there is no relation between the input and output pin

'there is NO ECHO while keys are typed

Print #1 , "Number"

'get a number

Input #2 , B

'print the number

Print #1 , B

 

'now loop until ESC is pressed

'With INKEY() we can check if there is data available

'To use it with the software UART you must provide the channel

Do

'store in byte

 B = Inkey(#2)

'when the value > 0 we got something

If B > 0 Then

    Print #1 , Chr(b)                                   'print the character

End If

Loop Until B = 27

 

 

Close #2

Close #1

 

 

'OPTIONAL you may use the HARDWARE UART

'The software UART will not work on the hardware UART pins

'so you must choose other pins

'use normal hardware UART for printing

'Print B

 

 

'When you dont want to use a level inverter such as the MAX-232

'You can specify ,INVERTED :

'Open "comd.0:300,8,n,1,inverted" For Input As #2

'Now the logic is inverted and there is no need for a level converter

'But the distance of the wires must be shorter with this

End