Дополнительные команды AVR-DOS

Материал из roboforum.ru Wiki
Версия от 13:40, 6 января 2009; MiBBiM (обсуждение | вклад) (непереведенные полраздела файл)
Перейти к: навигация, поиск

Список команд 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)

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

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

DiskSize

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

lSize = DiskSize ()

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

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

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

DiskFree

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

lFreeSize = DiskFree ()

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

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

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

Kill

Удаляет файл с диска. Открытый файл не может быть удален. Специальные символы(WildCards) в имени файла, маски не поддерживаются. Код ошибки хранится в глобальной переменной gDOSError.

Kill sFileName

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

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

'We can use the KILL statement to delete a file.
'A file mask is not supported
Print "Kill (delete) file demo"
Kill "test.txt"

Dir

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

Первый вызов функции содержит маску. Все последующие вызовы совершаются без маски. Фактически, когда вы хотите получить имя следующего файла в данной директории, удовлетворяющее маске, вы должны вызывать вариант функции без параметров после первого вызова.

sFile = Dir(mask)

sFile = Dir()

SFile(String) Имя файла. Строка пуста, если больше нет файлов, удовлетворяющих маске
Mask(String) Файловая маска, удовлетворяющая требованиям обычного DOS, напр. *.TXT. Маска *.* удовлетворяет всем файлам

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

'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

FileLen

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

lSize = FileLen ()

lSize = FileLen (file)

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

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

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

FileDate

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

sDate = FileDate ()

sDate = FileDate (file)

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

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

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

FileTime

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

sTime = FileTime ()

sTime = FileTime (file)

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

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

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

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.

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

' 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

GetAttr

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

bAttr = FileDate ()

bAttr = FileDate (file)

bAttr(Byte) Атрибуты файла, совместимые с DOS-форматом. Байт расшифровывается как 00ADVSHR, где биты 5-0:

A=Archiv
D=Directory
V=Volume ID
S=System
H=Hidden
R=Read Only

File(String) Имя файла в текущей директории. Если не указано, параметром считается последний файл, выбранный с помощью DIR()

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

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

Name

Переименовывает файл в текущей директории. Файл с новым именем не должен существовать в текущей директории, иначе команда вернет ошибку. Код ошибки можно посмотреть в глобальной переменной gbDOSError.

Name <strOldFilename> As <strNewFileName>

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

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

Dim strOldFileName as String * 12
Dim strNewFileName as String * 12

strOldFileName = "Data.txt"
strNewFileName = "Data.bak"
Name strOldFilename As strNewFileName

ChDir

Изменяет текущую директорию.
Функции Kill, Dir, ChDir, MkDir, RmDir, Name, FileLen, FileDateTime, FileDate, FileTime, GetAttr, Open, BLoad и BSave работают только в текущей директории. Обращаться к файлу с помощью составного пути запрещается!

ChDIR (strDirectoryName)

strDirectoryName(String) Путь к новой директории, длина не более 8 символов. Допускаются следующие спецсимволы:

"." - на директорию выше
"\" - в корень диска

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

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

MkDir

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

MkDIR (strDirectoryName)

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

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

Dim strDirectory as String * 12
MkDir "NewDir"
' or
strDirectory = "NewDir"
MkDir strDirectory

RmDir

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

RmDIR (strDirectoryName)

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

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

Dim strDirectory as String * 12
MkDir "NewDir"
' or
strDirectory = "NewDir"
MkDir strDirectory

Файлы

FreeFile

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

bFileNumber = FreeFile()

bFileNumber(Byte) Свободный файловый номер, который может использоваться для открытия новых файлов. В отличие от QB, этот файловый номер начинается с 128 и заканчивается 255. Используйте числа 1..127 для пользовательских номеров, чтобы избежать конфликтов номеров при использованиии функции.

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

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

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.

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

OPEN "com1:" for binary as #1
Call test
End
Sub test
Print #1, "test" 
End Sub
Close #1

Close

Освобождает открытое устройство. The statements that support the device are PRINT , INPUT and INPUTHEX , INKEY, WAITKEY. Every opened device must be closed using the CLOSE #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

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

$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

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

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

$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

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

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

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

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:

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

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

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

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

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

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

'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

Line Input

Get

Put

Seek

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

EOF

LOC

LO

FileAttr

Другие

Bload

Bsave

См. также