?? comport.h
字號:
/*************************************************************************************************
*
* 模塊名稱:多線程串口通訊類
* 編制人:liu_sir 日期:2003.4.20 -4.30
* 版本:v1.0
* 主要類說明:
* CComPort 串口類 內聚合一個CSerialPort類用于串口的操作
* 接收模式說明:
* 1.ManualReceiveByQuery, //手動查詢接收
* 2.ManualReceiveByConst, //定數接收(按照一定數量接收)
* 3.AutoReceiveBySignal, //信號自動接收
* 4.AutoReceiveByBreak, //自動中斷接收
* 推薦使用:1或3
* CReadComThread 串口讀線程類 和CComPort關聯起來進行操作
*
*
***************************************************************************************************/
#pragma once
//接收函數
#ifndef COMPORT_H
#define COMPORT_H
typedef void (* FOnReceiveData)(LPVOID,void*,DWORD);
typedef void (* FOnComBreak)(LPVOID,DWORD,COMSTAT stat);
#include "serialport.h"
// CComPort 命令目標
namespace LsComm{
class CReadComThread;
class CComPort
{
public:
enum ReceiveMode
{
ManualReceiveByQuery, //手動查詢接收
ManualReceiveByConst, //定數接收
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.打開,關閉串口函數
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.設置接收函數,中斷處理函數
void SetReceiveFunc(FOnReceiveData pfnOnReceiveData,LPVOID pSender);
void SetBreakHandleFunc(FOnComBreak pfnOnComBreak);
//3.獲取自身參數
int GetCurPortNum() { return this->m_CurPortNum; }
CSerialPort* GetSerialPort();
HANDLE GetCloseHandle();
ReceiveMode GetReceiveMode();
//4.(線程類)通知接收處理函數
void ReceiveData(void* pBuf,DWORD InBufferCount);//線程調用的接收函數
void ComBreak(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; //內含串口類
CReadComThread* m_pReadThread; //讀串口線程
LPVOID m_pSender; //保存的父窗體指針
int m_CurPortNum; //當前端口號
FOnReceiveData m_pfnOnReceiveData; //接收信號函數
FOnComBreak m_pfnOnComBreak; //串口事件處理函數
ReceiveMode m_RecvMode; //接收模式
HANDLE m_hWriteEvent; //寫事件
OVERLAPPED m_WriteOverlapped; //寫重疊結構
bool m_IsOverlapped; //是否重疊結構;
private:
HANDLE m_hCloseEvent; //E: A event handle to close thread //Chinese:結束線程事件
};
DWORD WINAPI ThreadFunc(LPVOID lpParam ); //線程調用函數
class CReadComThread
{
public:
/*1.構造與系構函數
*/
CReadComThread();
virtual ~CReadComThread();
/* 2.創建,結束,復位
*/
void Create(); //創建線程
void Terminate(); //結束線程
void Resume(); //復位
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.設置異步讀取事件,異步中斷事件以及處理事件
*/
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; //線程句柄
CComPort* m_pPort; //關聯串口指針
byte m_InputBuffer[2048]; //接收緩沖區
byte* m_pBuffer; //實際的內存
DWORD m_InBufferCount; //接收個數
OVERLAPPED m_ReadOverlapped; //讀取重疊結構
OVERLAPPED m_BreakOverlapped; //串口中斷事件結構
bool m_IsTerminated; //是否結束線程
};
}
#endif
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -