|
Вопрос # 211/ вопрос открыт / |
|
Здравствуйте!Скажите пожалуйста, как с помощью Delphi можно работать с портами ввода-вывода?Премного благодарен.......
 |
Вопрос задал: Женя (статус: Посетитель)
Вопрос отправлен: 5 ноября 2008, 01:00
Состояние вопроса: открыт, ответов: 2.
|
Ответ #1. Отвечает эксперт: Вадим К
Здравствуйте, Женя!
Типов портов ввода-вывода существует очень много. Проблема в том. что напряму с ними рабоать виновс (2000/ХР/Виста) так просто не даст. Надо либо писать драйвер, либо использовать специальные функции.
Для работы с СОМ портом я долгое время использовал SynaSer (качать отсюдова http://www.ararat.cz/synapse/doku.php/download). Для работы с LPT можно почитать статью http://www.pcports.ru/articles/10.php, где написано, как использовать специальную длл. На том же сайте есть ответы на многие другие связанные темы.
 |
Ответ отправил: Вадим К (статус: Академик)
Время отправки: 5 ноября 2008, 01:46
|
Ответ #2. Отвечает эксперт: Feniks
Здравствуйте, Женя!
Не знаю, какие именно вы имели в виду порты, поэтому даю примеры из разных областей:
1. Как читать/писать в I/O порты;
2. Как прочитать байт из параллельного порта;
3. Посылать и считывать данные с COM порта, а также менять параметры (биты данных, четность).
А так же компонент для последовательного устройства (TRS232) в атаче.
P.S. Желаю удачи. К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
Приложение: Переключить в обычный режим-
- function InPort(PortAddr:word): byte;
- {$IFDEF WIN32}
- assembler; stdcall;
- asm
- mov dx,PortAddr
- in al,dx
- end;
- {$ELSE}
- begin
- Result := Port[PortAddr];
- end;
- {$ENDIF}
-
- procedure OutPort(PortAddr:
- word; Databyte: byte);
- {$IFDEF WIN32}
- assembler; stdcall;
- asm
- mov al,Databyte
- mov dx,PortAddr
- out dx,al
- end;
- {$ELSE}
- begin
- Port[PortAddr] := DataByte;
- end;
- {$ENDIF}
-
-
- Var
- BytesRead : BYTE;
- begin
-
- MOV dx,$379;
- IN al,dx;
- MOV BytesRead,al;
- end;
-
-
-
-
- unit Unit1;
-
- interface
-
- uses
- Windows;
-
- type
- TComPort = class
- private
- hFile: THandle;
- public
- constructor Create;
- destructor Destroy; override;
- function InitCom(BaudRate, PortNo: Integer; Parity: Char;
- CommTimeOuts: TCommTimeouts): Boolean;
- procedure CloseCom;
- function ReceiveCom(var Buffer; Size: DWORD): Integer;
- function SendCom(var Buffer; Size: DWORD): Integer;
- function ClearInputCom: Boolean;
- end;
-
- implementation
-
- uses
- SysUtils;
-
- constructor TComPort.Create;
- begin
- inherited;
- CloseCom;
- end;
-
- destructor TComPort.Destroy;
- begin
- CloseCom;
- inherited;
- end;
-
- function TComPort.InitCom(BaudRate, PortNo: Integer; Parity: Char;
- CommTimeOuts: TCommTimeouts): Boolean;
- var
- FileName: string;
- DCB: TDCB;
- PortParam: string;
- begin
- result := FALSE;
-
- hFile := CreateFile(PChar(FileName),
- GENERIC_READ or GENERIC_WRITE, 0, nil,
- OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
- if hFile = INVALID_HANDLE_VALUE then
- exit;
-
-
-
- PortParam := 'baud=' + IntToStr(BaudRate) + ' parity=' + Parity +
- ' data=8 stop=1 ' +
- 'octs=off';
- if BuildCommDCB(PChar(PortParam), DCB) then
- begin
- result := SetCommState(hFile, DCB) and
- SetCommTimeouts(hFile, CommTimeOuts);
- end;
- if not result then
- CloseCom;
- end;
-
- procedure TComPort.CloseCom;
- begin
- if hFile < > INVALID_HANDLE_VALUE then
- CloseHandle(hFile);
- hFile := INVALID_HANDLE_VALUE;
- end;
-
- function TComPort.ReceiveCom(var Buffer; Size: DWORD): Integer;
- var
- Received: DWORD;
- begin
- if hFile = INVALID_HANDLE_VALUE then
-
- if ReadFile(hFile, Buffer, Size, Received, nil) then
- begin
- Result := Received;
- end
- else
-
- end;
-
- function TComPort.SendCom(var Buffer; Size: DWORD): Integer;
- var
- Sended: DWORD;
- begin
- if hFile = INVALID_HANDLE_VALUE then
-
- if WriteFile(hFile, Buffer, Size, Sended, nil) then
- begin
- Result := Sended;
- end
- else
-
- end;
-
- function TComPort.ClearInputCom: Boolean;
- begin
- if hFile = INVALID_HANDLE_VALUE then
-
- Result := PurgeComm(hFile, PURGE_RXCLEAR);
- end;
-
- end.
 |
Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 5 ноября 2008, 10:39
Оценка за ответ: 5
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 5 ноября 2008, 12:05; участников в обсуждении: 1.
|
Вадим К (статус: Академик), 5 ноября 2008, 12:05 [#1]:
Feniks, вкурсе, что прямое обращение к портам ввода/вывода под NT наказуемо осью?
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|