source file: uart.fts \ 12.11.2012 m0leg \ Copyright [C] 2012 mOleg mOlegg@ya.ru \ работа с последовательными портами В\В (COM, USB)
vocs/ unit.fts vocs/ struct.fts exc/ demand.fts os/ heap.fts
Unit: UART
ALSO IMPORT KERNEL32.DLL UART
0 Struct: DCB Cell[] length \ задает длину, в байтах, структуры DCB. Cell[] BaudRate \ скорость передачи данных. Cell[] Mode \ включает двоичный режим обмена (это флаги). Word[] wReserved \ не используется, должно быть установлено в 0. Word[] XonLim \ минимальное число символов в приемном буфере перед посылкой символа XON. Word[] XoffLim \ количество байт в приемном буфере перед посылкой символа XOFF. Byte[] ByteSize \ число информационных бит в передаваемых и принимаемых байтах. 4-8 Byte[] Parity \ схема контроля четности: 0-4=дополнить до четности,1,отсутствует,дополнить до нечетности,0 Byte[] StopBits \ задает количество стоповых бит. 0,1,2 = 1, 1.5, 2 Byte[] XonChar \ задает символ XON используемый как для приема, так и для передачи. Byte[] XoffChar \ задает символ XOFF используемый как для приема, так и для передачи. Byte[] ErrorChar \ задает символ, использующийся для замены символов с ошибочной четностью. Byte[] EofChar \ задает символ, использующийся для сигнализации о конце данных. Byte[] EvtChar \ задает символ, использующийся для сигнализации о событии. Word[] wReserved1 \ зарезервировано и не используется. EndStruct
0 Struct: TIMEOUTS \ в милисекундах Cell[] ReadInterval \ Максимальное время, допустимое между двумя последовательными символами, считы-ваемыми с коммуникационной линии. Cell[] ReadTotalMultiplier \ множитель используемый для вычисления общего тайм-аута операции чтения. Cell[] ReadTotalConstant \ константа используемая для вычисления общего тайм-аута операции чтения. Cell[] WriteTotalMultiplier \ множитель используемый для вычисления общего тайм-аута операции записи. Cell[] WriteTotalConstant \ константа используемая для вычисления общего тайм-аута операции записи. EndStruct
Unit: PURGE{ 0x01 CONSTANT TX_ABORT \ Terminates all outstanding write operations and returns immediately, even if the write operations have not been completed. 0x02 CONSTANT RX_ABORT \ Terminates all outstanding read operations and returns immediately, even if the read operations have not been completed. 0x04 CONSTANT TX_CLEAR \ Clears the output buffer (if the device driver has one). 0x08 CONSTANT RX_CLEAR \ Clears the input buffer (if the device driver has one). F: } ( h -> ) SWAP PurgeComm WIN-ERR ;F EndUnit
\ Константы 0x80000000 CONSTANT GENERIC_READ 0x40000000 CONSTANT GENERIC_WRITE 3 CONSTANT OPEN_EXISTING
\ структура описателя порта 0 Struct: PORT Cell[] off_id \ идентификатор открытого порта DCB /size record off_DCB \ начало записи DCB Cell[] off_accep \ количество принятых в буфер байт Cell[] off_size \ размер буфера для приема данных Zero[] off_body \ начало буфера приема данных EndStruct
\ открыть порт, заданный именем asc # ( например, s" COM1") \ создать буфер для приема данных, длиной buf# байт F: open ( asc # buf# --> port ) DUP PORT /size + DCB /size + BLOCK DUP >L PORT off_size ! DROP >L 0 0 OPEN_EXISTING 0 0 GENERIC_READ GENERIC_WRITE OR L> CreateFileA -IF L> RELEASE GetLastError THROW THEN *IF L@ PORT off_id ! L> ;THEN L> RELEASE GetLastError THROW ;F
\ закрыть порт, освободить занимаемую память F: close ( port --> ) DUP PORT off_id @ SWAP RELEASE CloseHandle WIN-ERR THROW ;F
\ инициализация порта F: init ( port --> ) DUP PORT off_id @ >R PORT off_DCB >L DCB /size L@ DCB length ! L@ R@ GetCommState WIN-ERR THROW \ настройки по-умолчанию: 9600 L@ DCB BaudRate ! \ 9600 бод 8 L@ DCB ByteSize B! \ 8 бит на символ 0 L@ DCB StopBits B! \ 1 стоповый бит 0 L@ DCB Parity B! \ нет контроля четности L> R> SetCommState WIN-ERR THROW ;F
\ изменить скорость обмена F: !speed ( bod port --> ) DUP PORT off_id @ >R PORT off_DCB DUP >L DCB BaudRate ! L> R> SetCommState WIN-ERR THROW ;F
\ Очищает очередь приема/передачи в драйвере com порта F: clear ( port -> ) PORT off_id @ PURGE{ TX_CLEAR RX_CLEAR OR } THROW ;F
\ отправить строку в порт F: send ( asc # port --> ) PORT off_id @ WRITE-FILE THROW ;F
\ принять строку из порта длиной не более #1 символов F: take ( port #1 --> asc #2 ) >R DUP >L PORT off_body DUP L@ PORT off_size @ R> UMIN L> PORT off_id @ READ-FILE THROW ;F
PREVIOUS PREVIOUS EndUnit
пример использования: s" COM1" 256 UART open VALUE Port \ открыть указанный последовательный порт В\В Port UART init \ настройка режима работы порта В\В Port UART clear \ очистка буферов В\В последовательного порта s" sample string" UART Port send \ отправка строки в порт Port 20 UART take TYPE \ принять из порта строку длиной не более 20 символов Port UART close \ закрыть открытый последовательный порт В\В
[pre]source file: uart.fts [b][color=#808080]\ 12.11.2012 m0leg[/color] [color=#808080]\ Copyright [C] 2012 mOleg mOlegg@ya.ru[/color] [color=#808080]\ работа с последовательными портами В\В (COM, USB)[/color]
[color=#00F000]vocs/ unit.fts[/color] [color=#00F000]vocs/ struct.fts[/color] [color=#00F000]exc/ demand.fts[/color] [color=#00F000]os/ heap.fts[/color]
[color=#FF8000]Unit: UART[/color]
[color=#FF00FF]ALSO[/color] [color=#FF00FF]IMPORT[/color] KERNEL32.DLL UART
[color=#00F000]0[/color] [color=#FF8000]Struct: DCB[/color] [color=#808000]Cell[] length[/color] [color=#808080]\ задает длину, в байтах, структуры DCB.[/color] [color=#808000]Cell[] BaudRate[/color] [color=#808080]\ скорость передачи данных.[/color] [color=#808000]Cell[] Mode[/color] [color=#808080]\ включает двоичный режим обмена (это флаги).[/color] [color=#808000]Word[] wReserved[/color] [color=#808080]\ не используется, должно быть установлено в 0.[/color] [color=#808000]Word[] XonLim[/color] [color=#808080]\ минимальное число символов в приемном буфере перед посылкой символа XON.[/color] [color=#808000]Word[] XoffLim[/color] [color=#808080]\ количество байт в приемном буфере перед посылкой символа XOFF.[/color] [color=#808000]Byte[] ByteSize[/color] [color=#808080]\ число информационных бит в передаваемых и принимаемых байтах. 4-8[/color] [color=#808000]Byte[] Parity[/color] [color=#808080]\ схема контроля четности: 0-4=дополнить до четности,1,отсутствует,дополнить до нечетности,0[/color] [color=#808000]Byte[] StopBits[/color] [color=#808080]\ задает количество стоповых бит. 0,1,2 = 1, 1.5, 2[/color] [color=#808000]Byte[] XonChar[/color] [color=#808080]\ задает символ XON используемый как для приема, так и для передачи.[/color] [color=#808000]Byte[] XoffChar[/color] [color=#808080]\ задает символ XOFF используемый как для приема, так и для передачи.[/color] [color=#808000]Byte[] ErrorChar[/color] [color=#808080]\ задает символ, использующийся для замены символов с ошибочной четностью.[/color] [color=#808000]Byte[] EofChar[/color] [color=#808080]\ задает символ, использующийся для сигнализации о конце данных.[/color] [color=#808000]Byte[] EvtChar[/color] [color=#808080]\ задает символ, использующийся для сигнализации о событии.[/color] [color=#808000]Word[] wReserved1[/color] [color=#808080]\ зарезервировано и не используется.[/color] [color=#FF8000]EndStruct[/color]
[color=#00F000]0[/color] [color=#FF8000]Struct: TIMEOUTS[/color] [color=#808080]\ в милисекундах[/color] [color=#808000]Cell[] ReadInterval[/color] [color=#808080]\ Максимальное время, допустимое между двумя последовательными символами, считы-ваемыми с коммуникационной линии.[/color] [color=#808000]Cell[] ReadTotalMultiplier[/color] [color=#808080]\ множитель используемый для вычисления общего тайм-аута операции чтения.[/color] [color=#808000]Cell[] ReadTotalConstant[/color] [color=#808080]\ константа используемая для вычисления общего тайм-аута операции чтения.[/color] [color=#808000]Cell[] WriteTotalMultiplier[/color] [color=#808080]\ множитель используемый для вычисления общего тайм-аута операции записи.[/color] [color=#808000]Cell[] WriteTotalConstant[/color] [color=#808080]\ константа используемая для вычисления общего тайм-аута операции записи.[/color] [color=#FF8000]EndStruct[/color]
[color=#FF8000]Unit: PURGE{[/color] [color=#00F000]0x01[/color] [color=#FF8000]CONSTANT TX_ABORT[/color] [color=#808080]\ Terminates all outstanding write operations and returns immediately, even if the write operations have not been completed.[/color] [color=#00F000]0x02[/color] [color=#FF8000]CONSTANT RX_ABORT[/color] [color=#808080]\ Terminates all outstanding read operations and returns immediately, even if the read operations have not been completed.[/color] [color=#00F000]0x04[/color] [color=#FF8000]CONSTANT TX_CLEAR[/color] [color=#808080]\ Clears the output buffer (if the device driver has one).[/color] [color=#00F000]0x08[/color] [color=#FF8000]CONSTANT RX_CLEAR[/color] [color=#808080]\ Clears the input buffer (if the device driver has one).[/color] [color=#FF8000]F: }[/color] [color=#0080C0]( h -> )[/color] SWAP PurgeComm WIN-ERR [color=#FF8000];F[/color] [color=#FF8000]EndUnit[/color]
[color=#808080]\ Константы[/color] [color=#00F000]0x80000000[/color] [color=#FF8000]CONSTANT GENERIC_READ[/color] [color=#00F000]0x40000000[/color] [color=#FF8000]CONSTANT GENERIC_WRITE[/color] [color=#00F000]3[/color] [color=#FF8000]CONSTANT OPEN_EXISTING[/color]
[color=#808080]\ структура описателя порта[/color] [color=#00F000]0[/color] [color=#FF8000]Struct: PORT[/color] [color=#808000]Cell[] off_id[/color] [color=#808080]\ идентификатор открытого порта[/color] DCB /size [color=#808000]record off_DCB[/color] [color=#808080]\ начало записи DCB[/color] [color=#808000]Cell[] off_accep[/color] [color=#808080]\ количество принятых в буфер байт[/color] [color=#808000]Cell[] off_size[/color] [color=#808080]\ размер буфера для приема данных[/color] [color=#808000]Zero[] off_body[/color] [color=#808080]\ начало буфера приема данных[/color] [color=#FF8000]EndStruct[/color]
[color=#808080]\ открыть порт, заданный именем asc # ( например, s" COM1")[/color] [color=#808080]\ создать буфер для приема данных, длиной buf# байт[/color] [color=#FF8000]F: open[/color] [color=#0080C0]( asc # buf# --> port )[/color] DUP PORT /size + DCB /size + BLOCK DUP >L PORT off_size ! DROP >L [color=#00F000]0[/color] [color=#00F000]0[/color] OPEN_EXISTING [color=#00F000]0[/color] [color=#00F000]0[/color] GENERIC_READ GENERIC_WRITE OR L> CreateFileA [color=#00A0A0]-IF[/color] L> RELEASE GetLastError [color=#C00000]THROW[/color] [color=#00A0A0]THEN[/color] [color=#00A0A0]*IF[/color] L@ PORT off_id ! L> [color=#FF8000];THEN[/color] L> RELEASE GetLastError [color=#C00000]THROW[/color] [color=#FF8000];F[/color]
[color=#808080]\ закрыть порт, освободить занимаемую память[/color] [color=#FF8000]F: close[/color] [color=#0080C0]( port --> )[/color] DUP PORT off_id @ SWAP RELEASE CloseHandle WIN-ERR [color=#C00000]THROW[/color] [color=#FF8000];F[/color]
[color=#808080]\ инициализация порта[/color] [color=#FF8000]F: init[/color] [color=#0080C0]( port --> )[/color] DUP PORT off_id @ [color=#C00000]>R[/color] PORT off_DCB >L DCB /size L@ DCB length ! L@ R@ GetCommState WIN-ERR [color=#C00000]THROW[/color] [color=#808080]\ настройки по-умолчанию:[/color] [color=#00F000]9600[/color] L@ DCB BaudRate ! [color=#808080]\ 9600 бод[/color] [color=#00F000]8[/color] L@ DCB ByteSize B! [color=#808080]\ 8 бит на символ[/color] [color=#00F000]0[/color] L@ DCB StopBits B! [color=#808080]\ 1 стоповый бит[/color] [color=#00F000]0[/color] L@ DCB Parity B! [color=#808080]\ нет контроля четности[/color] L> [color=#C00000]R>[/color] SetCommState WIN-ERR [color=#C00000]THROW[/color] [color=#FF8000];F[/color]
[color=#808080]\ изменить скорость обмена[/color] [color=#FF8000]F: !speed[/color] [color=#0080C0]( bod port --> )[/color] DUP PORT off_id @ [color=#C00000]>R[/color] PORT off_DCB DUP >L DCB BaudRate ! L> [color=#C00000]R>[/color] SetCommState WIN-ERR [color=#C00000]THROW[/color] [color=#FF8000];F[/color]
[color=#808080]\ Очищает очередь приема/передачи в драйвере com порта[/color] [color=#FF8000]F: clear[/color] [color=#0080C0]( port -> )[/color] PORT off_id @ PURGE{ TX_CLEAR RX_CLEAR OR } [color=#C00000]THROW[/color] [color=#FF8000];F[/color]
[color=#808080]\ отправить строку в порт[/color] [color=#FF8000]F: send[/color] [color=#0080C0]( asc # port --> )[/color] PORT off_id @ WRITE-FILE [color=#C00000]THROW[/color] [color=#FF8000];F[/color]
[color=#808080]\ принять строку из порта длиной не более #1 символов[/color] [color=#FF8000]F: take[/color] [color=#0080C0]( port #1 --> asc #2 )[/color] [color=#C00000]>R[/color] DUP >L PORT off_body DUP L@ PORT off_size @ [color=#C00000]R>[/color] UMIN L> PORT off_id @ READ-FILE [color=#C00000]THROW[/color] [color=#FF8000];F[/color]
[color=#FF00FF]PREVIOUS[/color] [color=#FF00FF]PREVIOUS[/color] [color=#FF8000]EndUnit[/color] [/b][/pre]
пример использования: [pre][b][color=#00F000]s" COM1"[/color] [color=#00F000]256[/color] UART open [color=#FF8000]VALUE Port[/color] [color=#808080]\ открыть указанный последовательный порт В\В[/color] Port UART init [color=#808080]\ настройка режима работы порта В\В[/color] Port UART clear [color=#808080]\ очистка буферов В\В последовательного порта[/color] [color=#00F000]s" sample string"[/color] UART Port send [color=#808080]\ отправка строки в порт[/color] Port [color=#00F000]20[/color] UART take TYPE [color=#808080]\ принять из порта строку длиной не более 20 символов[/color] Port UART close [color=#808080]\ закрыть открытый последовательный порт В\В[/color][/b][/pre]
|