Выбрать главу

BOOL FlushFileBuffers(

     HANDLE hFile

);

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

    #include <windows.h>

    #include <string.h>

    …

    DCB dсb;

    COMMTIMEOUTS ct;

    HANDLE port;

    DWORD bс;

    char *buf out="Test string";

    char *buf_in;

    …

    dсb.DCBlength=sizeof(DCB);

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

    dсb.fNull=TRUE;

    ct.ReadIntervalTimeout=10;

    ct.ReadTotalTimeoutMultiplier=ct.ReadTotalTimeoutConstant=0;

    ct.WriteTotalTimeoutMultiplier=ct.WriteTotalTimeoutConstant=0;

port=CreateFile("COM2",GENERIC_READ|GENERIC_WRIТЕ,0,NULL,OPEN_EXISTING, 0,NULL);

    SetCommState(port,dсb);

    SetCommTimeouts(port,&ct);

    PurgeComm(port,PURGE_TXCLEAR PURGE_RXCLEAR);

    SetupComm(port,25 6,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,0,buf_in);

     CloseHandle(port);

     …

Если на COM2 установить перемычку между сигналами TxD и RxD, то переменная bufin, после выполнения ReadFile, будет содержать ту же информацию, что и buf_out. Других пояснений пример не требует, все уже было подробно рассмотрено раньше.

Функция TransmitCommChar

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

BOOL TransmitCommChar(

     HANDLE hFile,

     char      cChar

);

Данная функция передает один (и только один) внеочередной байт в линию, не смотря на наличие данных в очереди передатчика, и перед этими данными. Однако управление потоком действует. Функцию можно вызвать только синхронно. Более того, если байт экстренных данных, от предыдущего вызова этой функции, еще не передан в линию (например, из-за функций управления потоком), то попытка экстренной передачи еще одного байта завершится ошибкой. Если Вы используете программное управление потоком, то символы приостановки и возобновления передачи (обычно CTRL-S и CTRL-Q), лучше всего передавать именно этой функцией.

Функции SetCommBreak и ClearCommBreak

Последовательный канал передачи данных можно перевести в специальное состояние, называемое разрывом связи. При этом передача данных прекращается, а выходная линия переводится в состояние "0". Приемник, обнаружив, что за время необходимое для передачи стартового бита, битов данных, бита четности и стоповых битов, приемная линия ни разу не перешла в состояние "1", так же фиксирует у себя состояние разрыва.

BOOL SetCommBreak(

     HANDLE hFile

);

BOOL ClearCommBreak(

     HANDLE hFile

);

Функция EscapeCommFunction

Следует заметить, что состояние разрыва линии устанавливается аппаратно. Поэтому нет другого способа возобновить прерванную, с помощью SetCommBreak, передачу данных, кроме вызова ClearCommBreak. Более тонкое управление потоком данным позволяет осуществить функция:

BOOL EscapeCommFunction(

     HANDLE hFile,

     DWORD dwFunc

);

Выполняемое действие определяется вторым параметром, который может принимать одно из следующих значений:

• CLRDTR — Сбрасывает сигнал DTR

• CLRRTS — Сбрасывает сигнал RTS

• SETDTR — Устанавливает сигнал DTR

• SETRTS — Устанавливает сигнал RTS

• SETXOFF — Симулирует прием символа XOFF

• SETXON — Симулирует прием символа XON

• SETBREAK — Переводит выходную линию передатчика в состояние разрыва. SetCommBreak является упрощенной формой данного вызова.

• CLRBREAK — Снимает состояние разрыва для выходной линии передатчика. ClearCommBreak является упрощенной формой данного вызова.

Функция ClearCommError

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

BOOL ClearCommError(

    HANDLE      hFile,

    LPDWORD   IpErrors,

    LPCOMSTAT IpStat

);

Эта функция не только сбрасывает признак ошибки для соответствующего порта, но и возвращает более подробную информацию об ошибке. Кроме того, возможно получение информации о текущем состоянии порта. Вот что означают параметры: