СообЧа > База Знаний > Программирование > Delphi

Вопрос

Как прочитать порт или записать в него.

Ответ

В мультизадачных ОС как правило доступ к портам запрещен идеологией системы. И это неспроста — подумайте, что будет, если одновременно с вашей программой этот же порт попробует использовать другая программа.
Hо в Win9x существует частичная возможность обратиться напрямую с помощью ассемблерных команд. Делать это надо с определенной осторожность. Даже если вы получите доступ до порта на своей машине, то это не означает, что это будет и на другой машине, например доступ до LPT порта может быть закрыт драйвером принтера, такое редко но встречается. Доступ к наиболее важным портам прикрыты запрещен полностью соответствующими системными драйверами.
В Win NT доступ к оборудованию со стороны пользовательской программы запрещен полностью. Для доступа на этих ОС требуется использовать kernel mode драйвера, тоже самое рекомендуется и для Win9x.
Вот несколько полезных ссылок:

TVicHW32 http://www.entechtaiwan.com/tools.htm
Tinyport (NT) http://www.winsite.com/info/pc/winnt/programr/tinypo21.zip.drag
DriverX http://www.tetradyne.com
giveio (NT) http://www.wideman-one.com/gw/tech/Delphi/iopm/index.htm
Ports, by Harold Howe, http://www.bcbdev.com/components.htm

Код доступа к портам с помощью ассемблера.

procedure WritePortByte(Port:Word; Value:Byte);
asm
    XCHG EDX,EAX
    OUT DX,AL
end;

procedure WritePortWord(Port:Word; Value:Word);
asm
    XCHG EDX,EAX
    OUT DX,AX
end;

function ReadPortByte(Port:Word) : Byte;
asm
    MOV EDX,EAX
    IN AL,DX
end;

function ReadPortWord(Port:Word) : Word;
asm
    MOV EDX,EAX
    IN AX,DX
end;


Примечание:

Существуют устройства с подряд идущими (по адресам) _байтовыми_ портами, к которым нельзя обращаться со словными командами I/O. Hа сегодня они почти вымерли, но :
При выборе типа процедуры (BYTE или WORD) следует ориентироваться на спецификацию устройства ввода-вывода, к которому идет обращение. Hе следует обращаться к байтовому устройству с WORD-ориентированными процедурами — экономия времени мизерная, а побочные эффекты могут быть катастрофическими."
Hапример, некоторые адаптеры сбрасывают биты ошибок после чтения статус-регистра. Другие отображают несколько внутренних регистров на один адрес I/O, и т.п.
Hа некоторых старых компьютерах Word процедуры могут не работать из за специфических особенностей интерфейса, правда такие компьютера практически уже не встречаются. Есть ISA Bus Specification, где эти вопросы четко формализованы. Выборка словного порта может быть разбита на два раза, даже если адрес четный, в зависимости от пожеланий устройства I/O.

Из конференции Delphi

Методы с помощью ассемблера не пойдут под WinXP
Нужно пользоваться ReadFile и WriteFile

raven



Copyright © 2000-2004 Сообщество Чайников
Контактная информация