📄 serialobject.h
字号:
// SerialObject.h: interface for the CSerialPort class.
//////////////////////////////////////////////////////////////////////
// 请参见Remon的CSerialPort类, 本类此他的CSerialPort进行更正和补充。
// 通过BoundsChecker 7.2测试,发现Remon的CSerialPort有多处内存泄漏及逻辑上的错误。泄漏的原因是创建的是系统对象, 而这些对象没有合理的释放。
// 1.内存泄漏如下:
// CreateEvent创建的几个(系统)事件对象,没有CloseHandle回收。请参见InitPort函数。
// InitializeCriticalSection后,当退出时,没有DeleteCriticalSection释放
// 2.逻辑上的错误:
// 在InitPort中: 如
// if (m_ov.hEvent!= NULL)
// {
// ResetEvent(m_ov.hEvent);
// }
// m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //@1
// 注意@1这行语句,以上这段代码应该改为:
// if (m_ov.hEvent!= NULL)
// {
// ResetEvent(m_ov.hEvent);
// }
// else
// {
// m_ov.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL); //@1
// }
// 同理,InitPort中其它类似的其它系统Event对象也应该这样处理
//
//
// 2004-11-27 10:11
// yuandequan
//
//////////////////////////////////////////////////////////////////////
#ifndef __SERIALPORT_OBJECT_H__
#define __SERIALPORT_OBJECT_H__
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
//监视串口事件
#define WM_COM_BREAK_DETECTED WM_USER+1
#define WM_COM_CTS_DETECTED WM_USER+2
#define WM_COM_DSR_DETECTED WM_USER+3
#define WM_COM_ERR_DETECTED WM_USER+4
#define WM_COM_RING_DETECTED WM_USER+5
#define WM_COM_RLSD_DETECTED WM_USER+6
#define WM_COM_RXCHAR_DETECTED WM_USER+7
#define WM_COM_RXFLAG_DETECTED WM_USER+8
#define WM_COM_TXEMPTY_DETECTED WM_USER+9
class CSerialPort
{
public:
CSerialPort();
virtual ~CSerialPort();
public:
BOOL InitPort(HWND hOverWnd, UINT portnr = 1, UINT baud = 9600,
char parity = 'N', UINT databits = 8, UINT stopbits = 1,
DWORD dwCommEvent = EV_RXCHAR | EV_CTS, UINT nWriteBufferSize = 512);
//
BOOL StartMonitoring(void);
BOOL SuspendMonitoring(void);
BOOL ResumeMonitoring(void);
BOOL TerminateMonitoring(void);
//
void WriteToPort(const BYTE *lpszWriteBuffer, int nLength);
void WriteToPort(CString& strWrite);
//
DWORD GetWriteBufferSize(void) const;
DWORD GetCommEvent(void) const;
DCB GetDCB() const;
protected:
void ProcessErrorMessage(LPCTSTR ErrorText) const;
static UINT CommThread(LPVOID pParam);
static void ReceiveChar(CSerialPort* port, COMSTAT comstat);
static void WriteChar(CSerialPort *port);
public:
HWND m_hOwnerWnd;
UINT m_nPortNr;
BYTE* m_lpszWriteBuffer;
DWORD m_dwWriteBufferSize;
DWORD m_dwCommEvent;
DCB m_dcb;
BOOL m_bThreadAlive;
public:
CWinThread* m_pThread;
CRITICAL_SECTION m_csCommunicationSync;
HANDLE m_hComm;
HANDLE m_hShutdownEvent;
HANDLE m_hWriteEvent;
HANDLE m_hEventArray[3];
OVERLAPPED m_ov;
COMMTIMEOUTS m_CommTimeouts;
CString m_strRec;
int m_nToSend;
/***************************************************************************/
private://以下私有,禁止挎贝构造,赋值,及在堆上创建对象。如果你需要,可以更改
CSerialPort(const CSerialPort& r) {ASSERT(0);}
CSerialPort& operator =(const CSerialPort& r) { ASSERT(0); return *this;}
static void* operator new(size_t size) { return ::operator new(size); }
static void operator delete(void *p) { ::operator delete(p); }
#if defined(_DEBUG) && !defined(_AFX_NO_DEBUG_CRT)
void* AFX_CDECL operator new(size_t nSize, LPCSTR lpszFileName, int nLine) { return ::operator new(nSize, lpszFileName, nLine);}
void AFX_CDECL operator delete(void* p, LPCSTR lpszFileName, int nLine) {operator delete(p, lpszFileName, nLine);}
#endif
/***************************************************************************/
};
#endif // __SERIALPROT_OBJECT_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -