Программирование на Delphi - обмен опытом / Работа с COM портами

© Зайцев Олег 1998-2004
Лучшая портативная техника. Плееры Камеры Телефоны Компьютеры
Покупателям, пришедшим на www.porta.ru по этой ссылке - дополнительная скидка 1%
Железо | Система | WEB | Компоненты | Графика | Ссылки | Мультимедиа | Сети | Прочее | Реестр | Литература

Статистика

Работа с COM портами

Рекомендую:
Главная страница \ Железо \ Работа с COM портами

  • Работа с COM портами

    Работа с COM портами

    Получение списка имеющихся в системе портов * * Задать вопрос Наверх
    Существует как минимум два способа:
    1. Список доступных портов можно узнать, проанализировав ключ реестра HKEY_LOCAL_MACHINE\HARDWARE\DEVICEMAP\SERIALCOMM
    2. Можно поочередно попробовать открыть порты COM1 .. COM9, таким образом удасться установить все доступные порты (т.е. порты, не открытые другими приложениями)

    Открытие и настройка COM порта * * Задать вопрос Наверх
    Работу с СOM портом проще всего пояснить на примере

    var
     DCB   : TDCB;
     hPort : THandle;
    begin
      // 1. Открываем файл
      hPort := CreateFile(PChar('COM'+IntToStr(<номер порта>)),
                          GENERIC_READ + GENERIC_WRITE,
                          0, nil, 
                          OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
      // 2. Контроль ошибок
      if hPort = INVALID_HANDLE_VALUE then begin
       // Обнаружена ошибка, порт открыть не удалось
       exit;
      end;
      // 3. Чтение текущих настроек порта
      if GetCommState(hPort, DCB) then ;
      // 4. Настройки:
      // Скорость обмена
      DCB.BaudRate := [скорость обмена];
      // Число бит на символ
      DCB.ByteSize := [размер "байта" при обмене по COM порту - обычно 8 бит];
      // Стоп-биты
      DCB.StopBits := [константа, определяющая кол-во стопбитов];
      // Четность
      DCB.Parity   := [константа, определяющая режим контроля четности];
      DCB.Flags := 20625;
      // 5. Передача настроек
      if not SetCommState(hPort, DCB) then {ошибка настройки порта};
      // 6. Настройка буферов порта (очередей ввода и вывода)
      if not SetupComm(hPort, 16, 16) then {ошибка настройки буферов};
      // 7. Сброс буфферов и очередей
      if PurgeComm(hPort, PURGE_TXABORT or PURGE_RXABORT or PURGE_TXCLEAR or PURGE_RXCLEAR) then ;
      ...............
      // 8. Закрытие порта
      CloseHandle(hPort);
    end;
    
    Теперь рассмотрим все шаги по порядку:

    Чтение и запись данных * * Задать вопрос Наверх
    Запись данных производится следующим образом:

     Result := WriteFile(hPort, Buffer, Size, NumberOfBytesWritten, nil);
    
    параметр NumberOfBytesWritten после выполнения содержит количество реально переданных байт.
    Чтение данных:
     
     Result := ReadFile(hPort, Buffer, Size, NumberOfBytesReaded, nil);
    
    параметр Size задает читаемый объем информации (его значение должно быть меньше объема буфера), NumberOfBytesReaded получает количество реально прочитанных байт

    Настройка таймаутов приема и передачи * * Задать вопрос Наверх
    Настройку таймаутов можно провести при помощи слудующей функции:

    function SetComPortTimeouts: boolean;
    var
     CommTimeouts : TCommTimeouts;
     ComErrors    : DWORD;
    begin
     Result := false;
     // Если соединение есть, то перенастроим его
     if hPort <> INVALID_HANDLE_VALUE then begin
      // Чтение текущих таймаутов
      GetCommTimeouts(hPort, CommTimeouts);
      ... настройка параметров структуры CommTimeouts ...
      // Установка таймаутов
      SetCommTimeouts(hPort, CommTimeouts);
      Result := true;
     end;
    end;
    

    Запрос ошибки * * Задать вопрос Наверх
    Запрос ошибки производится при помощи функции ClearCommError

    var
     ComErrors    : DWORD;
    begin
     ClearCommError(hPort, ComErrors, nil);
    end;
    
    Данная функция сбрасывает состояние ошибки, передавая код ошибки в переменную ComErrors


    © Зайцев Олег, "Программирование на Delphi - обмен опытом" 1999-2004. При использовании любых материалов данного сайта необходимо указывать источник информации. Дата обновления: 22.11.2004. Сайт размещен на хостинге AGAVA - Хостинг от AGAVA.ru