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

📄 serialport.h

📁 本例是一个关于串口通信的例子
💻 H
字号:
/*
**	FILENAME			CSerialPort.h
**
**	PURPOSE				This class can read, write and watch one serial port.
**						It sends messages to its owner when something happends on the port
**						The class creates a thread for reading and writing so the main
**						program is not blocked.
**
**	CREATION DATE		15-09-1997
**	LAST MODIFICATION	12-11-1997
**
**	AUTHOR				Remon Spekreijse
**
**  使用说明:
**  在父窗口类中定义端口对象  
**  在父窗口中初始化端口
**  在父窗口中发送数据
**  在父窗口中添加对消息WM_COMM_RXCHAR的响应函数,例如
**  1---afx_msg long OnCommunicationcation(WPARAM ch , LPARAM port )
**  2---ON_MESSAGE(WM_COMM_RXCHAR , OnCommunicationcation) 
**  3---long CPortTestDlg::OnCommunicationcation(WPARAM ch , LPARAM port )
**      函数OnCommunicationcation用于从串口中接收数据
**
*/



#ifndef __SERIALPORT_H__
#define __SERIALPORT_H__

#define WM_COMM_BREAK_DETECTED		WM_USER+1	// A break was detected on input.
#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	// A character was received and placed in the input buffer. 
#define WM_COMM_RXFLAG_DETECTED		WM_USER+8	// The event character was received and placed in the input buffer.  
#define WM_COMM_TXEMPTY_DETECTED	WM_USER+9	// The last character in the output buffer was sent.  

class CSerialPort
{														 
public:
	//构造函数
	CSerialPort();
	virtual		~CSerialPort();

	//端口初始化											
	BOOL		InitPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 9600, char parity = 'N', UINT databits = 8, UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_CTS, UINT nBufferSize = 512);

	//开始或者停止串都监视(线程)
	//开始线程
	BOOL		StartMonitoring();
	//唤醒线程
	BOOL		RestartMonitoring();
	//暂停线程
	BOOL		StopMonitoring();
	//杀死线程
	BOOL KillMonitoring(void);
    //获得写缓冲区大小
	DWORD		GetWriteBufferSize();
	//获得串口事件
	DWORD		GetCommEvents();
	//获得设备控制块
	DCB			GetDCB();
	//向串口写入一个字符串
	void		WriteToPort(char* pChar,int nCount);
	//设置设备控制块
	void SetDCB(DCB &dcb);
	//关闭串口
	BOOL ClosePort(void);
protected:
	//私有成员函数
	//处理错误消息
	void		ProcessErrorMessage(char* ErrorText);
	//串口线程
	static UINT	CommThread(LPVOID pParam);
	//接收字符
	static void	ReceiveChar(CSerialPort* port, COMSTAT comstat);
	//写字符
	static void	WriteChar(CSerialPort* port);

protected:
	//线程对象
	CWinThread*			m_Thread;
	//同步对象
	CRITICAL_SECTION	m_csCommunicationSync;
	//线程状态标志
	BOOL				m_bThreadAlive;
	//句柄
	HANDLE				m_hShutdownEvent;
	HANDLE				m_hComm;
	HANDLE				m_hWriteEvent;
	HANDLE				m_hWriteCompleteEvent;

	// Event array. 
	// One element is used for each event. There are two event handles for each port.
	// A Write event and a receive character event which is located in the overlapped structure (m_ov.hEvent).
	// There is a general shutdown when the port is closed. 
	HANDLE				m_hEventArray[3];

	// structures
	OVERLAPPED			m_ov;
	COMMTIMEOUTS		m_CommTimeouts;
	DCB					m_dcb;

	// owner window
	CWnd			   *m_pOwnerWnd;

	// misc
	UINT				m_nPortNr;
	char			   *m_szWriteBuffer;
	DWORD				m_dwCommEvents;
	DWORD				m_nWriteBufferSize;
	DWORD				m_nWriteSize;
	
};

#endif __SERIALPORT_H__


⌨️ 快捷键说明

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