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

📄 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
**
**
*/

#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.  
#define WM_COMM_PERR_DETECTED		WM_USER+10	// Printer error detected
#define WM_COMM_RX80FULL_DETECTED	WM_USER+11	// Receive buffer is 80 percent full
#define WM_COMM_SPECIFYEVENT1		WM_USER+12	// Provider specific event 1
#define WM_COMM_SPECIFYEVENT2		WM_USER+13	// Provider specific event 2

#define WM_COMM_EVENT				WM_USER+100	// COMM event
#define WM_COMM_ERROR				WM_USER+101	// comm error

#define COMM_ERR_RXOVER				201	// Receive Queue overflow
#define COMM_ERR_OVERRUN			202	// Receive Overrun Error
#define COMM_ERR_RXPARITY			203	// Receive Parity Error
#define COMM_ERR_FRAME				204	// Receive Framing error
#define COMM_ERR_BREAK				205	// Break Detected
#define COMM_ERR_TXFULL				206	// TX Queue is full
#define COMM_ERR_PTO				207	// LPTx Timeout
#define COMM_ERR_IO					208	// LPTx I/O Error
#define COMM_ERR_DNS				209	// LPTx Device not selected
#define COMM_ERR_OOP				210	// LPTx Out-Of-Paper
#define COMM_ERR_MODE				211	// Requested mode unsupported
#define COMM_ERR_BADID				212	// Invalid or unsupported id
#define COMM_ERR_NOPEN				213	// Device Already Open
#define COMM_ERR_MEMORY				214	// Unable to allocate queues
#define COMM_ERR_DEFAULT			215	// Error in default parameters
#define COMM_ERR_HARDWARE			216	// Hardware Not Present
#define COMM_ERR_BYTESIZE			217	// Illegal Byte Size
#define COMM_BAUDRATE				218	// Unsupported BaudRate

#define DEFAULT_BUFSIZE		0x800		// 2K

#ifndef _COMSEND_HEX
#define _COMSEND_HEX
#endif

#ifndef _USE_DEFAULT_BUFSIZ
#define _USE_DEFAULT_BUFSIZ
#endif

enum {COMERRSTATE_READ, COMERRORSTATE_WRITE};

typedef struct _ComErrorState
{
	DWORD dwErrFlag;
	int enWhile;
}ComErrorState;

typedef struct _ComSendStruct
{
	ULONG nSizeBuf;
#ifdef _USE_DEFAULT_BUFSIZ
	BYTE sendBuf[DEFAULT_BUFSIZE];
#else
	BYTE* sendBuf;
#endif
}ComSendStruct;

/*
typedef struct _ComRcvStruct
{
	int nSize;
	LPCTSTR lpszBuf;
}ComRcvStruct;
*/

class CSerialPort
{														 
public:
	// contruction and destruction
	CSerialPort();
	virtual		~CSerialPort();

	// port initialisation											
	BOOL		InitPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 19200, char parity = 'N', UINT databits = 8, UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_CTS, UINT nBufferSize = 512);

	// port termination
	int			ClosePort();

	// start/stop comm watching
	BOOL		StartMonitoring();
	BOOL		RestartMonitoring();
	BOOL		StopMonitoring();

	DWORD		GetWriteBufferSize();
	DWORD		GetCommEvents();
	DCB			GetDCB();

	BOOL		IsRunning() {return m_bThreadRunning;}
	BOOL		IsNeedThreadStopping() {return m_bNeedThreadStop;}
	void		NeedThreadStopping(BOOL bNeed) {m_bNeedThreadStop = bNeed;}
	void		WriteToPort(void* string, ULONG nCount);
	CString		GetComName() {return m_sComName;}
	void		SetComName(CString s)
	{
		m_sComName = s;
	}

protected:
	static void CommErrorProc(HWND hRcvWnd, DWORD dwErrorCode, LPARAM dwPortNum, BOOL bRead = TRUE);
	// protected memberfunctions
	void		ProcessErrorMessage(char* ErrorText);
	static UINT	CommThread(LPVOID pParam);
	static void	ReceiveChar(CSerialPort* port, COMSTAT comstat);
	static void	WriteChar(CSerialPort* port);

	// thread
	CWinThread*			m_Thread;

	// synchronisation objects
	CRITICAL_SECTION	m_csCommunicationSync;
	BOOL				m_bThreadAlive;

	// handles
	HANDLE				m_hShutdownEvent;
	HANDLE				m_hComm;
	HANDLE				m_hWriteEvent;
	HANDLE				m_hOpenCom;
	HANDLE				m_hCloseCom;

	// 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[5];

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

	// owner window
	CWnd*				m_pOwner;

	// misc
	UINT				m_nPortNr;
#ifndef _COMSEND_HEX
	BYTE*				m_szWriteBuffer;
#else
	ComSendStruct		m_comWriteBuffer;
#endif
	DWORD				m_dwCommEvents;
	DWORD				m_nWriteBufferSize;

	CString				m_sComName;
	BOOL				m_bThreadRunning;
	BOOL				m_bNeedThreadStop;
};

#endif __SERIALPORT_H__

⌨️ 快捷键说明

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