//---------------------------------------------------------------------------
#ifndef _MscommH_H
#define _MscommH_H
//---------------------------------------------------------------------------
#include <windows.h>
#include <stdio.h>
#include <string.h>
#define WM_COMM_RXCHAR WM_USER + 10 //自定义串口接收数据消息
class Mscomm
{
private:
HWND wHand; //主窗口句柄
HANDLE hThread; //线程句柄
HANDLE hComm; //串口句柄
bool IsOpen; //记录串口是否打开
bool ThreadFlag; //线程开关标记
OVERLAPPED WriteovReady,ReadovReady; //读写异步结构,用来保存异步操作结果
//以 Delimit 为分隔符拆分字符串 Str 到字符数组 S 中
// void SplitStr(String *S,String Str, char Delimit);
protected:
COMSTAT lpStat;
DWORD dwError;
DWORD GetInBufferCount()
{
dwError = 0;
lpStat.cbInQue = 0;
ClearCommError(hComm,&dwError,&lpStat);
return lpStat.cbInQue ;
}
void SetInBufferCount(int InBuf)
{
if(!InBuf)
PurgeComm(hComm, PURGE_RXCLEAR);
}
DWORD GetOutBufferCount()
{
dwError = 0;
lpStat.cbOutQue = 0;
ClearCommError(hComm,&dwError,&lpStat);
return lpStat.cbOutQue ;
}
void SetOutBufferCount(int OutBuf)
{
if(!OutBuf)
PurgeComm(hComm, PURGE_TXCLEAR);
}
void SetRThreshold(bool RTh) //线程开启和挂起函数
{
if((!this->ThreadFlag) && RTh)
{
ResumeThread(hThread);
}
if(this->ThreadFlag && !RTh)
{
SuspendThread(hThread);
}
this->ThreadFlag = RTh;
}
// bool GetRThreshold(void){return ThreadFlag;}
/***********************线程函数**********************/
static DWORD WaitThread(void *lp)
{
DWORD dwEventMask = 0; // 发生的事件
DWORD TempCount1 = 0;
DWORD TempCount2 = 0;
bool tFlag = FALSE;
OVERLAPPED Watch;
// HANDLE hEvent;
Mscomm *This = (Mscomm*)lp;
memset(&Watch,0,sizeof(Watch));
// 创建一个人工重设
Watch.hEvent = CreateEvent(NULL,FALSE,FALSE,"WatchEvent");
while(This->ThreadFlag)
{
if(WaitCommEvent(This->hComm,&dwEventMask,&Watch));
{
if(dwEventMask == EV_RXCHAR)
{
if(This->InBufferCount != 0)
{
SendMessage(This->wHand ,WM_COMM_RXCHAR,0,0);
dwEventMask = 0;
// while(This->InBufferCount != 0);
}
}
}
}
return 0;
}
//===============线程退出===============
void ExitThread()
{
if(ThreadFlag)
{
ThreadFlag = FALSE;
WaitForSingleObject(hThread,INFINITE);
}
CloseHandle(hThread);
}
public:
// int mPort; //端口号
//设置并返回接收缓冲区的字节数
// __property int InBufferSize = {write=SetInBufferSize};
//以字节的形式设置并返回传输缓冲区的大小
// __property int OutBufferSize = {write=SetOutBufferSize};
Mscomm(HWND hand = NULL);
virtual ~Mscomm();
bool OpenComm(int Port); //打开串口
void CloseComm(); //关闭打开的串口
bool CommSetting(char* Setting); //串口设置
bool RedComm(unsigned char* ReadData, //读串口数据
DWORD ReadCount=1);
bool WriteComm(char* Send); //发送数据到串口
__property DWORD InBufferCount = {read=GetInBufferCount,write=SetInBufferCount};
__property DWORD OutBufferCount = {read=GetOutBufferCount,write=SetOutBufferCount};
__property bool RThreshold = {write=SetRThreshold};
//__published:
};
#endif