⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serialobject.h

📁 一个基于API的串口通信程序,多线程有bug,大家修改修改后使用
💻 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 + -