BOOL PurgeComm( HANDLE hFile, DWORD dwFlags );
Вызов этой функции позволяет решить две задачи: очистить очереди приема/передачи в драйвере и завершить все находящиеся в ожидании запросы ввода/вывода. Какие именно действия выполнять задается вторым параметром (значения можно комбинировать с помощью побитовой операции OR:
Вызов этой функции нужен для отбрасывания мусора, который может находиться в приемном буфере на момент запуска программы, или как результат ошибки в работе устройства. Очистка буфера передачи и завершение операций ввода/вывода так же потребуются при ошибке, как процедура восстановления, и при завершении программы, для красивого выхода.
Следует помнить, что очистка буфера передачи, как и экстреное завершение операции записи, не выполняют передачу данных находящихся в этом буфере. Данные просто отбрасываются. Если же передача остатка данных необходима, то перед вызовом 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);