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