| 
| 
 | Вопрос # 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 usesWindows; typeTComPort = classprivate   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 usesSysUtils; constructor TComPort.Create;begininherited;CloseCom;end; destructor TComPort.Destroy;beginCloseCom;inherited;end; function TComPort.InitCom(BaudRate, PortNo: Integer; Parity: Char;CommTimeOuts: TCommTimeouts): Boolean;varFileName: string;DCB: TDCB;PortParam: string;beginresult := 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) thenbegin   result := SetCommState(hFile, DCB) and     SetCommTimeouts(hFile, CommTimeOuts);end;if not result then   CloseCom;end; procedure TComPort.CloseCom;beginif hFile < > INVALID_HANDLE_VALUE then   CloseHandle(hFile);hFile := INVALID_HANDLE_VALUE;end; function TComPort.ReceiveCom(var Buffer; Size: DWORD): Integer;varReceived: DWORD;beginif hFile = INVALID_HANDLE_VALUE then if ReadFile(hFile, Buffer, Size, Received, nil) thenbegin   Result := Received;endelse end; function TComPort.SendCom(var Buffer; Size: DWORD): Integer;varSended: DWORD;beginif hFile = INVALID_HANDLE_VALUE then if WriteFile(hFile, Buffer, Size, Sended, nil) thenbegin   Result := Sended;endelse end; function TComPort.ClearInputCom: Boolean;beginif 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 наказуемо осью? Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |