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

📄 multiserialapi.h

📁 一个串口通信的例子
💻 H
字号:
#if !defined(AFX_MULTISERIALAPI_H__A759622F_8590_4225_A4EA_405877962476__INCLUDED_)
#define AFX_MULTISERIALAPI_H__A759622F_8590_4225_A4EA_405877962476__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
// MultiSerialAPI.h : header file
//

#define uidisplaylength		24
#define inbufferlength		10240
#define MaxPort				32                            //串口最多使用个数

/*
**
**	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
**
**  修改        许士敏
**
** 日期        2003/08/16
**
*/

/* =======================================================================
	  作者:许士敏
		
	  Website:http://www.ChinaRTU.com
	  
	  Email: xsmeei@163.com
		
	  修改记录:2002.10.10
	======================================================================= */


//串口自定义消息定义
//输入break信号检测到 
//A break was detected on input.
#define WM_COMM_BREAK_DETECTED		WM_USER+1	
//CTS产生 
//The CTS (clear-to-send) signal changed state. 
#define WM_COMM_CTS_DETECTED		WM_USER+2	
//DSR产生 
//The DSR (data-set-ready) signal changed state. 
#define WM_COMM_DSR_DETECTED		WM_USER+3	
//错误产生 
//A line-status error occurred. Line-status errors are CE_FRAME, CE_OVERRUN, and CE_RXPARITY. 
#define WM_COMM_ERR_DETECTED		WM_USER+4	
//振铃信号检测到 
//A ring indicator was detected. 
#define WM_COMM_RING_DETECTED		WM_USER+5	
//RLSD产生 
//The RLSD (receive-line-signal-detect) signal changed state. 
#define WM_COMM_RLSD_DETECTED		WM_USER+6	
//串口接收到一个字符
//A character was received and placed in the input buffer 
#define WM_COMM_RXCHAR				WM_USER+7	
//串口接收事件产生
//The event character was received and placed in the input buffer.  
#define WM_COMM_RXFLAG_DETECTED		WM_USER+8	
//输出缓冲区最后一个字符发送完毕
//The last character in the output buffer was sent.  
#define WM_COMM_TXEMPTY_DETECTED	WM_USER+9	
//接收缓冲区最大长度
#define READBUFFERMAXSIZE           10240

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

private:
	// thread
	CWinThread*	  m_Thread;

	// synchronisation objects
	CRITICAL_SECTION	m_csCommunicationSync;
	BOOL				m_bThreadAlive;

	// handles
	//串口关闭句柄
	HANDLE				m_hShutdownEvent;
	//串口句柄
	HANDLE				m_hComm;
	//串口发送字符句柄
	HANDLE				m_hWriteEvent;

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

	// owner window
	//宿主窗口句柄
	CWnd*				m_pOwner;

	// structures
	//异步写串口时用到的重叠结构
	OVERLAPPED			m_ov;
	//超时参数结构
	COMMTIMEOUTS		m_CommTimeouts;
	//串口设备控制块结构
	DCB					m_dcb;

	// misc
	UINT				m_nPortNr;
	char*				m_szWriteBuffer;
	int                 m_iWriteLength;
	DWORD				m_dwCommEvents;
	DWORD				m_nWriteBufferSize;
    //2002.8.12串口通信是否打开的状态标志
	BOOL                m_bOpen;  

public:
	//2003.8.12串口接收数据处理
	char				chReadBuffer[READBUFFERMAXSIZE];
	int                 iReadDataLength;

public:
	//串口初始化,默认参数为:COM1,9600Baud,无奇偶校验,8数据位,1停止位,监控读事件
 	//port initialisation											
	BOOL	InitPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 9600, char parity = 'N', UINT databits = 8, UINT stopsbits = 1, DWORD dwCommEvents = EV_RXCHAR | EV_RXFLAG, UINT nBufferSize = 1024);
	// start/stop comm watching
	//启动串口监控线程
	BOOL	StartMonitoring();
	//启动串口监控线程
	BOOL	RestartMonitoring();
	//挂起口监控线程
	BOOL	StopMonitoring();
	DWORD	GetWriteBufferSize();
	DWORD	GetCommEvents();
	DCB		GetDCB();
	BOOL	WriteToPort(char* string, int length);
	void	ClosePort();
	BOOL    GetPortOpen();
	BOOL	OnPortSend(CString strSendData, unsigned int uiKind); 
	BOOL    SetDTREnable(BOOL bNewValue); 
	BOOL    SetParityEnable(BOOL bNewValue);

protected:
	// protected memberfunctions
	//显示出错原因
	void		ProcessErrorMessage(char* ErrorText);
	//串口监控线程
	static UINT	CommThread(LPVOID pParam);
	//串口接收一个字符
	static void	ReceiveChar(CSerialPort* port, COMSTAT comstat);
	//向串口写一个字符
	static void	WriteChar(CSerialPort* port);
};

/////////////////////////////////////////////////////////////////////////////
// CMultiSerialAPI window

class AFX_EXT_CLASS CMultiSerialAPI : public CWnd
{
// Construction
public:
	CMultiSerialAPI();

// Attributes
public:

// Operations
public:
	BOOL			 bComExist[MaxPort];
	CSerialPort		 m_Ports[MaxPort];
	CString          strProcess[MaxPort];

    CUIntArray ports,portse,portsu;
	char temp[100];
	BOOL bCommDisplay;
	unsigned short uirlength1[MaxPort];       //串口开始时的长度
	unsigned short uirlength2[MaxPort];       //串口定时判断中的长度
	CString        strReceiveBuffer[MaxPort]; //串口接收缓冲区内容

	BOOL OnCommsCreate(CWnd* pParentWnd);
	void OnCommSend(unsigned int uiCom, CString sSendData, unsigned int uiKind); 
	void OnMscommsSet();
	void OnHangUp(unsigned int uiCom); 
	void OnPortClose(unsigned int uiCom); 
	void OnRefreshDialogModeless(CString m_strReceive, CString m_strSend);
	void EnumerateSerialPorts(CUIntArray& ports,CUIntArray& portse,CUIntArray& portsu);
	BOOL SerialPortsCheck(int i);
	BOOL OnReadCommSets();
	void OnCloseAllPorts();
	BOOL OnComportTimerProcess(CString strProcess[MaxPort]);
	BOOL OnPopupDialog(); 	

	BOOL OnGetPortUse(unsigned int uiCom);
	BOOL OnGetPortExit(unsigned int uiCom); 

// Overrides
	// ClassWizard generated virtual function overrides
	//{{AFX_VIRTUAL(CMultiSerialAPI)
	//}}AFX_VIRTUAL

// Implementation
public:
	virtual ~CMultiSerialAPI();

	// Generated message map functions
protected:
	//{{AFX_MSG(CMultiSerialAPI)
	afx_msg int OnCreate(LPCREATESTRUCT lpCreateStruct);
	//}}AFX_MSG
	DECLARE_MESSAGE_MAP()
};

/////////////////////////////////////////////////////////////////////////////

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_MULTISERIALAPI_H__A759622F_8590_4225_A4EA_405877962476__INCLUDED_)

⌨️ 快捷键说明

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