Работа с 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), лучше всего передавать именно этой функцией.