📄 multiserialapi.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 + -