HANDLE InitPort(LPTSTR port,INT TimeoutsType)
{
DWORD dwError;
DCB PortDCB;
COMMTIMEOUTS CommTimeouts;
HANDLE hPort;

hPort = CreateFile(port,GENERIC_READ|GENERIC_WRITE,
0,
NULL,
OPEN_EXISTING,
0,
NULL);
if(hPort == INVALID_HANDLE_VALUE){
dwError = GetLastError();
return INVALID_HANDLE_VALUE;
}
PortDCB.DCBlength = sizeof(DCB);
GetCommState(hPort,&PortDCB);
PortDCB.BaudRate = CBR_9600;
PortDCB.fBinary =  TRUE;
PortDCB.fParity = FALSE;
PortDCB.ByteSize = 8;
PortDCB.StopBits = ONESTOPBIT;
PortDCB.Parity = EVENPARITY;
if(!SetCommState(hPort,&PortDCB)){
dwError = GetLastError();
CloseHandle(hPort);
return INVALID_HANDLE_VALUE;
}
if(!GetCommTimeouts(hPort,&CommTimeouts)){
dwError = GetLastError();
CloseHandle(hPort);
return INVALID_HANDLE_VALUE;
}
if(TimeoutsType <= 0){
CommTimeouts.ReadIntervalTimeout = 0;
CommTimeouts.ReadTotalTimeoutConstant = 0;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 0;
}
else {
CommTimeouts.ReadIntervalTimeout = 0;
CommTimeouts.ReadTotalTimeoutConstant = TimeoutsType;
CommTimeouts.ReadTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutMultiplier = 0;
CommTimeouts.WriteTotalTimeoutConstant = 0;
}

if(!SetCommTimeouts(hPort,&CommTimeouts)){
CloseHandle(hPort);
dwError = GetLastError();
return INVALID_HANDLE_VALUE;
} return hPort;
}INT ReadPortNoThread(BYTE *DataBuf,INT *DataBufLen,BYTE EndChar,HANDLE hPort)
{
INT i = 0;
DWORD dwBytesTransferred;
unsigned char Byte;
DWORD dwError;
int *rtn_err = new int; while(1)
{
if(!ReadFile(hPort,&Byte,1,&dwBytesTransferred,0)){
dwError = GetLastError();
if(6 == dwError){
*rtn_err = INVALID_HANDLE;
return *rtn_err;
}
else{
*rtn_err = TIMEOUT;
return *rtn_err ;
}
}
if(dwBytesTransferred != 1){
dwError = GetLastError();
if(6 == dwError){
*rtn_err =  INVALID_HANDLE;
return *rtn_err ;
}
else {
*rtn_err =  TIMEOUT;
return *rtn_err ;
}
}
DataBuf[i++] = Byte;
if(Byte == EndChar) break;
}
*DataBufLen = i; *rtn_err = 0;
return 0;
}