маркированный список ГЛАВНАЯ
маркированный список О ТЕЛЕФОНЕ
маркированный список ПОЛЕЗНОЕ
маркированный список СТАТЬИ
маркированный список ПРОГРАММЫ
маркированный список ПРОШИВКИ
маркированный список ПАТЧИ
маркированный список ТЕМЫ
маркированный список МОБИЛЬНЫЙ КОНТЕНТ
маркированный список МОБИЛЬНЫЙ ЮМОР
маркированный список ФОРУМ
маркированный список ГОСТЕВАЯ
маркированный список ССЫЛКИ

 

Со своими вопросами, предложениями, и по другому обращайтесь:

mix-mode@narod.ru

ICQ 289246431

Работа с 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;

 

Теперь рассмотрим все шаги по порядку:

Шаг 1 - открытие порта. Порт открывается стандартной командой CreateFile, только в качестве имени файла передается имя порта (например, \"COM1\")

Шаг 2 - проверка успешности шага 1. Если порт открылся, то функция CreateFile возвращает его Handle, иначе hPort = INVALID_HANDLE_VALUE, что свидетельствует об ошибке

Шаг 3 - загрузка текущих настроек порта при помощи функции GetCommState. Этот шаг не является обязательным, т.к. можно настроить порт, как говорится, \"с нуля\". После выполнения GetCommState структура DCB заполняется текущими настройками

Шаг 4 - занесение в структуру DCB необходимых настроек

Шаг 5 - Настрока порта при помощи функции SetCommState. После настройки с портом уже можно работать, но в примере я выполняю полную настроку (шаги 6 и 7)

Шаг 6 - Настрока размеров буфера приема и предачи при помощи SetupComm. В моем примере заданы буфера очень небольшого размера, рекомендуется задать окого 1 кб

Шаг 7 - Очистка буферов и очередей порта - второй параметра функции PurgeComm является битовой маской и задает, что именно необходимо очитстить - в нашем случае все по максимуму

Шаг 8 - закрытие порта после завершения работы с ним

 

Чтение и запись данных:

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

  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
 
Copyright©2005
Хостинг предоставлен: http://narod.yandex.ru

Rambler's Top100
Хостинг от uCoz