📄 serialcomm.h
字号:
// SerialComm.h: interface for the CSerialComm class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(CCL_SERIALCOMM_H__BB2E42A9_8F66_481a_B3EC_5BF1B825FF6F__INCLUDED_)
#define CCL_SERIALCOMM_H__BB2E42A9_8F66_481a_B3EC_5BF1B825FF6F__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//#define SC_MSCOMOBJECT
#if !defined(SC_MSCOMOBJECT)
#define SC_MAXCOMNUM 256
#define SC_MAXCOMNAME 6
#endif //if !defined(SC_MSCOMOBJECT)
/////////////////////////////////////////////////////////////////////////////
// //
// -->-> class CSerialComm <-<-- //
// //
// 串行通讯类,可以用在利用计算机的串行通讯口进行数据通讯的的场合。该 //
// 类简化了串行通讯的操作步骤,同时也提供了灵活的控制方法。 //
// CSerialComm有两种完全不同实现形式,通过定义SC_MSCOMOBJECT标识符来决 //
// 定是以COM组件的形式实现还是纯C++形式来实现。如果是C++形式,则在该类中实 //
// 现所有功能,而如果是COM组件形式,则CSerialComm只是一个对SerialComm组件 //
// 进行访问地封装。 //
// //
/////////////////////////////////////////////////////////////////////////////
class CSerialComm
{
public:
void ClearWriteBuffer(void);
void ClearReadBuffer(void);
BYTE GetStopBits(void);
void SetStopBits(BYTE ucStopBits);
BYTE GetParity(void);
void SetParity(BYTE ucParity);
BYTE GetByteSize(void);
void SetByteSize(BYTE ucSize);
DWORD GetBaudrate(void);
void SetBaudrate(DWORD dwBaudrate);
BOOL GetCommState(DCB * pDCB);
BOOL SetCommState(DCB * pDCB);
BOOL ScanAddr(LPBYTE pucAddr);
long WriteTo(BYTE ucAddr, LPVOID pData, long lWriteSize);
BOOL GetAsyncOutput(void);
void SetAsyncOutput(BOOL bAsyncOutput = TRUE);
BOOL CommConfigDialog(void);
long Write(LPVOID pData, long lWriteSize);
long Read(LPVOID pBuff, long lReadSize);
LPCTSTR IsOpened(void);
void Close(void);
BOOL Open(LPCTSTR lpszCOMName, DWORD dwBaudrate = 0xFFFFFFFFl, DWORD dwParity = 0xFFFFFFFFl);
static int GetCOMs(LPCTSTR ** pppCOMs);
CSerialComm();
virtual ~CSerialComm();
protected:
#if !defined(SC_MSCOMOBJECT)
void SetDefaultConfig(DWORD dwBaudrate, BYTE ucParity);
//归整化波特率
//<参数>
// dwBaudrate: 输入波特率,该波特率可能不是一个合法值
//<返回值>
// 返回一个标准的波特率。
DWORD FormatBaudrate(DWORD dwBaudrate)
{
const DWORD adwStdBdrs[] =
{
CBR_110, CBR_300,
CBR_600, CBR_1200,
CBR_2400, CBR_4800,
CBR_9600, CBR_14400,
CBR_19200, CBR_38400,
CBR_56000, CBR_57600,
CBR_115200, CBR_128000,
CBR_256000
};
for (int i = 0; i < sizeof(adwStdBdrs) / sizeof(DWORD) - 1; i++)
{
if (adwStdBdrs[i] >= dwBaudrate)
break;
}
return DWORD(adwStdBdrs[i]);
}
//归整化校验方式
//<参数>
// ucParity: 输入校验方式,该校验方式可能不是一个合法值
//<返回值>
// 返回一个标准的校验方式。
BYTE FormatParity(BYTE ucParity)
{
const BYTE aucStdPars[] =
{
NOPARITY,
ODDPARITY,
EVENPARITY,
MARKPARITY,
SPACEPARITY
};
int iIndex=0;
for (int i=0; i < sizeof(aucStdPars) / sizeof(BYTE); i++)
{
if (aucStdPars[i] == ucParity)
{
iIndex = i;
break;
}
}
return BYTE(aucStdPars[iIndex]);
}
HANDLE m_hCOM; //串口句柄
OVERLAPPED m_stROverlapped; //用于读串口的重叠变量
OVERLAPPED m_stWOverlapped; //用于写串口的重叠变量
TCHAR m_atcCurCOM[SC_MAXCOMNAME]; //当前已经打开的串口名称
DCB m_stDCB; //当前串行通讯口DCB的镜像
COMMTIMEOUTS m_stCTO; //当前串行通讯口COMMTIMEOUTS的镜像
BOOL m_bAsyncOutput; //异步输出
BOOL m_bShowCommConfigDialog; //标识当前是否显示
#endif //if !defined(SC_MSCOMOBJECT)
};
#endif // !defined(CCL_SERIALCOMM_H__BB2E42A9_8F66_481a_B3EC_5BF1B825FF6F__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -