📄 pehandle.cpp
字号:
#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 + -