Раздел: Документация
0 ... 9 10 11 12 13 14 15 ... 105 («-Библиотека ресурсов № А6 (определение базовых адресов СОМ-портов).-*) (Universal auto detection of COM base address) Function RS232(X:integer).integer; export; (* $0000 $0400 содержит базовый адрес порта С0М1, . $0402 содержит базовый адрес порта COM2, :$0404 содержит базовый адрес порта COM3, $0406 содержит базовый адрес порта COM4, $0000:$0411 содержит количество СОМ-портов в двоичном формате.*) var number of C0M, С0М1, COM2,COM3, COM4:integer; begin number of C0M:=mem($40.$11); («Считывает количество СОМ-портов *) number j>fJX)M:=(number of C0M and (8+4+2)) shr 1; =0; C0M3:=0; C0M4:=0; :$00);(«Процедура чтения из памяти.*) :$02); :$04), :$06); =number of C0M; =С0М1; С0М1 С0М1 COM2 COM3 COM4 Case X 0 1 2 3 4 end; =0; COM2 =memw($40 =memw($40 =memw($40 =memw($40 of RS232 RS232 RS232 RS232 RS232 COM2 COM3 COM4 Инициализация СОМ-порта Перед тем как использовать СОМ-порт, его необходимо настроить на определенный формат передачи данных, то есть установить скорость, количество битов данных, количество стоповых битов и бит проверки. Существует три метода настройки. Первый заключается в использовании команды MODE операционной системы MS DOS. Синтаксис команды можно представить так: MODE COMm: baud=b, parity=p,data=d,stop=s,retry=r или MODE C0Mm:b,p,d,s,r MODE C0M1:96, n, 8,1 настраивает порт COM1 со следующими параметрами: скорость 9600 бод, без проверки на четность, 8 бит данных, 1 стоповый бит. Указанная команда может быть включена в файл autoexec.bat. Недостаток такого метода -невозможность изменять формат передачи данных в пользовательских программах. Второй метод использует прерывание BIOS INT 14h, которое позволяет выполнять настройку порта из программ пользователя. Для этого необходимо в регистр АН загрузить 0, а в DX - число от 0 до 3, указывающее на соответствующий порт (СОМ1 - COM4). В регистр AL загружается байт инициализационных данных, значения битов которого приведены ниже: BD2 BD1 BD0 PARI PAR0 STOP DA1 DA0 BD2 - BD0 (скорость) 111 = 9600 ОН = 600
Следующая программа на языке ТР6 делает то же, что и команда DOS MODE C0M1:96,n,8,1. Procedure initialize; {C0M1: 9600, без проверки на четность, 8 бит данных, 1 стоповый бит.} var register:registers; begin with register do begin ah:=0{Загрузка номера функции прерывания.} al:=128+64+32+0+0+0+2+1; {Загрузка инициализационного кода 11100011В.} dx:=0;{Номер порта: DX=0:C0M1, DX=1:С0М2 и т.д.} intr($14,register);{Вызов прерывания BIOS.} end; end; Ограничение описанного метода состоит в том, что можно задать скорость только 9600 бод. UART 16450 способен работать со скоростью 115200 бод, это достигается непосредственным обращением к регистру. Третий, наиболее гибкий метод настраивает порт посредством записи данных в регистр формата данных UART (смещение 03 h). Следующая программа на ТР6 позволяет настроить сам регистр, для этого требуется базовый адрес настраиваемого порта, скорость, режим проверки, длина блока данных и количество стоповых битов. Процедура переводит заданную скорость в шестнадцатибитовый делитель и загружает его в соответствующие регистры. («-Библиотека ресурсов № А9 (запись в регистр формата данных).-») Procedure Write data format (RS232 address, Baud, Parity, Data bit, Stop bit:integer); var bytel,byte2,output byte:byte; divisor:integer; begin divisor:=H5200 div Baud; if divisor<=255 then begin bytel:=divisor; byte2:=0; end; if divisor>255 then begin bytel:=divisor mod 256; byte2;=divisor div 256; end; output byte:=(data bit-5)+4*(stop bit-1)+8*(parity); port(RS232 address+3):=128;{Загрузка инициализационных данных,первый бит регистра равен 1.} port(RS232 address+0):=bytel;{Младший байт делителя равен 1.} port(RS232 address+1):=byte2;{Старший байт делителя равен 0.} port(RS232 address+3):=output byte;{Загрузка делителя и других параметров.} end; Следующая функция, написанная на языке Turbo Pascal для Windows, выполняет то же самое. («-Библиотека ресурсов № А9 (запись в регистр формата данных).-*) Function Write data format(RS232 address, Baud, Parity, Datajnt, Stop bit:integer):integer; export; var bytel,byte2,output byte:byte; divisoninteger; begin divisor:=115200 div Baud; if divisor<=255 then begin byte1;=divisor; byte2:=0; end; if divisor>255 then begin bytel:=divisor mod 256; byte2:=divisor div 256; end; output byte:=(data bit-5)+4*(stop bit-1)+8*parity; port(RS232 address+3):=128;{Загрузка инициализационных данных, первый бит регистра равен 1.} port(RS232 address+0):=byte1;{Младший байт делителя равен 1.} port(RS232 address+1);=byte2;{Старший байт делителя равен 0.} port(RS232 address+3):=output byte;{Загрузка делителя и других параметров.} end; Передача и прием последовательных данных Существует несколько способов приема и передачи данных через последовательный порт: с помощью команд операционной системы, прерываний BIOS или непосредственного доступа к порту. Последний способ наиболее удобен при проведении операций ввода/вывода общего назначения. Рассмотрим пример для порта СОМ1. Чтобы передать данные, можно записать их непосредственно в буферный регистр передатчика 3F8h, используя следующий оператор языка QBASIC: OUT 3F8h, X где X - данные в десятичном формате. Для получения данных из порта СОМ1 считываются данные из буферного регистра приемника 3F8h. С этой целью используется другой оператор языка QBASIC (Y - входные данные в десятичном формате): Y=INP(3F8h) 0 ... 9 10 11 12 13 14 15 ... 105
|