8(495)909-90-01
8(964)644-46-00
pro@sio.su
Главная
Системы видеонаблюдения
Охранная сигнализация
Пожарная сигнализация
Система пожаротушения
Система контроля удаленного доступа
Оповещение и эвакуация
Контроль периметра
Система домофонии
Парковочные системы
Проектирование слаботочных сетей
Аварийный
контроль
Раздел: Документация

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


ПО

= 4800

010

= 300

101

= 2400

001

= 150

100

- 1200

000

= ПО

PAR 1,0 (проверка на четность)

00 или 1

01 -

= нечетная

11 -

=четная

STOP (количество стоповых битов)

0= 1

1 =

2

DA1,0 (длина блока данных)

10 = 7 б!

11

8 бит

Следующая программа на языке ТР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