Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 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 дней с момента отправки ответа)

Приложение:
  1.  
  2. function InPort(PortAddr:word): byte;
  3. {$IFDEF WIN32}
  4. assembler; stdcall;
  5. asm
  6. mov dx,PortAddr
  7. in al,dx
  8. end;
  9. {$ELSE}
  10. begin
  11. Result := Port[PortAddr];
  12. end;
  13. {$ENDIF}
  14.  
  15. procedure OutPort(PortAddr:
  16. word; Databyte: byte);
  17. {$IFDEF WIN32}
  18. assembler; stdcall;
  19. asm
  20. mov al,Databyte
  21. mov dx,PortAddr
  22. out dx,al
  23. end;
  24. {$ELSE}
  25. begin
  26. Port[PortAddr] := DataByte;
  27. end;
  28. {$ENDIF}
  29.  
  30.  
  31. Var
  32. BytesRead : BYTE;
  33. begin
  34.  
  35. MOV dx,$379;
  36. IN al,dx;
  37. MOV BytesRead,al;
  38. end;
  39.  
  40.  
  41.  
  42.  
  43. unit Unit1;
  44.  
  45. interface
  46.  
  47. uses
  48. Windows;
  49.  
  50. type
  51. TComPort = class
  52. private
  53. hFile: THandle;
  54. public
  55. constructor Create;
  56. destructor Destroy; override;
  57. function InitCom(BaudRate, PortNo: Integer; Parity: Char;
  58. CommTimeOuts: TCommTimeouts): Boolean;
  59. procedure CloseCom;
  60. function ReceiveCom(var Buffer; Size: DWORD): Integer;
  61. function SendCom(var Buffer; Size: DWORD): Integer;
  62. function ClearInputCom: Boolean;
  63. end;
  64.  
  65. implementation
  66.  
  67. uses
  68. SysUtils;
  69.  
  70. constructor TComPort.Create;
  71. begin
  72. inherited;
  73. CloseCom;
  74. end;
  75.  
  76. destructor TComPort.Destroy;
  77. begin
  78. CloseCom;
  79. inherited;
  80. end;
  81.  
  82. function TComPort.InitCom(BaudRate, PortNo: Integer; Parity: Char;
  83. CommTimeOuts: TCommTimeouts): Boolean;
  84. var
  85. FileName: string;
  86. DCB: TDCB;
  87. PortParam: string;
  88. begin
  89. result := FALSE;
  90.  
  91. hFile := CreateFile(PChar(FileName),
  92. GENERIC_READ or GENERIC_WRITE, 0, nil,
  93. OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
  94. if hFile = INVALID_HANDLE_VALUE then
  95. exit;
  96.  
  97.  
  98.  
  99. PortParam := 'baud=' + IntToStr(BaudRate) + ' parity=' + Parity +
  100. ' data=8 stop=1 ' +
  101. 'octs=off';
  102. if BuildCommDCB(PChar(PortParam), DCB) then
  103. begin
  104. result := SetCommState(hFile, DCB) and
  105. SetCommTimeouts(hFile, CommTimeOuts);
  106. end;
  107. if not result then
  108. CloseCom;
  109. end;
  110.  
  111. procedure TComPort.CloseCom;
  112. begin
  113. if hFile < > INVALID_HANDLE_VALUE then
  114. CloseHandle(hFile);
  115. hFile := INVALID_HANDLE_VALUE;
  116. end;
  117.  
  118. function TComPort.ReceiveCom(var Buffer; Size: DWORD): Integer;
  119. var
  120. Received: DWORD;
  121. begin
  122. if hFile = INVALID_HANDLE_VALUE then
  123.  
  124. if ReadFile(hFile, Buffer, Size, Received, nil) then
  125. begin
  126. Result := Received;
  127. end
  128. else
  129.  
  130. end;
  131.  
  132. function TComPort.SendCom(var Buffer; Size: DWORD): Integer;
  133. var
  134. Sended: DWORD;
  135. begin
  136. if hFile = INVALID_HANDLE_VALUE then
  137.  
  138. if WriteFile(hFile, Buffer, Size, Sended, nil) then
  139. begin
  140. Result := Sended;
  141. end
  142. else
  143.  
  144. end;
  145.  
  146. function TComPort.ClearInputCom: Boolean;
  147. begin
  148. if hFile = INVALID_HANDLE_VALUE then
  149.  
  150. Result := PurgeComm(hFile, PURGE_RXCLEAR);
  151. end;
  152.  
  153. end.


Ответ отправил: Feniks (статус: Бакалавр)
Время отправки: 5 ноября 2008, 10:39
Оценка за ответ: 5


Мини-форум вопроса

Всего сообщений: 1; последнее сообщение — 5 ноября 2008, 12:05; участников в обсуждении: 1.
Вадим К

Вадим К (статус: Академик), 5 ноября 2008, 12:05 [#1]:

Feniks, вкурсе, что прямое обращение к портам ввода/вывода под NT наказуемо осью?
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:55
Выполнено за 0.03 сек.