Раздел: Документация
0 ... 8 9 10 11 12 13 14 ... 105 DDCD (дельта DCD) 1 О DRI (дельта RI) DDSR (дельта DSR) DCTS (дельта CTS) DCD изменена с момента последнего считывания ; DCD без изменений RI изменена с момента последнего считывания RI без изменений DSR изменена с момента последнего считывания DSR без изменений CTS изменена с момента последнего считывания : CTS без изменений Регистр со смещением 07п - это байт памяти. Запись данных в регистр не влияет на операции UART. Преобразователи напряжений Выходные сигналы управления (RTS и DTR) и входные сигналы состояния (CTS, DSR, DCD) последовательного порта инвертированы. Последовательные сигналы данных SIN и SOUT не инвертированы. UART работает только с уровнем напряжений ТТЛ/КМОП. Преобразователи напряжений расположены между UART и разъемом RS232. Преобразователи передатчиков конвертируют уровень напряжения ТТЛ в уровень RS232, а преобразователи приемников - наоборот. Логическая структура последовательного порта изображена на рис. 1.10. Компьютер Преоброзовотели уровня но передаму Преоброзовотели уровня на прием
8250/16450 UART Преобразователи уровня на прием Преобразователи уровня но передочу 9 -контактный штаревои розьем D-muno Рис. 1.10. Логическая структура последовательного порта
1.2.4. Программное управление В разделе приведены основные варианты программирования последовательного порта. Получение базового адреса последовательного порта Представленная программа, написанная на языке QBASIC, выводит общее количество СОМ-портов, встроенных в ПК, и их базовые адреса. Строка 20 считывает байт из ячейки памяти 0000:0411h, используя команду РЕЕК(). Биты 0, 1 и 2 содержат информацию о количестве установленных СОМ-портов. На эти три бита накладывается маска с помощью оператора AND (1+2+4) для определения количества портов. Строка 30 считывает два байта из ячеек памяти, содержащих базовый адрес СОМ1. Строки 40, 50 и 60 делают то же самое для остальных портов. 10 DEF SEG=0 20 PRINT "Number of RS232 ports:", (РЕЕК(Ш11) AND (1+2+4)) 30 PRINT Address of C0M1:",PEEK(iH400)+256*PEEK(iH401) 40 PRINT "Address of COM2:",PEEK(&H402)+256*PEEK(&H403) Базовые адреса СОМ-портов Базовые адреса СОМ-портов выглядят так: СОМ1: 3F8h COM2: 2F8h COM3: 3E8h COM4: 2E8h При включении или перезагрузке компьютера BIOS проверяет адреса всех установленных последовательных портов. Если она находит такой порт, то заносит базовый адрес (двухбайтовое слово) в определенную ячейку памяти. Для СОМ1 это ячейки 0000:0400h и 0000:0401 h. Базовый адрес можно получить, считав их содержимое. Ячейки памяти, в которых содержится информация о базовых адресах установленных последовательных портов, приведены ниже: СОМ1: 0000:0400h - 0000:0401h COM2: 0000:0402h - 0000:0403h COM3: 0000:0404h - 0000:0405h COM4: 0000:0406h - 0000:0407h Однобайтовая ячейка памяти 0000:0411 h в первом, втором и третьем битах содержит общее количество установленных СОМ-портов: 50 PRINT "Address of COM3:",РЕЕК(&Н404)+256*РЕЕК(&Н405) 60 PRINT "Address of COM:".РЕЕК(Ш06)+256*РЕЕК(Ш07) 70 INPUT X Следующая функция, "написанная на языке ТР6, считывает информацию о количестве установленных портов и присваивает полученное значение переменной Number of C0M. Затем она считывает базовые адреса из ячеек памяти, где они хранятся, и присваивает адрес выбранного порта переменной RS232 address. (♦-Библиотека ресурсов № А6 (определение базовых адресов СОМ-портов).-*) Procedure C0M address; :$0400 содержит базовый адрес порта С0М1, :$0402 содержит базовый адрес порта COM2, :$0404 содержит базовый адрес порта COM3, :$0406 содержит базовый адрес порта COM4, $0000:$0411 содержит количество СОМ-портов в двоичном формате.*) var СОМ:аггау[1..4] of integer; C0M numbe г, numbe r of C0M,code:integer; Kbchanchar; begin clrscr; C0M number:=1;(«Установка порта-по умолчанию.*) Number of C0M:=mem($0000:$0411):(«Считывание количества СОМ-портов.*) Number of C0M:=(Number of C0M and (8+4+2)) shr 1; $0000 C0M[1] C0M[2] C0M[3] C0M[4] =memw($0000 =memw($0000 =memw($0000 =memw($0000 $0400) $0402) $0404) $0406) ♦Процедура считывания из памяти. Textbackground(blue); clrscr; Textcolor(yellow); Textbackground(red); window(10,22,70,24); clrscr; writelnCNumber of COM installed:, Number of C0M:2); writeln(Addresses for C0M1 to COM4:, C0M[1]:3, C0M[2]:3, C0M[3]:3, C0M[4]:3); write(Select COM to be used (1,2.3,4):); delay(1000); if number of C0M>1 then begin («Выбор конкретного порта, если установлено несколько портов.*) repeat kbchar:=readkey;(«Считывание значения с вводимой клавиши.*) val(kbchar,COM number,code); («Преобразование символа в число.*) until (C0M number>=1) and (C0M number<=4) and (C0M[C0M number]<>0); end; clrscr; RS232 address:=C0M[C0M number]; writeln(Your selected RS232 interface: COM, C0M number:1); write(RS232 address:, RS232 address:4); delay(1000); textbackground(black); window(1,1,80,25); clrscr; end; В следующем примере приведена функция RS232(X), написанная на языке Turbo Pascal для Windows. RS232(0) возвращает количество установленных СОМ-портов, RS232(1) - базовый адрес СОМ1, RS232(2) - базовый адрес COM2 и т.д. 0 ... 8 9 10 11 12 13 14 ... 105
|