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

📄 serialcomm.h

📁 云台控制的工具
💻 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 + -