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

📄 serialport.h

📁 使用Socket和多线程技术实现远程通信
💻 H
字号:
// SerialPort.h: interface for the CSerialPort class.

#ifndef __SERIALPORT_H__
#define __SERIALPORT_H__

//---定义消息名称
#define WM_COMM_BREAK_DETECTED		WM_USER+1	// 输入产生中断
#define WM_COMM_CTS_DETECTED		WM_USER+2	// The CTS (clear-to-send) signal changed state. 
#define WM_COMM_DSR_DETECTED		WM_USER+3	// The DSR (data-set-ready) signal changed state. 
#define WM_COMM_ERR_DETECTED		WM_USER+4	// A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY. 
#define WM_COMM_RING_DETECTED		WM_USER+5	// A ring indicator was detected. 
#define WM_COMM_RLSD_DETECTED		WM_USER+6	// The RLSD (receive-line-signal-detect) signal changed state. 
#define WM_COMM_RXCHAR				WM_USER+7	// 缓冲区接收到一个字符 
#define WM_COMM_RXFLAG_DETECTED		WM_USER+8	// 事件标志
#define WM_COMM_TXEMPTY_DETECTED	WM_USER+9	// 输出缓冲区最后一个的字符已经发送


#define CR 0x0D
#define LF 0x0A
/*
 *	摘 要:采用API编写的串口类,适合多线程的应用
	作 者:杨帆
	完成时间:2004.6.15
 */

class CSerialPort  
{
public:
	CSerialPort();
	virtual ~CSerialPort();
protected:
	//---定义一个辅助线程
	CWinThread*			m_pThread;

	// 
	CRITICAL_SECTION	m_csCommunicationSync;
	BOOL				m_bThreadAlive;

	//---定义句柄
	HANDLE				m_hWriteEvent;
	HANDLE				m_hShutdownEvent;
	HANDLE				m_hComm;

	//---定义一个事件数组,因为对于每个串口在重叠式读写中存在两个事件句柄

	HANDLE				m_hEventArray[3];

	//---定义关于串口的结构体
	OVERLAPPED			m_ov;
	COMMTIMEOUTS		m_CommTimeouts;
	DCB					m_hDcb;

	//---定义辅助窗体,作为消息的句柄
	CWnd*				m_hWnd;

	//
	UINT				m_nPortID;			//the number of the serial port
	UINT				m_nBaud;			//daud rate 
	char*				m_szWriteBuffer;	//buffer of writing
	char*				m_szReadBuffer;
	DWORD				m_dwCommEvents;
	DWORD				m_dwWriteBufferSize;
	DWORD				m_dwReadBufferSize;
	int					m_nWriteSize;
//	int					m_nReadSize;

	//Implemention
public:
	int InitialPort(CWnd* pPortwnd,
							 UINT nMinPort, UINT nMaxPort,
							 UINT baud, 
							 char parity, 
						     UINT databits, 
							 UINT stopbits, 
							 DWORD dwCommEvents, 
							 UINT writebuffersize,
							 UINT readbuffersize);
	//---串口的打开与关闭
	BOOL		InitialPort(CWnd* pPortwnd,
							UINT portnr , 
							UINT baud, 
							char parity, 
							UINT databits, 
							UINT stopbits, 
							DWORD dwCommEvents, 
							UINT writebuffersize,
							UINT readbuffersize);
//	BOOL InitialPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 19200, char parity = 'N', UINT databits = 8, UINT stopbits = 1, DWORD dwCommEvents = EV_RXCHAR, UINT writebuffersize = 1024);
	void		ClosePort();			//close the serial port

	//---线程的操作
	BOOL		StartThread();
	BOOL		RestartThread();
	BOOL		PauseThread();
	BOOL		IsThreadAlive();

	//----
	DWORD		GetWriteBufferSize();
	DWORD		GetCommEvents();
	DCB			GetDCB();
	inline UINT		GetPortID(void);   //get the ID of the serial port
	inline UINT		GetBaudrate(void); //get the baud rate of the serial port
	//---发送字符串
	void		SendString(CString str);
	void		WriteToPort(LPCTSTR string);
	char		ConvertHexChar(char ch);
	void		String2Hex(CString str, CString &senddata);

protected:
	void		ProcessErrorMessage(char* ErrorText);
	static UINT	CommThread(LPVOID lParam);
	static void	ReadComm(CSerialPort* port, COMSTAT ComStat);
	static void	WriteComm(CSerialPort* port);



};
inline UINT CSerialPort::GetBaudrate(){ return m_nBaud; }
inline UINT CSerialPort::GetPortID(){ return m_nPortID; }
inline BOOL CSerialPort::IsThreadAlive() { return m_bThreadAlive; }
#endif __SERIALPORT_H__

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -