Работа с коммуникационными портами (COM и LPT) в программах для Win32



         

Функция SetCommTimeouts


Заполнив структуру COMMTIMEOUTS можно вызывать функцию установки тайм-аутов порта. Это функция называется SetCommTimeouts:

   BOOL SetCommTimeouts(

      HANDLE         hFile,

      LPCOMMTIMEOUTS lpCommTimeouts

   );

Параметры этой функции тоже достаточно очевидны. Установку тайм-аутов можно производить как до установки параметров порта, так и после. Последовательность вызова функций SetCommState и SetCommTimeouts не имеет никакого значения. Главное, что бы все настройки были завершены до начала ввода/вывода информации.

Теперь приведу пример настройки порта:

   #include <windows.h>

   . . .

   DCB          *dcb;

   COMMTIMEOUTS  ct;

   HANDLE        port;

   . . .

   dcb=(DCB*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,sizeof(DCB));

   dcb->DCBlength=sizeof(DCB);

   BuildCommDCB("baud=9600 parity=N data=8 stop=1",dcb);

   dcb->fNull=TRUE;

   ct.ReadIntervalTimeout=10;

   ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;

   ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

   port=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);

   SetCommState(port,dcb);

   SetCommTimeouts(port,&ct);

   HeapFree(GetProcessHeap(),0,dcb);

   . . .

   CloseHandle(port);

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

Первым делом, с помощью функции HeapAlloc, выделяется и заполняется нулями область памяти для DCB. Затем в поле DCBlength заносится размер структуры DCB в байтах. Зачем это нужно обсуждалось выше, при описании данного поля. Для общего (и наглядного) заполнения DCB использована функция BuildCommDCB. Будем считать, что нас устраивает информация занесеная в DCB, но требуется игнорировать нулевые байты при приеме. Так как BuildCommDCB не выполняет требуемых действий мы вручную изменяем соответсвующее поле. Далее мы заполняем информацию о тайм-аутах.


Содержание  Назад  Вперед