我编了一个通讯类,其中有初始化串口的函数,里面用了::BuildCommDCB()函数,现遇到一个比较奇怪的问题,请大伙帮忙看看:
我在应用类中定义一个通讯变量,在InitInstance()函数中打开串口后通讯都是正常的,但到文档类中做同样的操作通讯就不成功。后来我查了一下,发现是初始化时用BuildCommDCB()得到的dcb结构中有无效的参数,所以用SetCommState()设置串口参数不成功,而在应用类中初始化时是正常的,小的百思不的其解,不知道有没有人遇到过这种问题?
我在应用类中定义一个通讯变量,在InitInstance()函数中打开串口后通讯都是正常的,但到文档类中做同样的操作通讯就不成功。后来我查了一下,发现是初始化时用BuildCommDCB()得到的dcb结构中有无效的参数,所以用SetCommState()设置串口参数不成功,而在应用类中初始化时是正常的,小的百思不的其解,不知道有没有人遇到过这种问题?
GENERIC_READ|GENERIC_WRITE,
0,//exclusive access
NULL,//no security attrs
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,//FILE_ATTRIBUTE_NORMAL,
NULL);
if(m_hComm==(HANDLE)0xFFFFFFFF)
return FALSE;
if(EventMask>0){
if(!::SetCommMask(m_hComm,EventMask))
return FALSE;
}
if(!::SetupComm(m_hComm,m_dwInQueue,m_dwOutQueue))
return FALSE;
::PurgeComm( m_hComm, PURGE_TXABORT | PURGE_RXABORT |
PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
// set up for overlapped I/O commset=p_sCommSet;
if(!::BuildCommDCB(commset,&m_dcb))//这句有差异
return FALSE;
m_dcb.fParity=true;
m_dcb.fBinary=true;
::SetCommState(m_hComm,&m_dcb);
DCB dcb;
BOOL fsuccess;
fsuccess = GetCommState(idComDev, &dcb);
if (!fsuccess) return 0;
dcb.BaudRate =baud_rate;
dcb.ByteSize =8; //number of bits/byte, 4-8
dcb.Parity =NOPARITY;
dcb.StopBits =ONESTOPBIT;
dcb.EvtChar=0x02;
/*
dcb.fOutxCtsFlow = 1;
dcb.fDtrControl = 1;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
*/
dcb.fOutxCtsFlow = 0;
dcb.fDtrControl = 0;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
//dcb.fNull=TRUE; fsuccess=SetCommState(idComDev, &dcb);
if (!fsuccess) return 0;
啊 我初始化设置都是用SetCommState的,还真没用过BuildCommDCB,这里是不是不应该这么用阿
dcb.ByteSize =8; //number of bits/byte, 4-8
dcb.Parity =NOPARITY;
dcb.StopBits =ONESTOPBIT;
dcb.EvtChar=0x02;
/*
dcb.fOutxCtsFlow = 1;
dcb.fDtrControl = 1;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
*/
dcb.fOutxCtsFlow = 0;
dcb.fDtrControl = 0;
dcb.fRtsControl = 2;
dcb.EofChar = 0;
//dcb.fNull=TRUE;
这样直接赋值就可以了吧