📄 serialport.h
字号:
// SerialPort.h: interface for the CSerialPort class.
//
//////////////////////////////////////////////////////////////////////
#if !defined(AFX_SERIALPORT_H__9E263F73_9037_4DFD_A391_5176DC806079__INCLUDED_)
#define AFX_SERIALPORT_H__9E263F73_9037_4DFD_A391_5176DC806079__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CSerialException : public CException
{
public:
//Constructors / Destructors
CSerialException(DWORD dwError);
~CSerialException();
static void ThrowSerialException(DWORD dwError = 0);
//Methods
#ifdef _DEBUG
virtual void Dump(CDumpContext& dc) const;
#endif
virtual BOOL GetErrorMessage(LPTSTR lpstrError, UINT nMaxError, PUINT pnHelpContext = NULL);
CString GetErrorMessage();
//Data members
DWORD m_dwError;
protected:
DECLARE_DYNAMIC(CSerialException)
};
typedef struct tagCOMMDATA {
LPVOID pParam;
DWORD dwParamCount;
} COMMDATA;
class CSerialPort : public CObject
{
public:
//构造/析构函数
CSerialPort();
virtual ~CSerialPort();
public:
//串口操作的基本方法
void InitPort(CWnd* pPortOwner, UINT nPortNr = 1, UINT baud = 9600, char parity = 'N', UINT databits = 8,
UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_TXEMPTY, UINT nBufferSize = 1024);
void ClosePort(void) { ASSERT(m_hShutdownEvent); ::SetEvent(m_hShutdownEvent); }
operator HANDLE() const { return m_hComm; }
BOOL IsOpen(void) const { return m_hComm != INVALID_HANDLE_VALUE; }
#ifdef _DEBUG
void Dump(CDumpContext& dc) const;
#endif
public:
//串口配置及其他方法
void SetState(DCB& dcb);
void GetState(DCB& dcb);
void BuildDCB(const CString& strDef, DCB& dcb);
void BuildDCBAndTimeouts(const CString& strDef, DCB& dcb, COMMTIMEOUTS commtimeouts);
void ClearError(DWORD& dwErrors);
void GetStatus(COMSTAT& comstat);
void Escape(const DWORD& dwFunc);
void ClearDTR(void);
void ClearRTS(void);
void SetDTR(void);
void SetRTS(void);
void SetXOFF(void);
void SetXON(void);
void GetModemStatus(DWORD& dwModemStatus);
void GetProperties(COMMPROP& commprop);
void ClearBreak(void);
void SetBreak(void);
public:
//时间方法
void GetTimeouts(COMMTIMEOUTS& commtimeouts);
void SetTimeouts(COMMTIMEOUTS& commtimeouts);
void SetWaitTimeouts(const DWORD& dwMilliseconds = INFINITE) { m_dwTimeoutMilliseconds = dwMilliseconds; }
void Set0Timeout(void);
void Set0WriteTimeout(void);
void Set0ReadTimeout(void);
public:
//串口事件方法
void GetMask(DWORD& dwEvtMask);
void SetMask(const DWORD& dwEvtMask);
BOOL WaitEvent(DWORD& dwEvtMask, OVERLAPPED& overlapped);
public:
//队列方法
void Purge(const DWORD& dwFlags);
void Flush(void);
void Setup(const DWORD& dwInQueue, const DWORD& dwOutQueue);
void TerminateOutstandingWrites(void);
void TerminateOutstandingReads(void);
void ClearWriteBuffer(void);
void ClearReadBuffer(void);
public:
//配置方法
void GetConfig(COMMCONFIG& config);
static void GetDefaultConfig(UINT nPortNr, COMMCONFIG& config);
void SetConfig(COMMCONFIG& Config);
static void SetDefaultConfig(UINT nPortNr, COMMCONFIG& config);
public:
//线程操作方法
BOOL StartMonitoring(void);
BOOL StopMonitoring(void);
BOOL RestartMonitoring(void);
public:
//串口读写方法
BOOL Read(LPVOID lpBuffer, const DWORD& dwNumberOfBytesToRead, OVERLAPPED& overlapped, LPDWORD lpNumberOfBytesRead);
BOOL Write(LPCVOID lpBuffer, const DWORD& dwNumberOfBytesToWrite, OVERLAPPED& overlapped, LPDWORD lpNumberOfBytesWrite);
void GetOverlappedResult(OVERLAPPED& overlapped,DWORD& dwBytesTransfered, BOOL bWait);
void TransmitChar(const char& cChar);
public:
//自定义消息
static const UINT WM_COMM_BREAK_DETECTED;
static const UINT WM_COMM_CTS_DETECTED;
static const UINT WM_COMM_DSR_DETECTED;
static const UINT WM_COMM_ERR_DETECTED;
static const UINT WM_COMM_RING_DETECTED;
static const UINT WM_COMM_RLSD_DETECTED;
static const UINT WM_COMM_RXFLAG_DETECTED;
static const UINT WM_COMM_TXEMPTY_DETECTED;
static const UINT WM_COMM_READED_DETECTED;
static const UINT WM_COMM_TIMEOUT_DETECTED;
public:
//设置事件对象方法
void SetWriteEvent(void) { ASSERT(m_hWriteEvent); ::SetEvent(m_hWriteEvent); }
private:
BOOL SetReadEvent(void);
BOOL SetBreakEvent(DWORD& dwCommEvents);
protected:
//各种串口事件处理方法
BOOL HandleBreakEvent(DWORD& dwCommEvent);
void HandleShutdownEvent(void) { m_bThreadAlive = FALSE; }
void HandleWaitTimeouts(void);
//子类必须重载这两个方法,完成读写事件方法
//注意:HandleReadedEvent通过WM_COMM_TIMEOUT_DETECTED自定义消息传递COMMDATA自定义结构
// 如有必要可以扩充此结构,以满足用户需求
virtual BOOL HandleReadedEvent(LPVOID pParam = NULL, const DWORD& dwReadCount = 0) = 0;
virtual BOOL HandleWriteEvent(void) = 0;
private:
//串口句柄
HANDLE m_hComm;
//串口号
UINT m_nPortNr;
//串口监视的事件
DWORD m_dwCommEvents;
//串口设置结构
DCB m_dcb;
COMMTIMEOUTS m_CommTimeouts;
//超时
DWORD m_dwTimeoutMilliseconds;
//类的拥有者窗口
CWnd* m_pOwner;
//临界区变量
CRITICAL_SECTION m_csCommunicationSync;
private:
//重叠结构
OVERLAPPED m_ReadOverlapped;
OVERLAPPED m_BreakOverlapped;
protected:
OVERLAPPED m_WriteOverlapped;
private:
//事件及事件数组
HANDLE m_hShutdownEvent;
HANDLE m_hWriteEvent;
HANDLE m_hEventArray[4];
//线程对象
CWinThread* m_Thread;
//线程存活标志
BOOL m_bThreadAlive;
//线程函数
static UINT CommThread(LPVOID pParam);
//输入缓冲区
BYTE* m_lpInputBuffer;
UINT m_nBufferSize;
DECLARE_DYNAMIC(CSerialPort)
};
#endif // !defined(AFX_SERIALPORT_H__9E263F73_9037_4DFD_A391_5176DC806079__INCLUDED_)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -