📄 serialcomm.h
字号:
//=======================================================================================
//
// 模块名称:多线程串口通讯类
// 编制人:liu_sir 日期:2003.4.20 -4.30
// 版本:v1.0
// 主要类说明:
// CSerialComm 串口类,内聚合一个CSerialPort类用于串口的操作
// 接收模式说明:
// 1.ManualReceiveByQuery, // 手动查询接收
// 2.ManualReceiveByConst, // 定数接收(按照一定数量接收)
// 3.AutoReceiveBySignal, // 信号自动接收
// 4.AutoReceiveByBreak, // 自动中断接收
// 推荐使用:
// 1/3
//
// CSerialReadThread 串口读线程类,和CSerialComm关联起来进行操作
//=======================================================================================
#pragma once
#ifndef __SERIALCOMM_H__
#define __SERIALCOMM_H__
#include "serialport.h"
// 接收函数
typedef void (* PFNOnReceiveData) (LPVOID, void*, DWORD);
typedef void (* PFNOnComBreak) (LPVOID, DWORD, COMSTAT stat);
class CSerialReadThread;
//***************************************************************************************
// CSerialComm 命令目标
//***************************************************************************************
enum ReceiveMode
{
ManualReceiveByQuery, // 手动查询接收
ManualReceiveByConst, // 定数接收
AutoReceiveBySignal, // 信号自动接收
AutoReceiveByBreak, // 自动中断接收
};
class CSerialComm : public CObject
{
public:
CSerialComm();
virtual ~CSerialComm();
// 1.打开/关闭串口函数
void Open(int nPort, ReceiveMode mode = ManualReceiveByQuery, DWORD dwBaud = 4800,
Parity parity = NoParity, BYTE DataBits = 8,
StopBits stopbits = OneStopBit, FlowControl fc = NoFlowControl);
void Close();
// 2.设置接收函数/中断处理函数
void SetReceiveFunc(PFNOnReceiveData pfnOnReceiveData, LPVOID pSender);
void SetBreakHandleFunc(PFNOnComBreak pfnOnComBreak);
// 3.获取自身参数
int GetCurPortNum() { return m_CurPortNum; }
CSerialPort* GetSerialPort();
HANDLE GetCloseHandle();
ReceiveMode GetReceiveMode();
// 4.(线程类)通知接收处理函数
void OnReceiveData(void* pBuf, DWORD InBufferCount);// 线程调用的接收函数
void OnComBreak(DWORD dwMask);
// 6.输入/输出函数--返回实际个数
DWORD GetInBufferCount();
DWORD GetInput(void* pBuf,DWORD Count, DWORD dwMilliseconds = 1000);
DWORD Output(void* pBuf,DWORD Count);
BOOL IsOverlapped() { return m_IsOverlapped; }
protected:
CSerialPort* m_pPort; // 内含串口类
CSerialReadThread* m_pReadThread; // 读串口线程
LPVOID m_pSender; // 保存的父窗体指针
int m_CurPortNum; // 当前端口号
PFNOnReceiveData m_pfnOnReceiveData;// 接收信号函数
PFNOnComBreak m_pfnOnComBreak; // 串口事件处理函数
ReceiveMode m_RecvMode; // 接收模式
HANDLE m_hWriteEvent; // 写事件
OVERLAPPED m_WriteOverlapped; // 写重叠结构
BOOL m_IsOverlapped; // 是否重叠结构;
private:
HANDLE m_hCloseEvent; // 线程终止事件
};
//***************************************************************************************
// CSerialReadThread
//***************************************************************************************
DWORD WINAPI ThreadFunc(LPVOID lpParam);// 线程调用函数
class CSerialReadThread
{
public:
// 1.构造与析构函数
CSerialReadThread();
virtual ~CSerialReadThread();
// 2.创建/结束/复位
void Create(); // 创建线程
void Terminate(); // 结束线程
void Resume(); // 复位
BOOL IsTerminated() { return m_IsTerminated; }
// 3.绑定串口,异步读取
void BandSerialPort(CSerialComm* pPort); // 绑定串口
DWORD ReadInput(void* pBuf,DWORD Count,DWORD dwMilliseconds);// 异步读取输入
friend DWORD WINAPI ThreadFunc(LPVOID lpParam);
protected:
DWORD dwThreadId; // 线程号
BOOL m_IsClose;
// 4.设置异步读取事件,异步中断事件以及处理事件
BOOL SetReadEvent(OVERLAPPED& overlapped); // 设置启动读事件
BOOL HandleReadEvent(OVERLAPPED& overlapped); // 处理读事件
BOOL HandleData(); // 处理读取数据
BOOL SetBreakEvent(DWORD& dwMask); // 设置串口中断事件,通过DWMask参数的改变返回监听状态
BOOL HandleBreakEvent(DWORD dwMask);// 处理串口中断事件
// 5.以手动模式/信号模式/中断模式执行线程
void ExecuteByAutoSignalRecvMode();
void ExecuteByAutoBreakRecvMode();
void ExecuteByManualQueryRecvMode();
void ExecuteByManualConstRecvMode();
void Execute(void); // 执行线程
private:
HANDLE m_hThread; // 线程句柄
BOOL m_IsTerminated; // 是否结束线程
CSerialComm* m_pPortComm; // 关联串口指针
BYTE m_InputBuffer[2048]; // 接收缓冲区
BYTE* m_pBuffer; // 实际的内存
DWORD m_InBufferCount; // 接收个数
OVERLAPPED m_ReadOverlapped; // 读取重叠结构
OVERLAPPED m_BreakOverlapped; // 串口中断事件结构
};
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -