hCom=::CreateFile(com,
GENERIC_READ|GENERIC_WRITE, //允许读和写
0, //独占方式
NULL,
OPEN_EXISTING, //打开而不是创建
0, //同步方式
NULL);
if((HANDLE)-1==hCom) {
return false;
}
SetupComm(hCom,dwInQueue,dwOutQueue); //输入缓冲区和输出缓冲区的大小都是1024
COMMTIMEOUTS TimeOuts;
//设定读超时
// 接收时,两字符间最大的时延
TimeOuts.ReadIntervalTimeout =10;// MAXDWORD;
// 读取每字节的超时
TimeOuts.ReadTotalTimeoutMultiplier = 1;
// 读串口数据的固定超时
// 总超时 = ReadTotalTimeoutMultiplier * 字节数 + ReadTotalTimeoutConstant
TimeOuts.ReadTotalTimeoutConstant =3;
// 写每字节的超时
TimeOuts.WriteTotalTimeoutMultiplier = 3;
// 写串口数据的固定超时
TimeOuts.WriteTotalTimeoutConstant = 3;
SetCommTimeouts(hCom,&TimeOuts); //设置超时
DCB dcb;
GetCommState(hCom,&dcb);
dcb.BaudRate=bt;
dcb.ByteSize=8; //每个字节有8位
dcb.Parity=NOPARITY; //无奇偶校验位
dcb.StopBits=ONESTOPBIT; //1个停止位
if(!SetCommState(hCom,&dcb))
return false;
PurgeComm(hCom,PURGE_TXCLEAR|PURGE_RXCLEAR);
isConnect=true;
COMSTAT ComStat;
DWORD dwErrorFlags;
BOOL bWriteStat;
ClearCommError(hCom,&dwErrorFlags,&ComStat);
bWriteStat=WriteFile(hCom,buff->data,buff->Length,&buff->Length,NULL);
if(!bWriteStat)
{
ErrorInfo info;
info.errorCode=-1;
info.paramter=0;
info.message="COM write error.";
OnError(&info);
return -1;
}
// PurgeComm(hCom, PURGE_TXABORT| PURGE_RXABORT|PURGE_TXCLEAR|PURGE_RXCLEAR);
SendBuffSucess(buff);
PurgeComm(hCom, PURGE_TXABORT|PURGE_TXCLEAR);
Buff buff;
BOOL readFlag;
COMSTAT ComStat;
DWORD dwErrorFlags;
memset(&buff,0,sizeof(Buff));
ClearCommError(hCom,&dwErrorFlags,&ComStat);
readFlag=ReadFile(this->hCom,buff.data,sizeof(buff.data),&buff.Length,NULL);
if(!readFlag) {
ErrorInfo info;
info.errorCode=-1;
info.paramter=0;
info.message="COM read error.";
OnError(&info);
return false;
}
if(buff.Length==0){
TimerOut();
return true;
}
if(hCom)
{
ret=CloseHandle(hCom);
if(ret){
hCom=NULL;
}
}