Добавить в цитаты Настройки чтения

Страница 306 из 436



∙ dwDesiredAccess

Задает тип доступа к файлу. Возможно использование следующих значений:

• 0 — Опрос атрибутов устройства без получения доступа к нему.

• GENERICREAD — Файл будет считываться.

• GENERICWRITE — Файл будет записываться.

• GENERIC_READ|GENERIC_WRITE — Файл будет и считываться и записываться.

∙ dwShareMode

Задает параметры совместного доступа к файлу. Коммуникационные порты нельзя делать разделяемыми, поэтому данный параметр должен быть равен 0.

∙ IpSecurityAttributes

Задает атрибуты защиты файла. Поддерживается только в Windows NT. Однако при работе с портами должен в любом случае равняться NULL.

∙ dwCreationDistribution

Управляет режимами автосоздания, автоусечения файла и им подобными. Для коммуникационных портов всегда должно задаваться OPENEXISTING.

∙ dwFlagsAndAttributes

Задает атрибуты создаваемого файла. Так же управляет различными режимами обработки. Для наших целей этот параметр должен быть или равным 0, или FILE_FLAG_OVERLAPPED. Нулевое значение используется при синхронной работе с портом, a FILE_FLAG_OVERLAPPED при асинхронной, или другими словами, при фоновой обработке ввода/вывода. Подробнее про асинхронный ввод/вывод я расскажу позже.

∙ hTemplateFile

Задает описатель файла-шаблона. При работе с портами всегда должен быть равен NULL.

При успешном открытии файла, в нашем случае порта, функция возвращает описатель (HANDLE) файла. При ошибке INVALID HANDLE VALUE. Код ошибки можно получить, вызвав функцию GetLastError, но ее описание выходит за рамки данной статьи.

Функция CloseHandle

Открытый порт должен быть закрыт перед завершением работы программы. В Win32 закрытие объекта по его описателю выполняет функция CloseHandle:

BOOL CloseHandle(

      HANDLE hObject

);

Функция имеет единственный параметр — описатель закрываемого объекта. При успешном завершении функция возвращает не нулевое значение, при ошибке нуль.

Теперь пример (достаточно очевидный):

    #include <windows.h>

    …

    HANDLE port;

    …

port=CreateFile"COM2",GENERIC_READ|GENERIC_WRIТЕ,0,NULL,OPEN_EXISTING,0,NULL);

}:

    if(port==INVALID_HANDLE_VALUE) {{

         MsgBox(NULL,"Невозможно открыть последовательный порт","Error",MB OK);

            ExitProcess(1);

     }

     …

     CloseHandle(port);

     …

В данном примере открывается порт COM2 для чтения и записи, используется синхронный режим обмена. Проверяется успешность открытия порта, при ошибке выводится сообщение и программа завершается. Если порт открыт успешно, то он закрывается.

Открыв порт, мы получили его в свое распоряжение. Теперь с портом может работать только наша программа. Однако, прежде чем мы займемся вводом/выводом, мы должны настроить порт. Это касается только последовательных портов, для которых мы должны задать скорость обмена, параметры четности, формат данных и прочее. Кроме того, существует несколько специфичных для Windows параметров. Речь идет о тайм-аутах, которые позволяют контролировать как интервал между принимаемыми байтами, так и общее время приема сообщения. Есть возможность управлять состоянием сигналов управления модемом. Но обо всем по порядку.

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

Структура DCB

Поскольку основную информацию содержит структура DCB, с ее описания и начнем:

typedef struct _DCB {{





       DWORD DCBlength; // sizeof(DCB)

       DWORD BaudRate; // current baud rate

       DWORD fBinary:1; // binary mode, no EOF check

       DWORD fParity:1; // enable parity checking

       DWORD fOutxCtsFlow:1; // CTS output flow control

       DWORD fOutxDsrFlow:1; // DSR output flow control

       DWORD fDtrControl:2; // DTR flow control type

       DWORD fDsrSensitivity:1; // DSR sensitivity

       DWORD fTXContinueOnXoff:1; // XOFF continues Tx

       DWORD fOutX:1; // XON/XOFF out flow control

       DWORD flnX:1; // XON/XOFF in flow control

       DWORD fErrorChar:1; // enable error replacement

       DWORD fNull:1; // enable null stripping

       DWORD fRtsControl:2; // RTS flow control

       DWORD fAbortOnError:1; // abort reads/writes on error

       DWORD fDummy2:17; // reserved

       WORD wReserved; // not currently used

       WORD XonLim; // transmit XON threshold

       WORD XoffLim; // transmit XOFF threshold

       BYTE ByteSize; // number of bits/byte, 4-8

       BYTE Parity; // 0–4=no,odd,even,mark,space

       BYTE StopBits; // 0,1,2 = 1, 1.5, 2

       char XonChar; // Tx and Rx XON character

       char XoffChar; // Tx and Rx XOFF character

       char ErrorChar; // error replacement character

       char EofChar; // end of input character

       char EvtChar; // received event character

       WORD wReserved1; // reserved; do not use

} DCB;

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

∙ DCBIength

Задает длину, в байтах, структуры DCB. Используется для контроля корректности структуры при передаче ее адреса в функции настройки порта.

∙ Baud Rate

Скорость передачи данных. Возможно указание следующих констант: CBR_110, CBR_ 300, CBR_600, CBR_1200, CBR_2400, CBR_4800, CBR_9600, CBR_14400, CBR_19200, CBR_38400, CBR_56000, CBR_57600, CBR_115200, CBR_128000, CBR_256000. Как видно, эти константы соответствуют всем стандартным скоростям обмена. На самом деле, это поле содержит числовое значение скорости передачи, а константы просто являются символическими именами. Поэтому можно указывать, например, и CBR_9600, и просто 9600. Однако рекомендуется указывать символические константы.

∙ fBinary

Включает двоичный режим обмена. Win32 не поддерживает недвоичный режим, поэтому данное поле всегда должно быть равно 1, или логической константе TRUE (что предпочтительней). В Windows 3.1, если это поле было равно FALSE, включался текстовый режим обмена. В этом режиме поступивший на вход порта символ, заданный полем EofChar свидетельствовал о конце принимаемых данных.

∙ fParity

Включает режим контроля четности. Если это поле равно TRUE, то выполняется проверка четности, при ошибке, в вызывающую программу, выдается соответствующий код завершения.

∙ fOutxCtsFlow

Включает режим слежения за сигналом CTS. Если это поле равно TRUE и сигнал CTS сброшен, передача данных приостанавливается до установки сигнала CTS. Это позволяет подключенному к компьютеру прибору приостановить поток передаваемой в него информации, если он не успевает ее обрабатывать.

∙ fOutxDsrFlow