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


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


BOOL PurgeComm( HANDLE hFile, DWORD dwFlags );

Вызов этой функции позволяет решить две задачи: очистить очереди приема/передачи в драйвере и завершить все находящиеся в ожидании запросы ввода/вывода. Какие именно действия выполнять задается вторым параметром (значения можно комбинировать с помощью побитовой операции OR:

PURGE_TXABORT

Немедленно прекращает все операции записи, даже если они не завершены

PURGE_RXABORT

Немедленно прекращает все операции чтения, даже если они не завершены

PURGE_TXCLEAR

Очищает очередь передачи в драйвере

PURGE_RXCLEAR

Очищает очередь приема в драйвере

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

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

BOOL FlushFileBuffers( HANDLE hFile );

Приведу пример выполнения настройки порта и выполнения чтения/записи данных.

#include <windows.h> #include <string.h>

. . .

DCB dcb; COMMTIMEOUTS ct; HANDLE port; DWORD bc;

char *buf_out="Test string"; char *buf_in;

. . .

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); PurgeComm(port,PURGE_TXCLEAR|PURGE_RXCLEAR); SetupComm(port,256,256);

. . .

buf_in=(char*)HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,strlen(buf_out)+1); WriteFile(port,buf_out,strlen(buf_out),&bc,NULL); ReadFile(port,buf_in,strlen(buf_out),&bc,NULL);




Начало  Назад  Вперед



Книжный магазин