Когда-то писал ком порт с контролем четности через WinAPI, не помню
чтобы с таким заморачивался. Кажется так: Данные кладутся в буфер,
но выставляется ошибка, на эту ошибку можно повесить исключение.
// #include "Mserial.h" HANDLE handle; COMMTIMEOUTS CommTimeOuts; DCB dcb; COMSTAT ComState; OVERLAPPED Overlap; // открытие порта // возвращает TRUE если порт открылся нормально boolean ComPortOpen(char* port, DWORD BaudRate, BYTE ByteSize, BYTE Parity, BYTE StopBits) { //открываем порт handle = CreateFile ( port,// имя файла GENERIC_READ | GENERIC_WRITE, // режим доступа 0, // совместный доступ NULL, //SD (дескр. защиты) OPEN_EXISTING, //как действовать NULL,//FILE_FLAG_OVERLAPPED, // атрибуты файла NULL //дескр.шаблона файла ); if(handle == INVALID_HANDLE_VALUE) {return FALSE; } //размер буфера обмена if(!SetupComm(handle, SizeBuffer, SizeBuffer)) {return FALSE; } //инициализируем структуру настроек порта if(!GetCommState(handle, &dcb)) {return FALSE; } //заполняем структуру настроек порта dcb.BaudRate = BaudRate; dcb.fBinary = TRUE; dcb.fOutxCtsFlow = FALSE; dcb.fOutxDsrFlow = FALSE; dcb.fDtrControl = DTR_CONTROL_DISABLE; dcb.fDsrSensitivity = FALSE; dcb.fNull = FALSE; dcb.fRtsControl = RTS_CONTROL_TOGGLE; dcb.fAbortOnError = FALSE; dcb.ByteSize = ByteSize; dcb.Parity = Parity; dcb.StopBits = StopBits; /* Члены структуры DCBlength Длина структуры, в байтах. BaudRate Скорость передачи данных, в бодах, с которой работает коммуникационное устройство. Этот член структуры может быть фактическим значением скорости передачи данных в бодах, или одним из ниже перечисленных индексов: CBR_110 CBR_19200 CBR_300 CBR_38400 CBR_600 CBR_56000 CBR_1200 CBR_57600 CBR_2400 CBR_115200 CBR_4800 CBR_128000 CBR_9600 CBR_256000 CBR_14400 fBinary Если этот член структуры - ИСТИНА (TRUE), включается двоичный режим. Windows не поддерживает недвоичный режим передачи, так что этот член структуры должен быть ИСТИНА (TRUE). fParity Если этот член структуры - ИСТИНА (TRUE), выполняется проверка четности и сообщается об ошибках.. fOutxCtsFlow Если этот член структуры - ИСТИНА (TRUE), то проверяется сигнал готовности к приему (CTS) для управления потоком вывода данных. Если этот член структуры - ИСТИНА (TRUE), а сигнал готовности к приему (CTS) выключен, вывод данных приостанавливается до тех пор, пока сигнал готовности к приему (CTS) не отправляется снова. fOutxDsrFlow Если этот член структуры - ИСТИНА (TRUE), то проверяется сигнал готовности модема (DSR) для управления потоком вывода данных. Если этот член структуры - ИСТИНА (TRUE), а сигнал готовности модема (DSR) отключается, вывод данных приостанавливается до тех пор, пока сигнал готовности модема (DSR) не отправляется снова. fDtrControl Сигнал DTR (готовности терминала к передаче данных) управления потоком данных. Этот член структуры может быть одним из следующих значений. DTR_CONTROL_DISABLE Отключает линию DTR, когда устройство открывается и оставляет ее заблокированной. DTR_CONTROL_ENABLE Включает линию DTR, когда устройство открывается и оставляет ее включенной. DTR_CONTROL_HANDSHAKE Включает процедуру установления связи DTR. Если процедура установления связи включена, она является ошибкой для приложения, которое корректировать линию, используя функцию EscapeCommFunction. fDsrSensitivity Если этот член структуры - ИСТИНА (TRUE), коммуникационный драйвер чувствителен к состоянию сигнала готовности модема (DSR). Драйвер игнорирует любые принимаемые байты, если сигнал DSR модемной линии ввода данных не высокий. fTXContinueOnXoff Если этот член структуры - ИСТИНА (TRUE), то передача продолжается и после того, как байты заполнения буфера ввода данных достигают XoffLim, а драйвер передал символ члена XoffChar, чтобы остановить прием байтов. Если этот член структуры - ЛОЖЬ (FALSE), передача не продолжается до тех пор, пока выгружаемые байты буфера ввода данных не достигнут XonLim, а драйвер не передаст символ члена структуры XonChar, чтобы возобновить прием. fOutX Указывает, используется ли XON/XOFF управление потоком данных в ходе передачи. Если этот член структуры - ИСТИНА (TRUE), передача останавливается, когда принимается символ члена структуры XoffChar и начинается снова, когда принят символ члена XonChar. fInX Указывает, используется ли XON/XOFF управление потоком данных в ходе приема. Если этот член структуры - ИСТИНА (TRUE), символ члена структуры XoffChar отправляется тогда, когда заполняемые байты буфера ввода данных достигают величины XoffLim, а символ члена XonChar отправляется тогда, когда выгружаемые байты буфера ввода данных находятся в пределах величины XonLim . fErrorChar Указывает, заменяются ли байты, принятые с ошибками четности символом, определенным членом структуры ErrorChar. Если этот член структуры - ИСТИНА (TRUE), и член структуры fParity - ИСТИНА (TRUE), замена происходит. fNull Если этот член структуры - ИСТИНА (TRUE), при приеме пустые байты сбрасываются. fRtsControl Сигнал RTS ( готовности к передаче) управления потоком данных. Этот член структуры может быть одним из следующих значений. RTS_CONTROL_DISABLE Отключает линию RTS, когда устройство открывается и оставляет ее отключенной. RTS_CONTROL_ENABLE Включает в работу линию RTS, когда устройство открывается и оставляет ее включенной. RTS_CONTROL_HANDSHAKE Включает процедуру установления связи RTS. Драйвер поднимает линию RTS, когда (входной) буфер "опережающего ввода с клавиатуры" заполнен меньше, чем на половину и понижает линию RTS, когда буфер заполнен больше, чем на три четверти. Если процедура установления связи разрешается, то это - ошибка для прикладной программы, которая корректирует линию, используя функцию EscapeCommFunction. RTS_CONTROL_TOGGLE Определяет, что линия RTS должна быть поднята, если байты доступны для передачи. После того, как все буферизированные байты отправлены, линия RTS должна быть опущена. Windows Me/98/95: Это значение не поддерживается. fAbortOnError Если этот член структуры - ИСТИНА (TRUE), драйвер завершает все операции чтения и записи с состоянием ошибки, если происходит ошибка. Драйвер не будет допускать любую дальнейшую коммуникационную операцию до тех пор, пока приложение не подтвердит ошибку при помощи вызова функции ClearCommError. fDummy2 Зарезервированный; не используется. wReserved Зарезервированный; должен быть нуль. XonLim Минимальное число байтов, которое допустимо в буфере ввода данных перед активизацией управления потоком данных, когда их задерживает отправитель. Обратите внимание! на то, что то, что отправитель может передать символы после того, как стал активным сигнал управления потоком данных, так что это значение никогда не должно равняться нулю. Это предполагает, что или XON/XOFF, RTS, или DTR сигнал управления потоком данных устанавливается в членах структуры fInX, fRtsControl или fDtrControl. XoffLim Максимальное число байтов, допустимое в буфере ввода данных перед активизацией управления потоком данных, чтобы дать возможность осуществить передачу отправителю. Это предполагает, что или XON/XOFF, RTS, или DTR сигнал управления потоком данных устанавливаются в членах структуры fInX, fRtsControl или fDtrControl. Максимальное допустимое число байтов рассчитывается, путем вычитания этого значения из размера буфера ввода данных, в байтах. ByteSize Число переданных и принятых битов, в байтах. Parity Используемая схема четности. Этот член структуры может быть одним из следующих значений. EVENPARITY Проверка по четности MARKPARITY Проверка четности по метке NOPARITY Без проверки четности ODDPARITY Проверка по нечетности SPACEPARITY Проверка четности по паузе StopBits Число используемых стоповых битов. Этот член структуры может быть одним из следующих значений. ONESTOPBIT 1 стоповый бит ONE5STOPBITS 1.5 стоповых бита TWOSTOPBITS 2 стоповых бита XonChar Значение символа XON и для передачи и для приема. XoffChar Величина символа XOFF и для передачи и для приема. ErrorChar Значение символа, используемого для замены байтов, принятых с ошибкой четности. EofChar Значение символа, используемого для сигнала о конце данных. EvtChar Значение символа, используемого, чтобы предупредить о событии. wReserved1 Зарезервирован; не используется. Замечания Когда используется структура DCB, чтобы конфигурировать 8250, применяют ниже перечисленные ограничения к значениям, указанным в членах ByteSize и StopBits: Число битов данных должно быть от 5 до 8 битов. Использование 5 битов данных с 2 стоповыми битами - недопустимая комбинация, также как и 6, 7 или 8 битов данных с 1.5 стоповыми битами. */ //настройка параметров порта if(!SetCommState(handle, &dcb)){return FALSE; } //инициализируем структуру таймаутов порта if(!GetCommTimeouts(handle, &CommTimeOuts)) {return FALSE; } //заполняем структуру таймаутов порта CommTimeOuts.ReadIntervalTimeout = 0; CommTimeOuts.ReadTotalTimeoutMultiplier = 0; CommTimeOuts.ReadTotalTimeoutConstant = 0; CommTimeOuts.WriteTotalTimeoutMultiplier = 0; CommTimeOuts.WriteTotalTimeoutConstant = 0; //настройка таймаутов порта if(!SetCommTimeouts(handle, &CommTimeOuts)) {return FALSE; } //Очистка буфера приема ComPortResetRB(); //очистка буфера передачи ComPortResetWB(); //The End return TRUE; } //закрытие порта void ComPortClose(void) { CloseHandle(handle); } // очистка буфера приема void ComPortResetRB(void) { PurgeComm(handle, PURGE_RXCLEAR); } // очистка буфера передачи void ComPortResetWB(void) { PurgeComm(handle, PURGE_TXCLEAR); } // считать число принятых символов в буфере приема // (еще не считанных функцией Read) unsigned short ComPortGetWBSize(void) { unsigned long temp; ClearCommError(handle, &temp, &ComState); return (unsigned short)ComState.cbOutQue; } // считать число еще не переданных символов в буфере передачи unsigned short ComPortGetRBSize(void) { unsigned long temp; ClearCommError(handle, &temp, &ComState); return (unsigned short)ComState.cbInQue; } //прочитать символ из порта без ожидания unsigned char ComPortInKey(void) { unsigned char tmp; unsigned long tmp2; ClearCommError(handle, &tmp2, &ComState); if(ComPortGetRBSize()==0)return 0; ReadFile(handle,&tmp, 1, &tmp2, NULL); return tmp; } //прочитать символ из порта без ожидания unsigned short ComPortInKey16(void) { unsigned char tmp; unsigned long tmp2; ClearCommError(handle, &tmp2, &ComState); if(ComPortGetRBSize()==0)return 0; ReadFile(handle,&tmp, 1, &tmp2, NULL); return 0x0100|tmp; } //записать символ в порт void ComPortPut(unsigned char a) { unsigned long tmp2; ClearCommError(handle, &tmp2, &ComState); WriteFile(handle, &a, 1, &tmp2, NULL); } //записать строку в порт void ComPortPutStr(unsigned char* str) { for(int i=0;i<100;i++) { if(str[i]==0)return; ComPortPut(str[i]); } } //