📄 serialport.h
字号:
/*
** 文件名称: CSerialPort.h
**
** 描述: 这个类能读,写和监视一个端口
** 当端口发生事件时他能给所有者发送消息
** 这个类创建一个线程来读和写,因此,主程序不会阻塞
**
** 作者: 李洋
*/
#ifndef __SERIALPORT_H__
#define __SERIALPORT_H__
#define WM_COMM_BREAK_DETECTED WM_USER+1 // 检测到一个输入中断
#define WM_COMM_CTS_DETECTED WM_USER+2 // CTS信号改变(clear-to-send)
// 指可以传输了
#define WM_COMM_DSR_DETECTED WM_USER+3 // DSR信号改变(data-set-ready)
#define WM_COMM_ERR_DETECTED WM_USER+4 // 发生行状态错误
#define WM_COMM_RING_DETECTED WM_USER+5 // 检测到振铃信号
#define WM_COMM_RLSD_DETECTED WM_USER+6 // RLSD信号改变(receive-line-signal-detect)
#define WM_COMM_RXCHAR WM_USER+7 // 当输入缓冲区收到一个新字符
#define WM_COMM_RXFLAG_DETECTED WM_USER+8 // 输入缓冲区收到新的事件字符
#define WM_COMM_TXEMPTY_DETECTED WM_USER+9 // 输出缓冲区的最后一个字符被发出,发送缓冲区为空
class CSerialPort
{
public:
// contruction and destruction
// 构造函数和析构函数
CSerialPort();
virtual ~CSerialPort();
// port initialisation
// 端口初始化
BOOL InitPort(CWnd* pPortOwner, UINT portnr = 1, UINT baud = 4800,
char parity = 'N', UINT databits = 8, UINT stopsbits = 1,
DWORD dwCommEvents = EV_RXCHAR| EV_CTS , UINT nBufferSize = 2048);
// 开始/停止 监视
BOOL StartMonitoring(); // 开始监视线程
BOOL RestartMonitoring(); //
BOOL StopMonitoring(); // 停止监视线程
DWORD GetWriteBufferSize(); // 返回输出缓冲区大小
DWORD GetCommEvents(); // 返回事件的代码
DCB GetDCB(); // 返回DCB配置
void WriteToPort(char* string); // 向串口写一个字符串
protected:
// protected memberfunctions
// 保护成员函数
void ProcessErrorMessage(char* ErrorText); // 处理错误信息
static UINT CommThread(LPVOID pParam); // 线程函数
static void ReceiveChar(CSerialPort* port, COMSTAT comstat); // 收到一个字符
static void WriteChar(CSerialPort* port); // 写一个字符
BYTE* ReadBlock(CSerialPort* port,int &readLen);
// thread
// 线程
CWinThread* m_Thread;
// synchronisation objects
// 同步对象
CRITICAL_SECTION m_csCommunicationSync; // 同步对象
BOOL m_bThreadAlive; // 线程是否还在
// handles
// 句柄
HANDLE m_hShutdownEvent; // 关闭事件
HANDLE m_hComm; // com口句柄
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.
// 事件数组
// 一个元素被用作一个事件 ,这每一个端口有两个事件句柄
// 一个写事件和收到一个字符事件,哪个事件位于在结构体overlapped中(m_ov.hEvent)
// 当端口关闭时,正常的shutdown.
HANDLE m_hEventArray[3];
//结构
OVERLAPPED m_ov; // 异步结构对象
COMMTIMEOUTS m_CommTimeouts; // 超时设置结构对象
DCB m_dcb; // DCB结构对象
//所有者窗口
CWnd* m_pOwner;
//其他
UINT m_nPortNr; // 端口号
char* m_szWriteBuffer; // 要发送的数据地址
DWORD m_dwCommEvents; // 返回事件的代码
DWORD m_nWriteBufferSize; // 返回输出缓冲区的大小
};
#endif __SERIALPORT_H__
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -