Тема: Com-порт
Показать сообщение отдельно
  #15  
Старый 04.10.2011, 19:06
chainik chainik вне форума
Начинающий
 
Регистрация: 30.06.2008
Сообщения: 140
Репутация: 8882
По умолчанию

Привожу драйвер ком- порта для Win95/Win98
Обрати внимание насколько здесь все проще.
Чтобы отослать байт ты просто отправляешь его в порт
(команды IN/OUT)
К сожалению в WinXP этот трюк уже не работает. Система не допускает прямого обращения к портам ввода/вывода. Это элемент защиты.
У меня на предприятии есть стенды с такой системой. Заменить уже не на что...

Код:
unit Port95;
{**********************************************************************
 * Description:	Port95 - very simple unit, that lets you access port	*
 * 							under Window 95,not under Windows NT.									*
 * Status:			Freeware																							*
 *							You can freely use or distribute this unit						*
 * Target:			Delphi 2 and Windows 95																*
 * Version:			1.0 (April 27, 1997																		*
 * Status:			Freeware																							*
 * Author:			Anatoly Podgoretsky																		*
 * Address:			kvk@estpak.ee																					*
 * Tips:				font Courier, tabs = 2																*
 * Problems:		Word Read/Write utulities may problems on some 				*
 *							computers or interface cards, that can't access whole	*
 *							word. To prevent it You can use slow equivalent of		*
 *							these	 procedures with suffix LS											*
 * Copyright:		Copyright (C) 1997, NPS																*
 **********************************************************************}

interface

function PortReadByte(Addr:Word)	 : Byte;
function PortReadWord(Addr:Word)	 : Word;
function PortReadWordLS(Addr:Word) : Word;
procedure PortWriteByte(Addr:Word; Value:Byte);
procedure PortWriteWord(Addr:Word; Value:Word);
procedure PortWriteWordLS(Addr:Word; Value:Word);

implementation

{****************************************************************
 * Port Read byte function																			*
 * Parameter: port address		 																	*
 * Return: 		byte value from given port 												*
 ****************************************************************}
function PortReadByte(Addr:Word) : Byte; assembler; register;
asm
	MOV	DX,AX
  IN	AL,DX
end;
{****************************************************************
 * HIGH SPEED Port Read Word function														*
 * Parameter: port address		 																	*
 * Return:	 	word value from given port 												*
 * Comment: 	may problem with some cards and computers					*
 *						that can't to access whole word, usualy it work.	*
 ****************************************************************}
function PortReadWord(Addr:Word) : Word; assembler; register;
asm
	MOV	DX,AX
  IN	AX,DX
end;
{****************************************************************
 * LOW SPEED Port Read Word function														*
 * Parameter: port address		 																	*
 * Return:	 	word value from given port 												*
 * Comment: 	work in all cases, only to adjust DELAY if need		*
 ****************************************************************}
function PortReadWordLS(Addr:Word) : Word; assembler; register;
const
	Delay = 150;		// depending of CPU speed and cards speed
asm
	MOV		DX,AX
  IN		AL,DX			// read LSB port
	MOV		ECX,Delay
@1:
	LOOP	@1				// delay between two reads
	XCHG	AH,AL
  INC		DX				// port+1
	IN		AL,DX			// read MSB port
	XCHG	AH,AL			// restore bytes order
end;
{****************************************************************
 * Port Write byte function																			*
 * Parameter: port address		 																	*
 ****************************************************************}
procedure PortWriteByte(Addr:Word; Value:Byte); assembler; register;
asm
	XCHG	AX,DX
	OUT		DX,AL
end;
{****************************************************************
 * HIGH SPEED Port Write word procedure													*
 * Comment: 	may problem with some cards and computers					*
 *						that can't to access whole word, usualy it work.	*
 ****************************************************************}
procedure PortWriteWord(Addr:word; Value:word); assembler; register;
asm
	XCHG	AX,DX
	OUT		DX,AX
end;
{****************************************************************
 * LOW SPEED Port Write Word procedure													*
 * Parameter: port address		 																	*
 * Return:	 	word value from given port 												*
 * Comment: 	work in all cases, only to adjust DELAY if need		*
 ****************************************************************}
procedure PortWriteWordLS(Addr:word; Value:word); assembler; register;
const
	Delay = 150;		// depending of CPU speed and cards speed
asm
	XCHG	AX,DX
	OUT		DX,AL			// port LSB
	MOV		ECX,Delay
@1:
	LOOP	@1				// delay between two writes
	XCHG	AH,AL
  INC		DX				// port+1
	OUT		DX,AL			// port MSB
end;

end.
Ответить с цитированием