Дополнительные команды AVR-DOS — различия между версиями

Материал из roboforum.ru Wiki
Перейти к: навигация, поиск
(InitFileSystem)
(InitFileSystem)
Строка 21: Строка 21:
 
|-
 
|-
 
| bPartitionNumber(Byte)
 
| bPartitionNumber(Byte)
| Partitionnumber on the Flashcard Drive (normally 1,  
+
| Partitionnumber on the Flashcard Drive (normally 1, but use 0 on mediums without Master boot record)
 
 
but use 0 on mediums without Master boot record)
 
 
|}
 
|}
  

Версия 18:43, 6 января 2009

Список команд AVR-DOS — список функций библиотеки

AVR-DOS.

Диск/Директория

InitFileSystem

Читает Master boot record и partition boot record (Sector) диска(флэш-карты) и инициализирует файловую систему.

Эта функция должна быть вызвана перед любым другим использованием системы!

bErrorCode = InitFileSystem

(bPartitionNumber)

bErrorCode(Byte) Код ошибки, возвращает 0 если система успешно

запущена.

bPartitionNumber(Byte) Partitionnumber on the Flashcard Drive (normally 1, but use 0 on mediums without Master boot record)

Пример вызова:

<source lang="vb">Dim bErrorCode as Byte bErrorCode = InitFileSystem(1) If bErrorCode > 0 then Print "Error: " ; bErrorCode Else Print "Filesystem successfully initialized" End If </source>

DiskSize

Возвращает размер диска.

lSize = DiskSize ()

lSize(Long) Объем диска в КБайтах

Пример вызова:

<source lang="vb">Dim Gbtemp1 As Byte ' scratch byte Gbtemp1 = Initfilesystem(1) ' we must init the

filesystem once If Gbtemp1 > 0 Then Print #1 , "Error " ; Gbtemp1 Else Print #1 , " OK" Print "Disksize : " ; Disksize() ' show disk size in

Kbytes Print "Disk free: " ; Diskfree() ' show free space too End If </source>

DiskFree

Возвращает размер свободного пространства диска.

lFreeSize = DiskFree ()

lFreeSize(Long) Размер свободной области в КБайтах

Пример вызова:

<source lang="vb">Dim Gbtemp1 As Byte ' scratch byte Gbtemp1 = Initfilesystem(1) ' we must init the

filesystem once If Gbtemp1 > 0 Then Print #1 , "Error " ; Gbtemp1 Else Print #1 , " OK" Print "Disksize : " ; Disksize() ' show disk size in

Kbytes Print "Disk free: " ; Diskfree() ' show free space too End If </source>

Kill

Удаляет файл с диска. Открытый файл не может быть

удален. Специальные символы(WildCards) в имени файла,

применение масок не поддерживаются. Код ошибки хранится

в глобальной переменной gDOSError[1].

Kill sFileName

sFileName(String) Имя файла в текущей директории

Пример вызова:

<source lang="vb">'We can use the KILL statement to delete a file. 'A file mask is not supported Print "Kill (delete) file demo" Kill "test.txt" </source>

Dir

Возвращает имя файла, удовлетворяющее маске.

Первый вызов функции содержит маску. Все последующие

вызовы совершаются без маски. Фактически, когда вы

хотите получить имя следующего файла в данной

директории, удовлетворяющее маске, вы должны вызывать

вариант функции без параметров после первого вызова.

sFile = Dir(mask)

sFile = Dir()

SFile(String) Имя файла. Строка пуста, если больше нет файлов,

удовлетворяющих маске

Mask(String) Файловая маска, удовлетворяющая требованиям обычного

DOS, напр. *.TXT. Маска *.* удовлетворяет всем файлам

Пример вызова:

<source lang="vb">'Lets have a look at the file we created Print "Dir function demo" S = Dir( "*.*") 'The first call to the DIR() function must contain a

file mask ' The * means everything. ' While Len(s) > 0 ' if there was a file found Print S ; " " ; Filedate() ; " " ; Filetime() ; " " ;

Filelen() ' print file , the date the fime was created/changed ,

the time and the size of the file S = Dir() ' get next Wend </source>

FileLen

Возвращает размер файла.

lSize = FileLen ()

lSize = FileLen (file)

lSize(Long) Размер файла в Байтах
File(String) Имя файла в текущей директории. Если не указано,

параметром считается последний файл, выбранный с помощью

DIR()

Пример вызова:

<source lang="vb">Print "File demo" Print Filelen( "josef.img") ; " length" ' length of file Print Filetime( "josef.img") ; " time" ' time file was

changed Print Filedate( "josef.img") ; " date" ' file date </source>

FileDate

Возвращает дату создания или изменения(?) файла.

sDate = FileDate ()

sDate = FileDate (file)

sDate(String) Дата создания или изменения(?) файла
File(String) Имя файла в текущей директории. Если не указано,

параметром считается последний файл, выбранный с помощью

DIR()

Пример вызова:

<source lang="vb">Print "File demo" Print Filelen( "josef.img") ; " length" ' length of file Print Filetime( "josef.img") ; " time" ' time file was

changed Print Filedate( "josef.img") ; " date" ' file date </source>

FileTime

Возвращает время создания или изменения(?) файла.

sTime = FileTime ()

sTime = FileTime (file)

sTime(String) Время создания или изменения(?) файла
File(String) Имя файла в текущей директории. Если не указано,

параметром считается последний файл, выбранный с помощью

DIR()

Пример вызова:

<source lang="vb">Print "File demo" Print Filelen( "josef.img") ; " length" ' length of file Print Filetime( "josef.img") ; " time" ' time file was

changed Print Filedate( "josef.img") ; " date" ' file date </source>

FileDateTime

Возвращает дату и время создания или изменения(?) файла.

Var = FileDateTime ()

Var = FileDateTime (file)

Var(String) Время создания или изменения(?) файла
File(String) When the target variable is a string, it must be

dimensioned with a length of at least 17 bytes.

File(Byte array) When the target variable is a byte array, the array

size must be at least 6 bytes.

File(Numeric) When you use a numeric variable, the internal file

date and time format will be used.

Пример вызова:

<source lang="vb">' Read and print Directory and show Filename, Date,

Time, Size ' for all files matching pStr1 and create/update younger

than pDays Sub Directorylist(pstr1 As String , Byval Pdays As Word) Local lFileName as String * 12 ' hold file name for

print Local lwCounter as Word , lFileSizeSum as Long ' for

summary Local lwNow as Word , lwDays as Word Local lSec as Byte , lMin as Byte , lHour as byte , lDay

as byte , lMonth as byte , lYear as byte print "Listing of all Files matching " ; pStr1 ; " and

create/last update date within " ; pdays ; " days" lwNow = SysDay() lwCounter = 0 : lFileSizeSum = 0 lFileName = Dir(pStr1) While lFileName <> "" lsec = FileDateTime() lwDays = lwNow - SysDay(lDay) ' Days between Now and

last File Update; uses lDay, lMonth, lYear if lwDays <= pDays then ' days smaller than desired with

parameter print lFileName ; FileDate() ; " " ; FileTime() ; " " ;

filelen() incr lwCounter : lFileSizeSum = FileLen() + lFileSizeSum end if lFileName = Dir() WEnd print lwCounter ; " File(s) found with " ; lFileSizeSum

" Byte(s)"

End Sub </source>

GetAttr

Возвращает атрибуты файла.

bAttr = FileDate ()

bAttr = FileDate (file)

bAttr(Byte) Атрибуты файла, совместимые с DOS-форматом. Байт

расшифровывается как 00ADVSHR, где биты 5-0: A - Архивный
D - Директория
V - Volume ID(?)
S - Системный
H - Скрытый
R - Только чтение

File(String) Имя файла в текущей директории. Если не указано,

параметром считается последний файл, выбранный с помощью

DIR()

Пример вызова:

<source lang="vb">Print "File demo" Print Filelen( "josef.img") ; " length" ' length of file Print Filetime( "josef.img") ; " time" ' time file was

changed Print Filedate( "josef.img") ; " date" ' file date Print Bin(GetAttr(“Josef.img”)) ; “Attributes” ‘ DOS

Attributes </source>

Name

Переименовывает файл в текущей директории. Файл с новым

именем не должен существовать в текущей директории,

иначе команда вернет ошибку. Код ошибки можно посмотреть

в глобальной переменной gbDOSError[1].

Name <strOldFilename> As <strNewFileName>

strOldFileName(String) Старое имя файла
strNewFileName(String) Новое имя файла

Пример вызова:

<source lang="vb">Dim strOldFileName as String * 12 Dim strNewFileName as String * 12

strOldFileName = "Data.txt" strNewFileName = "Data.bak" Name strOldFilename As strNewFileName </source>

ChDir

Изменяет текущую директорию.
Функции Kill, Dir, ChDir, MkDir, RmDir, Name,

FileLen, FileDateTime, FileDate, FileTime, GetAttr,

Open, BLoad и BSave работают только в текущей

директории. Обращаться к файлу с помощью составного пути

запрещается!

ChDIR (strDirectoryName)

strDirectoryName(String) Путь к новой директории, длина не более 8 символов.

Допускаются следующие спецсимволы:
"." - на директорию выше
"\" - в корень диска

Пример вызова:

<source lang="vb">Dim strDirectory as String * 12

ChDir "SubDir" ' or strDirectory = "SubDir" ChDir strDirectory

' Change to next higher directory ChDir "." ' Change to Root Directory strDirectory = "\" ChDir strDirectory </source>

MkDir

Создает каталог в текущей директории.

MkDIR (strDirectoryName)

strDirectoryName(String) Имя новой директории, не более 8 символов

Пример вызова:

<source lang="vb">Dim strDirectory as String * 12 MkDir "NewDir" ' or strDirectory = "NewDir" MkDir strDirectory </source>

RmDir

Удаляет каталог в текущей директории.

RmDIR (strDirectoryName)

strDirectoryName(String) Имя каталога для удаления, не более 8 символов

Пример вызова:

<source lang="vb">Dim strDirectory as String * 12 MkDir "NewDir" ' or strDirectory = "NewDir" MkDir strDirectory </source>

Файлы

FreeFile

Возвращает свободный файловый номер(filenumber). Функция

обеспечивает совместимость с QB.

bFileNumber = FreeFile()

bFileNumber(Byte) Свободный файловый номер, который может использоваться

для открытия новых файлов. В отличие от QB, этот

файловый номер начинается с 128 и заканчивается 255.

Используйте числа 1..127 для пользовательских номеров,

чтобы избежать конфликтов номеров при использованиии

функции.

Пример вызова:

<source lang="vb">Ff = Freefile() ' get file handle Open "test.txt" For Input As #ff ' we can use a constant

for the file too Print Lof(#ff) ; " length of file" Print Fileattr(#ff) ; " file mode" ' should be 1 for

input Do Line Input #ff , S ' read a line ' line input is used to read a line of text from a file Print S ' print on terminal emulator Loop Until Eof(ff) <> 0 'The EOF() function returns a non-zero number when the

end of the file is reached 'This way we know that there is no more data we can read Close #ff </source>

Open

Открывает устройство.

OPEN "device" for MODE As #channel

OPEN file FOR MODE as #channel

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

stopbits.

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 filesystem, 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 filesystem, 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 filesystem, the channel may be a

positive constant or a numeric variable. Note that the

AVD-DOS filesystem uses real filehandles. The software

UART does not use real file handles.

Пример вызова:

<source lang="vb">OPEN "com1:" for binary as #1 Call test End Sub test Print #1, "test" End Sub Close #1 </source>

Close

Освобождает открытое устройство. The statements that support the device are PRINT , INPUT

and INPUTHEX , INKEY, WAITKEY. Every opened device must be closed using the CLOSE

  1. channel statement. Of course, you must use the same

channel number. The best place for the CLOSE statement is at the end of

your program. The INPUT statement in combination with the software

UART, will not echo characters back because there is no

default associated pin for this. For the AVR-DOS filesystem, you may place the CLOSE at

any place in your program. This because the filesystem

supports real file handles.

OPEN "device" for MODE As #channel
...
CLOSE #channel

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 is : COM1:

Some chips have 2 UARTS. You can use COM2: to open the

second HW UART.

The format for the software UART is:

COMpin:speed,8,N,stop bits[,INVERTED] Where pin is the name of the PORT-pin. Speed must be specified and stop bits can be 1 or 2. 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

MODE You can use BINARY or RANDOM for COM1 and COM2, but for

the software UART pins, you must specify INPUT or OUTPUT

Channel The number of the channel to open. Must be a positive

constant >0

Пример вызова:

<source lang="vb">$crystal = 10000000 'change to the value of the

XTAL you have installed

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 </source>

Flush

Write current buffer of File to Card and updates

Directory. This function writes all information of an

open file, which is not saved yet to the Disk. Normally

the Card is updated, if a file will be closed or changed

to another sector. When no filenumber is specified, all

open files will be flushed.

Flush #bFileNumber

Flush

BFileNumber(Byte) Filenumber, which identifies an opened file such as #1

or #ff

Пример вызова:

<source lang="vb">$include "startup.inc"

'open the file in BINARY mode Open "test.biN" For Binary As #2 Put #2 , B ' write a byte Put #2 , W ' write a word Put #2 , L ' write a long Ltemp = Loc(#2) + 1 ' get the position of the next byte Print Ltemp ; " LOC" ' store the location of the file

pointer Print Lof(#2) ; " length of file" Print Fileattr(#2) ; " file mode" ' should be 32 for

binary Put #2 , Sn ' write a single Put #2 , Stxt ' write a string

Flush #2 ' flush to disk Close #2 </source>

Print

Send output to the RS-232 port. Writes a string to a

file. You can use a semicolon (;) to print more than one

variable at one line. When you end a line with a semicolon, no linefeed will

be added. The PRINT routine can be used when you have a

RS-232 interface on your uP. The RS-232 interface can be

connected to a serial communication port of your

computer. This way you can use a terminal emulator as an

output device. You can also use the build in terminal

emulator. The AVR-DOS filesystem also supports PRINT.

But in that case, only strings can be written to disk.

PRINT var ; " constant"

Var(...) The variable or constant to print

Пример вызова:

<source lang="vb">Dim A As Byte , B1 As Byte , C As Integer , S As

String * 4 A = 1 Print "print variable a " ; A Print 'new line Print "Text to print." 'constant to print


B1 = 10 Print Hex(b1) 'print in hexa notation C = &HA000 'assign value to c% Print Hex(c) 'print in hex notation Print C 'print in decimal notation

C = -32000 Print C Print Hex(c) Rem Note That Integers Range From -32767 To 32768 End </source>

Write

Writes data to a sequential file. When you write a

variables value, you do not write the binary

representatrion but the ASCII representation. When you

look in a file it contains readable text. When you use

PUT, to write binary info, the files are not readable or

contain unreadable characters. Strings written are

surrounded by string delimeters "". Multiple variables

written are separated by a comma. Look to this example: <source lang="vb">Dim S as String * 10 , W as Word S="hello" : W = 100 OPEN "test.txt" For OUTPUT as #1 WRITE #1, S , W CLOSE #1</source> The file content will look like this : "hello",100. Use

INPUT to read the values from value.

Write #ch , data [,data1]

Ch(...) A channel number, which identifies an opened file.

This can be a hard coded constant or a variable

Data , data1 A variable who’s content are written to the file

Пример вызова:

<source lang="vb">Dim S As string * 10 , W As Word ,L As Long S = "write" Open "write.dmo" For Output As #2 Write #2 , S , W , L ' write is also supported Close #2 Open "write.dmo" For Input As #2 Input #2 , S , W , L ' write is also supported Close #2 Print S ; " " ; W ; " " ; L </source>

Input

Read a Line from an opened File. Only valid for files

opened in mode INPUT. Line INPUT works only with

strings. It is great for working on text files.

LineInput #bFileNumber, sLineText

BfileNumber(Byte) Filenumber, which identifies an opened file
SlineText(String) A string, which is assigned with the next line from

the file

Пример вызова:

<source lang="vb">'Ok we want to check if the file contains the

written lines Ff = Freefile() ' get file handle Open "test.txt" For Input As #ff ' we can use a constant

for the file too Print Lof(#ff) ; " length of file" Print Fileattr(#ff) ; " file mode" ' should be 1 for

input Do Line Input #ff , S ' read a line ' line input is used to read a line of text from a file Print S ' print on terminal emulator Loop Until Eof(ff) <> 0 'The EOF() function returns a non-zero number when the

end of the file is reached 'This way we know that there is no more data we can read Close #ff </source>

Line Input

Read a Line from an opened File. Only valid for files

opened in mode INPUT. Line INPUT works only with

strings. It is great for working on text files.

LineInput #bFileNumber, sLineText

BfileNumber(Byte) Filenumber, which identifies an opened file
SlineText(String) A string, which is assigned with the next line from

the file.

Пример вызова:

<source lang="vb">'Ok we want to check if the file contains the

written lines Ff = Freefile() ' get file handle Open "test.txt" For Input As #ff ' we can use a constant

for the file too Print Lof(#ff) ; " length of file" Print Fileattr(#ff) ; " file mode" ' should be 1 for

input Do Line Input #ff , S ' read a line ' line input is used to read a line of text from a file Print S ' print on terminal emulator Loop Until Eof(ff) <> 0 'The EOF() function returns a non-zero number when the

end of the file is reached 'This way we know that there is no more data we can read Close #ff </source>

Get

Reads a byte from the hardware or software UART. Reads

data from a file opened in BINARY mode.

GET in combination with the software/hardware UART is

provided for compatibility with BASCOM-8051. It reads

one byte. GET in combination with the AVR-DOS filesystem is very

flexible and versatile. It works on files opened in

BINARY mode and you can reads all data types. By default you only need to provide the variable name.

When the variable is a byte, 1 byte wil be read. When

the variable is a word or integer, 2 bytes will be read.

When the variable is a long or single, 4 bytes will be

read. When the variable is a string, the number of bytes

that will be read is equal to the dimensioned size of

the string. DIM S as string * 10 , would read 10 bytes. Note that when you specify the length for a string, the

maximum length is 255. The maximum length for a

non-string array is 65535. <source lang="vb">Example : GET #1 , var ,,2 ‘ read 2 bytes, start at current

position GET #1, var , PS ‘ start at position stored in long PS GET #1, var , PS, 2 ‘ start at position stored in long

PS and read 2 bytes</source>

GET #channel, var

GET #channel, var , [pos] [, length]

#channel(...) A channel number, which identifies an opened file.

This can be a hard coded constant or a variable

Var(...) The variable or variable array that will be assigned

with the data from the file

Pos(...) This is an optional parameter that may be used to

specify the postion where the reading must start from.

This must be a long variable

Length(...) This is an optional parameter that may be used to

specify how many bytes must be read from the file.

Пример вызова:

<source lang="vb">'for the binary file demo we need some variables of

different types Dim B As Byte , W As Word , L As Long , Sn As Single ,

Ltemp As Long Dim Stxt As String * 10 B = 1 : W = 50000 : L = 12345678 : Sn = 123.45 : Stxt =

"test"

'open the file in BINARY mode Open "test.biN" For Binary As #2 Put #2 , B ' write a byte Put #2 , W ' write a word Put #2 , L ' write a long Ltemp = Loc(#2) + 1 ' get the position of the next byte Print Ltemp ; " LOC" ' store the location of the file

pointer Print Seek(#2) ; " = LOC+1"

Print Lof(#2) ; " length of file" Print Fileattr(#2) ; " file mode" ' should be 32 for

binary Put #2 , Sn ' write a single Put #2 , Stxt ' write a string

Flush #2 ' flush to disk Close #2

'now open the file again and write only the single Open "test.bin" For Binary As #2 L = 1 'specify the file position B = Seek(#2 , L) ' reset is the same as using SEEK #2,L Get #2 , B ' get the byte Get #2 , W ' get the word Get #2 , L ' get the long Get #2 , Sn ' get the single Get #2 , Stxt ' get the string Close #2 </source>

Put

Writes a byte to the hardware or software UART. Writes

data to a file opened in BINARY mode.

PUT in combination with the software/hardware UART is

provided for compatibility with BASCOM-8051. It writes

one byte PUT in combination with the AVR-DOS filesystem is very

flexible and versatile. It works on files opened in

BINARY mode and you can write all data types. By default you only need to provide the variable name.

When the variable is a byte, 1 byte wil be written. When

the variable is a word or integer, 2 bytes will be

written. When the variable is a long or single, 4 bytes

will be written. When the variable is a string, the

number of bytes that will be written is equal to the

dimensioned size of the string. DIM S as string * 10 ,

would write 10 bytes. Note that when you specify the length for a string, the

maximum length is 255. The maximum length for a

non-string array is 65535. Example: <source lang="vb">PUT #1, var PUT #1, var , , 2 ‘ write 2 bytes at default position PUT #1, var ,PS, 2 ‘ write 2 bytes at location storied

in variable PS</source>


PUT #channel, var

PUT #channel, var ,[pos] [,length]

#channel(...) A channel number, which identifies an opened file.

This can be a hard coded constant or a variable.

Var(...) The variable or variable array that will be written to

the file

Pos(...) This is an optional parameter that may be used to

specify the postion where the data must be written to.

This must be a long variable.

Length(...) This is an optional parameter that may be used to

specify how many bytes must be written to the file.

Пример вызова:

<source lang="vb">'for the binary file demo we need some variables of

different types Dim B As Byte , W As Word , L As Long , Sn As Single ,

Ltemp As Long Dim Stxt As String * 10 B = 1 : W = 50000 : L = 12345678 : Sn = 123.45 : Stxt =

"test"

'open the file in BINARY mode Open "test.biN" For Binary As #2 Put #2 , B ' write a byte Put #2 , W ' write a word Put #2 , L ' write a long Ltemp = Loc(#2) + 1 ' get the position of the next byte Print Ltemp ; " LOC" ' store the location of the file

pointer Print Seek(#2) ; " = LOC+1"

Print Lof(#2) ; " length of file" Print Fileattr(#2) ; " file mode" ' should be 32 for

binary Put #2 , Sn ' write a single Put #2 , Stxt ' write a string

Flush #2 ' flush to disk Close #2

'now open the file again and write only the single Open "test.bin" For Binary As #2 L = 1 'specify the file position B = Seek(#2 , L) ' reset is the same as using SEEK #2,L Get #2 , B ' get the byte Get #2 , W ' get the word Get #2 , L ' get the long Get #2 , Sn ' get the single Get #2 , Stxt ' get the string Close #2 </source>

Seek

Function: Returns the position of the next Byte to be

read or written. Statement: Sets the position of the next Byte to be read

or written.

This function returns the position of the next Byte to

be read or written. If an error occures, 0 is returned.

Check DOS-Error in variable gbDOSError[1]. The statetement also returns an error in the gbDOSerror

variable in the event that an error occurs. You can for example not set the fileposition behinds the

filesize. In QB/VB the file is filled with 0 bytes when you set

the filepointer behind the size of the file. For

embedded systems this does not seem a good idea. Seek and Loc seems to do the same function, but take

care : the seek function will return the position of the

next read/write, while the Loc function returns the

position of the last read/write. You may say that Seek =

Loc+1. Difference with QB In QB/VB you can use seek to make the file bigger. When

a file is 100 bytes long, setting the filepointer to 200

will increase the file with 0 bytes. By design this is

not the case in AVR-DOS.

Function: NextReadWrite = Seek (#bFileNumber)

Statement: Seek #bFileNumber, NewPos)

bFileNumber(Byte) Filenumber, which identifies an opened file
NextReadWrite(Long) A Long Variable, which is assigned with the Position

of the next Byte to be read or written (1-based)

NewPos(Long) A Long variable that holds the new position the

filepointer must be set too.

Пример вызова:

<source lang="vb">Open "test.biN" For Binary As #2 Put #2 , B ' write a byte Put #2 , W ' write a word Put #2 , L ' write a long Ltemp = Loc(#2) + 1 ' get the position of the next byte Print Ltemp ; " LOC" ' store the location of the file

pointer Print Seek(#2) ; " = LOC+1"

Close #2

'now open the file again and write only the single Open "test.bin" For Binary As #2 Seek #2 , Ltemp ' set the filepointer Sn = 1.23 ' change the single value so we can check it

better Put #2 , Sn = 1 'specify the file position Close #2 </source>

Свойства файла

EOF

Returns the End of File Status.

This functions returns information about the End of File

Status.

Return value Status
0 NOT EOF
255 EOF

In case of error (invalid filenumber) 255 (EOF) is

returned too.


bFileEOFStatus = EOF(#bFileNumber)

bFileEOFStatus(Byte) A Byte Variable, which issigned with the EOF Status
bFileNumber(Byte) Number of the opened file

Пример вызова:

<source lang="vb">Ff = Freefile() ' get file handle Open "test.txt" For Input As #ff ' we can use a constant

for the file too Print Lof(#ff) ; " length of file" Print Fileattr(#ff) ; " file mode" ' should be 1 for

input Do Line Input #ff , S ' read a line ' line input is used to read a line of text from a file Print S ' print on terminal emulator Loop Until Eof(ff) <> 0 'The EOF() function returns a non-zero number when the

end of the file is reached 'This way we know that there is no more data we can read Close #ff </source>

LOC

Returns the position of last read or written Byte of the

file.

This function returns the position of the last read or

written Byte. If an error occurs, 0 is returned. Check

DOS-Error in variable gbDOSError[1]. If

the file position pointer is changed with the command

SEEK, this function can not be used till the next

read/write operation. Difference with QB This function differs from QB. In QB the byte position

is divided by 128.

lLastReadWritten = Loc (#bFileNumber)

bFileNumber(Byte) Filenumber, which identifies an opened file
lLastReadWritten(Long) Variable, whichsigned with the Position of last read

or written Byte (1-based)

Пример вызова:

<source lang="vb">'open the file in BINARY mode Open "test.biN" For Binary As #2 Put #2 , B ' write a byte Put #2 , W ' write a word Put #2 , L ' write a long Ltemp = Loc(#2) + 1 ' get the position of the next byte Print Ltemp ; " LOC" ' store the location of the file

pointer Print Lof(#2) ; " length of file" Print Fileattr(#2) ; " file mode" ' should be 32 for

binary Put #2 , Sn ' write a single Put #2 , Stxt ' write a string

Flush #2 ' flush to disk Close #2 </source>

LOF

Returns the length of the File in Bytes.

This function returns the length of an opened file. If

an error occures, 0 is returned. Check DOS-Error in

variable gbDOSError[1].

lFileLength = LOF (#bFileNumber)

bFileNumber(Byte) Filenumber, which identifies an opened file
LFileLength(Long) Variable, which issigned with the Length of the file

(1-based)

Пример вызова:

<source lang="vb">'open the file in BINARY mode Open "test.biN" For Binary As #2 Put #2 , B ' write a byte Put #2 , W ' write a word Put #2 , L ' write a long Ltemp = Loc(#2) + 1 ' get the position of the next byte Print Ltemp ; " LOC" ' store the location of the file

pointer Print Lof(#2) ; " length of file" Print Fileattr(#2) ; " file mode" ' should be 32 for

binary Put #2 , Sn ' write a single Put #2 , Stxt ' write a string

Flush #2 ' flush to disk Close #2 </source>

FileAttr

Returns the file open mode.

This functions returns information about the File open

mode

bFileAttribut = FileAttr (bFileNumber)

Return value Open mode
1 INPUT
2 OUTPUT
8 APPEND
32 BINARY
bFileAttribut(Long) File open mode, See table
bFileNumber(Byte) Number of the opened file


Пример вызова:

<source lang="vb">'open the file in BINARY mode Open "test.biN" For Binary As #2 Print Fileattr(#2) ; " file mode" ' should be 32 for

binary Put #2 , Sn ' write a single Put #2 , Stxt ' write a string Close #2 </source>

Другие

Bload

Writes the Content of a File into SRAM.

This function writes the content of a file to a desired

space in SRAM. A free handle is needed for this

function.

BLoad sFileName, wSRAMPointer

sFileName(Long) Name of the File to be read
wSRAMPointer(Word) Variable, which holds the SRAM Address to which the

content of the file should be written

Пример вызова:

<source lang="vb">'now the good old bsave and bload Dim Ar(100) As Byte , I As Byte For I = 1 To 100 Ar(i) = I ' fill the array Next

Wait 2

W = Varptr(ar(1)) Bsave "josef.img" , W , 100 For I = 1 To 100 Ar(i) = 0 ' reset the array Next

Bload "josef.img" , W ' Josef you are amazing !

For I = 1 To 10 Print Ar(i) ; " " ; Next Print </source>

Bsave

Save a range in SRAM to a Fileю

This function writes a range from the SRAM to a file. A

free file handle is needed for this function.

BSave sFileName, wSRAMPointer, wLength

sFileName(Long) Name of the File to be written
wSRAMPointer(Word) Variable, which holds the SRAM Address, from where

SRAM should be written to a File

wLength(Word) Count of Bytes from SRAM, which should be written to

the file

Пример вызова:

<source lang="vb">'now the good old bsave and bload Dim Ar(100) As Byte , I As Byte For I = 1 To 100 Ar(i) = I ' fill the array Next

Wait 2

W = Varptr(ar(1)) Bsave "josef.img" , W , 100 For I = 1 To 100 Ar(i) = 0 ' reset the array Next

Bload "josef.img" , W ' Josef you are amazing !

For I = 1 To 10 Print Ar(i) ; " " ; Next Print </source>

Сноски

  1. 1 2 3 4 5 Подробнее Окружение AVR-DOS Ошибка цитирования Неверный тег <ref>: название «OkrDOS» определено несколько раз для различного содержимого

См. также