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

📄 pehandle.cpp

📁 代码使用eVC4.0调试通过
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "StdAfx.h"
#include "GHeader.h"

CPeHandle pe;

CPeHandle::CPeHandle()
{
	//命令列表为0
	m_Cmd.RemoveAll();
	//命令队列指示器初始化
	m_cmdLstEvent=CreateEvent(NULL,TRUE,FALSE,NULL);

	//参数设置
	wchar_t FilePath[MAX_PATH] = _T("");

#ifdef WINCE 
	wcscpy(FilePath,_T("\\Storage Card\\Setup\\SMS\\setup.gps\0"));
#else
	wcscpy(FilePath,_T(".\\Setup\\SMS\\setup.gps\0"));
#endif

	//提取内容
	CFile fCode;
	
	fCode.Open(FilePath,CFile::modeRead);
	fCode.Read(&m_param ,sizeof(m_param));
	
	fCode.Close ();

}

CPeHandle::~CPeHandle ()
{
}

//读取数据
DWORD WINAPI ProcReadData(void *)   //读串口线程
{
	char   cbuf[2050]  ="\0";            //数据读取缓冲区
	//BOOL   Complete    =FALSE;           //读动作完成标志
	DWORD  dwReadNum   =0;               //一次读动作,所读取到的字符数目
	DWORD  dwReadMaxLen=2048;            //一次读动作,最多可以读取的字符数目
	DWORD  dwReadLen   =0;               //本次读动作,可以读取的字符长度
	DWORD  dwRetMask   =0;               //调用ClearCommError时,得到的错误代码
	COMSTAT lpStat;                     //串口状态结构变量。
	DWORD dwMask;                    //设置串口的事件屏蔽码。

	//2、开始读循环
	memset(&lpStat,0,sizeof(COMSTAT));                     //初始化串口状态结构变量   
	do
	{
		//1、查询串口
		if(!(ClearCommError (pe.m_hComm,&dwRetMask,&lpStat)))  //清除错误FLAG,查询串口是否有数据
			continue;

		//2、串口中有数据
		if(lpStat.cbInQue)
		{
			//设置本次读动作可以读取的字符长度://输入缓冲区字符长度和最大长度中的最小值
			dwReadLen=__min(dwReadMaxLen,lpStat.cbInQue);
			if(dwReadLen>0)
			{
				//开始读数据
				if(!(ReadFile(pe.m_hComm,cbuf,dwReadLen,&dwReadNum,NULL)))
				{
					continue;
				}
				//读动作完成,进行处理
				cbuf[dwReadNum]='\0';

				if(strlen(cbuf)>0)
				{
					//equipment.m_//pView->FillSecond (cbuf);
					pe.TextualData(cbuf);
					wchar_t tmp[64];
					wsprintf(tmp,_T("%d"),theApp.dlg.m_lst.GetItemCount());
					int i=theApp.dlg.m_lst.InsertItem (10,tmp);
					theApp.dlg.m_lst.SetItemText(i,1,tmp);//类别
					USES_CONVERSION;
					theApp.dlg.m_lst.SetItemText(i,2,A2W(cbuf));//数量
				}
				strcpy(cbuf,"\0");
			}

			continue;                     //继续下一次循环,查询串口中是否还有数据?
		}

		//3、等待串口事件屏蔽码的发生
		WaitCommEvent (pe.m_hComm,&dwMask,NULL);//函数返回FALSE
	}while(TRUE);

	CloseHandle (pe.m_hComm);         //关闭串口
	pe.m_hComm=NULL;
	MessageBox(NULL,_T("设备无法连接到数据中心(110)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
	return TRUE;
}

//数据发送端口
DWORD WINAPI ProcSendData(void *)   //读串口线程
{
	HANDLE hWait=CreateEvent (NULL,TRUE,TRUE,NULL);
	BOOL bWait=TRUE;

	int iIdle=0;
	while(TRUE)
	{
		if(pe.m_Cmd.GetCount()<1)
		{
			ResetEvent(pe.m_cmdLstEvent);
			WaitForSingleObject(pe.m_cmdLstEvent,INFINITE);
		}

		CmdStruct pt = pe.m_Cmd.GetHead();
		
		//发送命令
		WaitForSingleObject(hWait,300);
		//重置完成标志
		ResetEvent(pe.m_cmdLstEvent);
		if (1 == pt.iType)
			pe.SendData (pt.Param );
		else
			pe.SendData (pt.Param ,pt.iLen );

		WaitForSingleObject(pe.m_CmdFinish,5000);
		if(pe.m_lComplete ==0)
		{
			if (++iIdle < 3)
			{
				Sleep(500);
				ResetEvent(hWait);
				continue;
			}
		}

		pe.m_Cmd.RemoveHead();
		ResetEvent(hWait);
		iIdle=0;
	}
	//MessageBox(NULL,TEXT("退出发送"),TEXT("系统提示信息"),MB_OK);
	return TRUE;
}

//定时监测是否有报警
DWORD WINAPI ProcAlarm(void *)
{
	/*HANDLE hWait=CreateEvent (NULL,TRUE,FALSE,NULL);
	BOOL bAlarm=FALSE;
	char tel[32]="ATD\0";
	int iAlarm=1;
	while(TRUE)
	{
		WaitForSingleObject (hWait,1000*REGCHECK_INTERVAL);
		ResetEvent (hWait);

		bAlarm=FALSE;
		HKEY hKey;
		DWORD dwType=REG_DWORD;
		BYTE nBuf[128];
		DWORD dwLen;
		// regOpen
		hKey = 0;
		RegOpenKeyEx(HKEY_CURRENT_USER,TEXT("PLINK"),0,
			0,&hKey);
		
		// status
		memset(nBuf,0,sizeof(nBuf));
		dwLen = 128;
		RegQueryValueEx(hKey,TEXT("Alarm_Status"),0,&dwType,
			nBuf,&dwLen);
		
		if((nBuf[0] & 0x01) == 0x01) //0bit,RING
		{
			port.EncodeSMSBody(TEXT("RING报警"),theApp.AppSetup.SAFE1,2);
			port.EncodeSMSBody(TEXT("RING报警"),theApp.AppSetup.SAFE2,2);
			bAlarm=TRUE;
			//拨打电话
			port.LocalVoice (1);
			strcat(tel,theApp.AppSetup.SAFE1);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
			strcpy(tel,"ATD");
			strcat(tel,theApp.AppSetup.SAFE2);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
		}
		if(((nBuf[0]>>0x01) & 0x01) == 0x01)  //1bit,sos
		{
			port.EncodeSMSBody(TEXT("sos报警测试"),theApp.AppSetup.SOS1,2);
			port.EncodeSMSBody(TEXT("sos报警测试"),theApp.AppSetup.SOS2,2);
			
			bAlarm=TRUE;
			//拨打电话
			port.LocalVoice (1);
			strcat(tel,theApp.AppSetup.SOS1);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
			strcpy(tel,"ATD");
			strcat(tel,theApp.AppSetup.SOS1);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
		}
		if(((nBuf[0]>>0x02) & 0x01) == 0x01)  //2bit,BUGR ALARM
		{
			port.EncodeSMSBody(TEXT("BUGR ALARM报警测试"),theApp.AppSetup.SAFE1,2);
			port.EncodeSMSBody(TEXT("BUGR ALARM报警测试"),theApp.AppSetup.SAFE2,2);
			bAlarm=TRUE;
			//拨打电话
			port.LocalVoice (1);
			strcat(tel,theApp.AppSetup.SAFE1);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
			strcpy(tel,"ATD");
			strcat(tel,theApp.AppSetup.SAFE2);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
		}
		if(((nBuf[0]>>0x03) & 0x01) == 0x01)  //3bit,SPARE ALARM
		{
			port.EncodeSMSBody(TEXT("SPARE ALARM报警测试"),theApp.AppSetup.SAFE1,2);
			port.EncodeSMSBody(TEXT("SPARE ALARM报警测试"),theApp.AppSetup.SAFE2,2);
			bAlarm=TRUE;
			//拨打电话
			port.LocalVoice (1);
			strcat(tel,theApp.AppSetup.SAFE1);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
			strcpy(tel,"ATD");
			strcat(tel,theApp.AppSetup.SAFE2);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
		}
		if(((nBuf[0]>>0x05) & 0x01) == 0x01)  //5bit,ACC ON
		{
			port.EncodeSMSBody(TEXT("ACC ON报警测试"),theApp.AppSetup.SAFE1,2);
			port.EncodeSMSBody(TEXT("ACC ON报警测试"),theApp.AppSetup.SAFE2,2);
			bAlarm=TRUE;
			//拨打电话
			port.LocalVoice (1);
			strcat(tel,theApp.AppSetup.SAFE1);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
			strcpy(tel,"ATD");
			strcat(tel,theApp.AppSetup.SAFE2);
			strcat(tel,";\r");
			port.SetList (3,tel);
			port.SetList (1,"ATH\r");
		}
		
		//复位		
		if (bAlarm)
		{
			memset(nBuf,0,sizeof(nBuf));
			dwLen = 128;
			RegSetValueEx(hKey,TEXT("Alarm_Status"),0,dwType,nBuf,dwLen);
#ifdef	TEST
			port.dlg->m_lst.InsertItem (0,TEXT("系统报警测试"));
#endif
		}
#ifdef	TEST
		else
		{
			//nBuf[0]=iAlarm;
			//RegSetValueEx(hKey,TEXT("Alarm_Status"),0,dwType,nBuf,dwLen);
			//port.dlg->m_lst.InsertItem (0,TEXT("没有报警"));

			iAlarm *= 2;
			if (iAlarm ==32 ) 
				iAlarm=1;
		}
#endif
		RegCloseKey(hKey);	
	}*/
	return TRUE;
}

BOOL CPeHandle::InitPePort(wchar_t PortName[])
{
	//try
	{
		DCB dcb;                         //配置串口使用的结构。
		COMMTIMEOUTS TimeOuts;           //设置读写串口的超时所用的结构。
		DWORD dwMask;                    //设置串口的事件屏蔽码。
		TCHAR Msg[256]=TEXT("\0");

		//检索短信中心号码
		TCHAR temp[256]=TEXT("\0");
		
		//1、打开串口:可读写,不可共享,已存在,重叠操作
		m_hComm =CreateFile(PortName,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,0,NULL);
		if(m_hComm==INVALID_HANDLE_VALUE)
		{
			MessageBox(NULL,_T("设备无法连接到数据中心(-0-)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}

		//2、设置串口
		dcb.DCBlength =sizeof(DCB);
		if(!(GetCommState (m_hComm,&dcb)))   //得到当前串口的设置值,并填充到DCB结构中
		{
			CloseHandle (m_hComm);           //发生错误,关闭打开的文件句柄
			MessageBox(NULL,_T("设备无法连接到数据中心(1)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}
		dcb.DCBlength =sizeof(DCB);
		dcb.BaudRate =CBR_38400;//(unsigned long)rweslog.GetStringFromINI ("SPEED");           //设置串口的波特率:19200
		dcb.ByteSize =8;                   //每字的位数:8
		dcb.fParity  =FALSE;               //不支持校验动作
		dcb.Parity   =NOPARITY;            //没有校验位
		dcb.StopBits =ONESTOPBIT;          //一个停止位
		//dcb.fBinary  =TRUE;                //二进制模式传输
		//dcb.
		if(!(SetCommState (m_hComm,&dcb)))   //使用以上设置值的DCB结构设置串口
		{
			CloseHandle (m_hComm);           //发生错误,关闭打开的文件句柄
			MessageBox(NULL,_T("设备无法连接到数据中心(2)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}
		//设置DCB完成
		//3、设置I/O缓冲区大小:输入缓冲区&输出换缓冲区的大小:2048 Byte
		if(!(SetupComm (m_hComm,4096,4096)))
		{
			CloseHandle (m_hComm);           //发生错误,关闭打开的文件句柄
			MessageBox(NULL,_T("设备无法连接到数据中心(3)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}
		//串口缓冲区设置完毕

		//4、设置读写超时限制
		if(!(GetCommTimeouts (m_hComm,&TimeOuts)))     //获取系统当前的超时限制设置值
		{
			CloseHandle (m_hComm);           //发生错误,关闭打开的文件句柄
			MessageBox(NULL,_T("设备无法连接到数据中心(4)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}
		TimeOuts.ReadIntervalTimeout         =MINSHORT;    //读字符时间间隔
		TimeOuts.ReadTotalTimeoutMultiplier  =0;    //读字符时间系数
		TimeOuts.ReadTotalTimeoutConstant    =0;   //读数据超时常量
		TimeOuts.WriteTotalTimeoutMultiplier =10;    //写字符时间系数
		TimeOuts.WriteTotalTimeoutConstant   =1000;   //写字符超时常量

		if(!(SetCommTimeouts (m_hComm,&TimeOuts))) //使用以上设置值得的COMMTIMEOUTS结构设置读写超时限制
		{
			CloseHandle (m_hComm);           //发生错误,关闭打开的文件句柄
			MessageBox(NULL,_T("设备无法连接到数据中心(5)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}
		//读写超时限制设置完毕

		//5、设置串口事件屏蔽码
		if(!(GetCommMask (m_hComm,&dwMask)))   //获取系统当前事件屏蔽码的设置值
		{
			CloseHandle (m_hComm);           //发生错误,关闭打开的文件句柄
			MessageBox(NULL,_T("设备无法连接到数据中心(6)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}

		//设置事件屏蔽码为:EV_RXCHAR.即:输入缓冲区收到一个新字符时产生事件
		dwMask=EV_BREAK|EV_CTS|EV_DSR|EV_ERR|EV_RING|EV_RLSD|EV_RXCHAR|EV_RXFLAG|EV_TXEMPTY;     
		if(!(SetCommMask (m_hComm,dwMask)))
		{
			CloseHandle (m_hComm);           //发生错误,关闭打开的文件句柄
			MessageBox(NULL,_T("设备无法连接到数据中心(7)"),_T("\"神州通\"E@syGPS车辆监控管理系统"),MB_OK|MB_ICONEXCLAMATION);
			return FALSE;
		}
		//串口事件屏蔽码设置完毕

		//标示命令是否完成
		m_CmdFinish=CreateEvent(NULL,TRUE,TRUE,NULL);
		SetListData(1,0,"AT\r");

		SetListData(1,0,"ATE0\r");
		SetListData(1,0,"AT+CMGF=0\r");
		SetListData(1,0,"AT^SSYNC=1\r");
		SetListData(1,0,"AT^SNFS=4\r");
		SetListData(1,0,"AT^SNFO=1,10337,11598,13104,14602,16999,4,0\r");

		//
		SetListData(1,0,"AT+CNMI=1,1\r");
		SetListData(1,0,"AT+CLIP=1\r");
		SetListData(1,0,"AT+CMEE=1\r");
		//枚举短信内容
		SetListData(1,0,"AT+CMGL=4\r\0");	
		
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);
		pe.EncodeSMSBody("13671168764","13381026959",2);

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -