Тут читать, тут не читать, тут рыбу заворачивали... В конце концов, методом научного тыка, так и сделал, кажись не ошибся
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_DISABLE;
dcb.fAbortOnError = FALSE;
dcb.ByteSize = ByteSize;
dcb.Parity = Parity;
dcb.StopBits = StopBits;
//настройка параметров порта
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;
}
//записать символ в порт
void ComPortPut(unsigned char a)
{
unsigned long tmp2;
ClearCommError(handle, &tmp2, &ComState);
WriteFile(handle, &a, 1, &tmp2, NULL);
}