?? comport.h
字號:
/*************************************************************************************************
*
* 模塊名稱:多線程串口通訊類
* 編制人:liu_sir 日期:2003.4.20 -4.30
* 版本:v1.0
* 主要類說明:
* CComPort 串口類 內(nèi)聚合一個CSerialPort類用于串口的操作
* 接收模式說明:
* 1.ManualReceiveByQuery, //手動查詢接收
* 2.ManualReceiveByConst, //定數(shù)接收(按照一定數(shù)量接收)
* 3.AutoReceiveBySignal, //信號自動接收
* 4.AutoReceiveByBreak, //自動中斷接收
* 推薦使用:1或3
* CReadComThread 串口讀線程類 和CComPort關(guān)聯(lián)起來進(jìn)行操作
*
*
***************************************************************************************************/
#pragma once
//接收函數(shù)
#ifndef COMPORT_H
#define COMPORT_H
typedef void (* FOnReceiveData)(LPVOID,void*,DWORD);
typedef void (* FOnComBreak)(LPVOID,DWORD,COMSTAT stat);
#include "serialport.h"
// CComPort 命令目標(biāo)
namespace LsComm{
class CReadComThread;
class CComPort
{
public:
enum ReceiveMode
{
ManualReceiveByQuery, //手動查詢接收
ManualReceiveByConst, //定數(shù)接收
AutoReceiveBySignal, //信號自動接收
AutoReceiveByBreak, //自動中斷接收
};
//Enums
enum FlowControl
{
NoFlowControl,
CtsRtsFlowControl,
CtsDtrFlowControl,
DsrRtsFlowControl,
DsrDtrFlowControl,
XonXoffFlowControl
};
enum Parity
{
EvenParity,
MarkParity,
NoParity,
OddParity,
SpaceParity
};
enum StopBits
{
OneStopBit,
OnePointFiveStopBits,
TwoStopBits
};
CComPort();
virtual ~CComPort();
//1.打開,關(guān)閉串口函數(shù)
void Open(int nPort,ReceiveMode mode=AutoReceiveBySignal, DWORD dwBaud = 9600, Parity parity = NoParity, BYTE DataBits = 8,
StopBits stopbits = OneStopBit, FlowControl fc = NoFlowControl);
void Close();
//2.設(shè)置接收函數(shù),中斷處理函數(shù)
void SetReceiveFunc(FOnReceiveData pfnOnReceiveData,LPVOID pSender);
void SetBreakHandleFunc(FOnComBreak pfnOnComBreak);
//3.獲取自身參數(shù)
int GetCurPortNum() { return this->m_CurPortNum; }
CSerialPort* GetSerialPort();
HANDLE GetCloseHandle();
ReceiveMode GetReceiveMode();
//4.(線程類)通知接收處理函數(shù)
void ReceiveData(void* pBuf,DWORD InBufferCount);//線程調(diào)用的接收函數(shù)
void ComBreak(DWORD dwMask);
//6.輸入,輸出函數(shù)--返回實(shí)際個數(shù)
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; //內(nèi)含串口類
CReadComThread* m_pReadThread; //讀串口線程
LPVOID m_pSender; //保存的父窗體指針
int m_CurPortNum; //當(dāng)前端口號
FOnReceiveData m_pfnOnReceiveData; //接收信號函數(shù)
FOnComBreak m_pfnOnComBreak; //串口事件處理函數(shù)
ReceiveMode m_RecvMode; //接收模式
HANDLE m_hWriteEvent; //寫事件
OVERLAPPED m_WriteOverlapped; //寫重疊結(jié)構(gòu)
bool m_IsOverlapped; //是否重疊結(jié)構(gòu);
private:
HANDLE m_hCloseEvent; //E: A event handle to close thread //Chinese:結(jié)束線程事件
};
DWORD WINAPI ThreadFunc(LPVOID lpParam ); //線程調(diào)用函數(shù)
class CReadComThread
{
public:
/*1.構(gòu)造與系構(gòu)函數(shù)
*/
CReadComThread();
virtual ~CReadComThread();
/* 2.創(chuàng)建,結(jié)束,復(fù)位
*/
void Create(); //創(chuàng)建線程
void Terminate(); //結(jié)束線程
void Resume(); //復(fù)位
bool IsTerminated() {return this->m_IsTerminated; }
/*3.綁定串口,異步讀取
*/
void BandSerialPort(CComPort* pPort); //綁定串口
DWORD ReadInput(void* pBuf,DWORD Count,DWORD dwMilliseconds);//異步讀取輸入
friend DWORD WINAPI ThreadFunc(LPVOID lpParam );
protected:
DWORD dwThreadId;//線程號
bool IsClose;
/*4.設(shè)置異步讀取事件,異步中斷事件以及處理事件
*/
bool SetReadEvent(OVERLAPPED& overlapped);//設(shè)置啟動讀事件
bool HandleReadEvent(OVERLAPPED& overlapped);//處理讀事件
bool HandleData(); //處理讀取數(shù)據(jù)
bool SetBreakEvent(DWORD& dwMask);//設(shè)置串口中斷事件,通過DWMask參數(shù)的改變返回監(jiān)聽狀態(tài)
bool HandleBreakEvent(DWORD dwMask);//處理串口中斷事件
/*5.手動模式,信號模式,中斷模式執(zhí)行線程
*/
void ExecuteByAutoSignalRecvMode();
void ExecuteByAutoBreakRecvMode();
void ExecuteByManualQueryRecvMode();
void ExecuteByManualConstRecvMode();
void Execute(void); //線程執(zhí)行
private:
HANDLE m_hThread; //線程句柄
CComPort* m_pPort; //關(guān)聯(lián)串口指針
byte m_InputBuffer[2048]; //接收緩沖區(qū)
byte* m_pBuffer; //實(shí)際的內(nèi)存
DWORD m_InBufferCount; //接收個數(shù)
OVERLAPPED m_ReadOverlapped; //讀取重疊結(jié)構(gòu)
OVERLAPPED m_BreakOverlapped; //串口中斷事件結(jié)構(gòu)
bool m_IsTerminated; //是否結(jié)束線程
};
}
#endif
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -