Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Посылать и считывать данные с COM порта, а также менять параметры (биты данных, четность) 
:(
    Опции темы
Pakshin A. S.
Дата 4.11.2004, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 5056
Регистрация: 16.2.2003

Репутация: нет
Всего: 61



Ниже представлен класс для работы с COM-портом. Протестирован в Windows 95. Класс выдернут из контекста, так что не ручаюсь в компиляции с первого раза, однако все функции работы с COM очевидны. 


Код


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; 
  FileName := 'Com' + IntToStr(PortNo); {имя файла} 
  hFile := CreateFile(PChar(FileName), 
    GENERIC_READ or GENERIC_WRITE, 0, nil, 
    OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); 
  if hFile = INVALID_HANDLE_VALUE then 
    exit; 

  //установка требуемых параметров 
  GetCommState(hFile, DCB); //чтение текущих параметров порта 
  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 
    raise Exception.Create('Не открыта запись в Com порт'); 
  if ReadFile(hFile, Buffer, Size, Received, nil) then 
  begin 
    Result := Received; 
  end 
  else 
    raise Exception.Create('Ошибка приема данных: ' + IntToStr(GetLastError)); 
end; 

function TComPort.SendCom(var Buffer; Size: DWORD): Integer; 
var 
  Sended: DWORD; 
begin 
  if hFile = INVALID_HANDLE_VALUE then 
    raise Exception.Create('Не открыта запись в Com порт'); 
  if WriteFile(hFile, Buffer, Size, Sended, nil) then 
  begin 
    Result := Sended; 
  end 
  else 
    raise Exception.Create('Ошибка передачи данных: ' + IntToStr(GetLastError)); 
end; 

function TComPort.ClearInputCom: Boolean; 
begin 
  if hFile = INVALID_HANDLE_VALUE then 
    raise Exception.Create('Не открыта запись в Com порт'); 
  Result := PurgeComm(hFile, PURGE_RXCLEAR); 
end; 

end. 

PM   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0369 ]   [ Использовано запросов: 23 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.