Главная страница
Навигация по странице:

  • GetCommConfig

  • GetDefaultCommConfig и SetDegaultCommConfig

  • GetCommConfig и SetCommConfig

  • GetDefaultCommConfig и SetDefaultCommConfig . SetDefaultCommConfig

  • SetCommQueueSize

  • ReadFile и WriteFile

  • Титов О.Работа с коммуникационными портами (COM и LPT) в программах для Win32. Титов О.Работа с коммуникационными портами (COM и LPT) в програм. Работа с коммуникационными портами (com и lpt) в программах для Win32. Автор Титов Олег


    Скачать 276 Kb.
    НазваниеРабота с коммуникационными портами (com и lpt) в программах для Win32. Автор Титов Олег
    АнкорТитов О.Работа с коммуникационными портами (COM и LPT) в программах для Win32.doc
    Дата22.10.2017
    Размер276 Kb.
    Формат файлаdoc
    Имя файлаТитов О.Работа с коммуникационными портами (COM и LPT) в програм.doc
    ТипДокументы
    #9678
    КатегорияЭлектротехника. Связь. Автоматика
    страница8 из 9
    1   2   3   4   5   6   7   8   9

    Функция SetCommConfig


    Фактическая настройка порта выполняется функцией SetCommConfig:

    BOOL SetCommConfig(

    HANDLE hCommDev,

    LPCOMMCONFIG lpCC,

    DWORD dwSize

    );

    Параметры имеют то же самое значение, как и в функции GetCommConfig. Следует заметить, что описанные три функции позволяют настраивать и некоторые параметры модема, если он подключен к порту и опознан системой. Впрочем, эта возможность может отсутствовать, если она не предусмотрена производителем оборудования.

    Функции GetDefaultCommConfig и SetDegaultCommConfig


    Обратите внимание на кнопку "Restore Defaults". Вы в состоянии управлять ее поведением, правда опосредовано, с помощью функций GetDefaultCommConfig и SetDegaultCommConfig. Вот их прототипы:

    BOOL GetDefaultCommConfig(

    LPCSTR lpszName,

    LPCOMMCONFIG lpCC,

    LPDWORD lpdwSize

    );

    BOOL SetDefaultCommConfig(

    LPCSTR lpszName,

    LPCOMMCONFIG lpCC,

    DWORD dwSize

    );

    Эти функции очень похожи на GetCommConfig и SetCommConfig, но предназначены совсем для другой цели. Предположим, что Ваше устройство, по умолчанию, работает на скорости 175 бит в секунду и обменивается пятибитными символами. Системные же умолчания - 9600 бит в секунду и 8 бит в символе. Что бы пользователь, при нажатии на кнопку "Restore Defaults", получал не системные, а Ваши умолчания, воспользуйтесь функциями GetDefaultCommConfig и SetDefaultCommConfig. SetDefaultCommConfig не настраивает порт, это выполняется функцией SetCommConfig, а изменяет параметры во внутренней области коммуникационного драйвера.

    Функция SetupComm


    Теперь познакомимся с функцией SetupComm, которая, на самом деле, совсем не то, что следует из названия.

    BOOL SetupComm(

    HANDLE hFile,

    DWORD dwInQueue,

    DWORD dwOutQueue

    );

    Эту функцию скорее следовало назвать SetCommQueueSize, поскольку все, что она делает, это устанавливает размеры (в байтах) очередей приема и передачи. Причем размеры рекомендуемые. В общем случае, система сама в состоянии определить требуемый размер очередей, однако Вы можете вмешаться в этот процесс. Внутренние очереди драйвера позволяют избежать потери данных, если Ваша программа не успевает их считывать, и пауз в работе программы, если она передает данные слишком быстро. Размер очереди выбирается немного большим максимальной длины сообщения. Например, для протокола YMODEM, пакет данных которого имеет длину 1024 байт, разумным размером очереди будет 1200 байт.

    Указанный Вами размер очереди будет принят драйвером к сведению. Но он оставляет за собой право внести коррективы или вообще отвергнуть устанавливаемое значение. В последнем случае функция завершится с ошибкой.

    Внешние устройства управления объектами, чаще всего подключаемые к портам, обычно обмениваются с компьютером короткими сообщениями. Соответственно и вызов функции SetupComm не требуется. Однако, если Ваше устройство передает или принимает блоки данных длиной в несколько тысяч байт, рекомендуется установить размеры очередей драйвера.

    Давайте сделаем паузу в изучении функций настройки и получения состояния коммуникационных портов. Пора от слов переходить к делу, а именно к приему и передаче данных. Начнем с синхронного чтения/записи, это проще.

    Функцити ReadFile и WriteFile


    Прием и передача данных выполняется функциями ReadFile и WriteFile, то есть теми же самыми, которые используются для работы с дисковыми файлами. Вот как выглядят прототипы этих функций:

    BOOL ReadFile(

    HANDLE hFile,

    LPVOID lpBuffer,

    DWORD nNumOfBytesToRead,

    LPDWORD lpNumOfBytesRead,

    LPOVERLAPPED lpOverlapped

    );

    BOOL WriteFile(

    HANDLE hFile,

    LPVOID lpBuffer,

    DWORD nNumOfBytesToWrite,

    LPDWORD lpNumOfBytesWritten,

    LPOVERLAPPED lpOverlapped

    );

    Вы наверняка работали с этими функциями и знаете значение их параметров. Но я все-таки кратко остановлюсь на их описании:

    hFile


    Описатель открытого файла коммуникационного порта.

    lpBuffer


    Адрес буфера. Для операции записи данные из этого буфера будут передаваться в порт. Для операции чтения в этот буфер будут помещаться принятые из линии данные.

    nNumOfBytesToRead, nNumOfBytesToWrite


    Число ожидаемых к приему или предназначенных к передаче байт.

    nNumOfBytesRead, nNumOfBytesWritten


    Число фактически принятых или переданных байт. Если принято или передано меньше данных, чем запрошено, то для дискового файла это свидетельствует об ошибке, а для коммуникационного порта совсем не обязательно. Причина в тайм-аутах.

    lpOverlapped


    Адрес структуры OVERLAPPED, используемой для асинхронных операций. Подробнее как с структурой, так и с асинхронными операциями мы познакомимся позже. Для синхронных операций данный параметр должен быть равным NULL.

    Еще раз коснусь темы тайм-аутов. Если Вы не используете ни общий, ни межбайтный тайм-ауты для операции чтения и внешнее устройство прекратило передачу, то Ваша программа будет вечно ждать завершения синхронной операции. Другими словами она зависнет. Аналогичный результат может быть при использовании программного или аппаратного управления потоком. Если же тайм-ауты используются, то операция чтения нормально завершится. Только количество считанных байт будет меньше количества запрошенных для чтения. Это не обязательно свидетельствует об ошибке. Например, программа может по тайм-ауту определять конец очередного блока данных. Аналогично и для операции записи, с той лишь разницей, что неполная передача данных из буфера, скорее всего, будет свидетельствовать о проблеме во внешнем устройстве. То есть будет считаться ошибкой.
    1   2   3   4   5   6   7   8   9


    написать администратору сайта