Работа с COM и LPT в Win32. | страница 21
Вызов этой функции нужен для отбрасывания мусора, который может находиться в приемном буфере на момент запуска программы, или как результат ошибки в работе устройства. Очистка буфера передачи и завершение операций ввода/вывода так же потребуются при ошибке, как процедура восстановления, и при завершении программы, для красивого выхода.
Следует помнить, что очистка буфера передачи, как и экстреное завершение операции записи, не выполняют передачу данных находящихся в этом буфере. Данные просто отбрасываются. Если же передача остатка данных необходима, то перед вызовом PurgeComm следует вызвать функцию:
>BOOL FlushFileBuffers(HANDLE hFile);
Приведу пример выполнения настройки порта и выполнения чтения/записи данных.
>#include
>#include
>. . .
>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);
>HeapFree(GetProcessHeap(), 0, buf_in);
>CloseHandle(port);
>. . .
Если на COM2 установить перемычку между сигналами TxD и RxD, то переменная buf_in, после выполнения ReadFile, будет содержать ту же информацию, что и buf_out. Других пояснений пример не требует, все уже было подробно рассмотрено раньше.
Иногда требуется срочно передать символ, имеющий определенное специальное значение, а в очереди передатчика уже есть данные, которые нельзя терять. В этом случае можно воспользоваться функцией:
>BOOL TransmitCommChar(HANDLE hFile, char cChar);
Данная функция передает один (и только один) внеочередной байт в линию, не смотря на наличие данных в очереди передатчика, и перед этими данными. Однако управление потоком действует. Функцию можно вызвать только синхронно. Более того, если байт экстренных данных, от предыдущего вызова этой функции, еще не передан в линию (например из-за функций управления потоком), то попытка экстренной передачи еще одного байта завершится ошибкой. Если Вы используете программное управление потоком, то символы приостановки и возобновления передачи (обычно CTRL-S и CTRL-Q), лучше всего передавать именно этой функцией.