class CYSerial
{
public:
CYSerial():m_hFile(INVALID_HANDLE_VALUE)
{
}
~CYSerial()
{
}
__inline HANDLE GetHandle(){return m_hFile;}
//设置超时
void SetTimeout(
DWORD ReadIntervalTimeout=1,
DWORD ReadTotalTimeoutConstant=100,
DWORD ReadTotalTimeoutMultiplier=0,
DWORD WriteTotalTimeoutMultiplier=0, DWORD WriteTotalTimeoutConstant=0)
{
COMMTIMEOUTS timeout;
timeout.ReadIntervalTimeout=ReadIntervalTimeout;
timeout.ReadTotalTimeoutConstant=ReadTotalTimeoutConstant;
timeout.ReadTotalTimeoutMultiplier=ReadTotalTimeoutMultiplier;
timeout.WriteTotalTimeoutConstant=WriteTotalTimeoutConstant;
timeout.WriteTotalTimeoutMultiplier=WriteTotalTimeoutMultiplier;
SetCommTimeouts(m_hFile,&timeout);
}
//发送
bool Send(void * pData,int nLen)
{
DWORD nWritten;
if (m_hFile==INVALID_HANDLE_VALUE) return false;
WriteFile(m_hFile,pData,nLen,&nWritten,NULL);
return true;
}
bool Recv(void * pData,UINT * puLen,USHORT usTimeout,UINT nMaxbuf=1024)
{
SetTimeout(MAXDWORD,usTimeout,MAXDWORD,0,0);
if (m_hFile==INVALID_HANDLE_VALUE) return false;
ReadFile(m_hFile,pData,nMaxbuf,(LPDWORD)puLen,NULL);
if (*puLen<=0) return false;
return true;
}
//关闭串口
void Close()
{
if (m_hFile==INVALID_HANDLE_VALUE) return ;
::CloseHandle(m_hFile);
m_hFile = INVALID_HANDLE_VALUE;
}
bool Open (BYTE byPort,UINT nBaud=115200,BYTE byDataBits=8,
BYTE byParity=NOPARITY,BYTE byStopBits=ONESTOPBIT, DWORD dwInQueue=10240, DWORD dwOutQueue=10240)
{
if (m_hFile!=INVALID_HANDLE_VALUE) return false;
CString szDevie;
#ifdef _WIN32_WCE
szDevie.Format(_T("COM%d:"),byPort);
#else
szDevie.Format(_T("COM%d"),byPort);
#endif
m_hFile = ::CreateFile(szDevie,
GENERIC_READ|GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);
if (m_hFile==INVALID_HANDLE_VALUE) return false;
if (!::SetupComm(m_hFile,dwInQueue,dwOutQueue))
{
ASSERT(0);Close();
return false;
}
DCB dcb;
memset(&dcb,0,sizeof(DCB));
if (!::GetCommState(m_hFile,&dcb)) {ASSERT(0);return false;}
dcb.BaudRate = DWORD(nBaud);
dcb.ByteSize = BYTE(byDataBits);
dcb.Parity = BYTE(byParity);
dcb.StopBits = BYTE(byStopBits);
dcb.fParity = (byParity != NOPARITY);
if (!::SetCommState(m_hFile,&dcb)) return false;
SetTimeout();
return true;
}
bool Open(LPCTSTR szPort, LPCTSTR szDef=_T("115200,n,8,1"), DWORD dwInQueue=1024, DWORD dwOutQueue=1024)
{
m_hFile = ::CreateFile(szPort,
GENERIC_READ|GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
0,
0);
if (m_hFile==INVALID_HANDLE_VALUE) return false;//直接打开失败
if (!::SetupComm(m_hFile,dwInQueue,dwOutQueue)){ASSERT(0);Close();return false;}
DCB dcb;
if (!::GetCommState(m_hFile,&dcb)) {ASSERT(0);return false;}
#ifndef _WIN32_WCE
BuildCommDCB(szDef,&dcb);
#endif
if (!::SetCommState(m_hFile,&dcb)){ASSERT(0);return false;}
SetTimeout();
return true;
}
void Clean()
{
PurgeComm(m_hFile,PURGE_RXCLEAR);
}
protected:
void SetHandle(HANDLE hHandle)
{
m_hFile=hHandle;
}
HANDLE m_hFile;
};
}
打开串口: 创建串口(CreateFile) -- 设置输入输出缓存区打消(SetupComm)-- 设置超时(SetCommTimeouts) -- 获取DCB结构体(GetComm) -- 给DCB结构体赋值 -- 设置DCB结构体(SetCommState) -- 清空输入输出缓存区(PurgeComm)。
发送数据:清空输出缓存(PurgeComm) -- 清除硬件的通信错误(ClearCommError) -- 写数据(WriteFile)
接收数据:清除硬件的通信错误并获取通信设备的当前状态(ClearCommError)-- 获取输出缓存区的字节数 (COMSTAT::cbInQue)-- 读取数据 (ReadFile)
关闭串口:CloseHandle