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

📄 comport.cpp

📁 通过GSM模块接收和发送短信的代码。在eVC4.0下编译通过
💻 CPP
📖 第 1 页 / 共 3 页
字号:
		MessageBox(NULL, TEXT("系统无法接管"),TEXT("系统提示信息"),MB_OK);
	}
	return TRUE;
}

void CComPort::TextualData(char sbuf[])
{
	try
	{
		char tempbuf[1024]="\0";
		char *pStr;
		strcat(DataSaveBuff,sbuf);
	Next_Loop:
		pStr=strstr(DataSaveBuff,"\r\n");
		if(pStr==NULL)//IF NO '\r\n' THER RETURN
			return ;

		memcpy(tempbuf,DataSaveBuff,strlen(DataSaveBuff)-strlen(pStr));
		tempbuf[strlen(DataSaveBuff)-strlen(pStr)]='\0';

		if (strlen(tempbuf)>0)
		{
			
			TextualClassify(tempbuf);
		}

		strcpy(tempbuf,"\0");
		strncpy(tempbuf,pStr+2,strlen(pStr)-2);
		tempbuf[strlen(pStr)-2]='\0';
		strcpy(DataSaveBuff,tempbuf);
		if(strlen(tempbuf)>0)
			goto Next_Loop;
	}
	catch(...)
	{
		MessageBox(NULL,TEXT("分析数据错误"),TEXT("提示信息"),MB_OK);
	}
}
DWORD WINAPI ProcRing(void *)
{
	port.LocalVoice (0);
	sndPlaySound(TEXT("\\Storage Card\\Ring0.wav"),SND_FILENAME|SND_ASYNC|SND_LOOP);

	DWORD dwWaitResult;
	int I=0;
	do
	{
		dwWaitResult =WaitForSingleObject(port.m_RingEvent,1000);
		if ( dwWaitResult == WAIT_OBJECT_0 )
		{
			I=0;
			ResetEvent(port.m_RingEvent);
		}
		else
		{
			I++;
			if(I>5)
			{
				port.SetList (1,"ATH\r");
				break;
			}
		}
			
	}while(TRUE);
	sndPlaySound(NULL,SND_FILENAME|SND_ASYNC);
	CloseHandle(port.m_RingEvent);
	port.m_RingEvent=NULL;
	return TRUE;
}
void CComPort::TextualClassify(char buffer[])
{
#ifdef	TEST
	TCHAR out[1024];
	MultiByteToWideChar (CP_ACP,0,buffer,-1,out, strlen(buffer));
	out[strlen(buffer)]='\0';
/*	dlg->m_lst.InsertItem (0,out);*/
#endif

	char *Type;
	char ErrorNum[1024]="\0",sbuf[256]="\0";
	char readNum[1024]="\0",temp[512]="\0";
	Type=strstr(buffer,"RING");
	if(Type!=NULL)
	{
		if (theApp.AppSetup.HANDUP == 1)
		{
			//SetList(1,"AT+CLCC\r\0");
			if(hProcRing == NULL || m_RingEvent == NULL)
			{
				m_RingEvent=CreateEvent(NULL,TRUE,TRUE,NULL);
				hProcRing=CreateThread ((LPSECURITY_ATTRIBUTES)NULL,(DWORD)0,
					(LPTHREAD_START_ROUTINE)&ProcRing,(LPVOID)NULL,(DWORD)0,(LPDWORD)0);
			}

			SetEvent(m_RingEvent);
		}
		else//如果自動接聽
		{
			LocalVoice (0);
			sndPlaySound(TEXT("\\Storage Card\\Ring0.wav"),SND_FILENAME|SND_SYNC);
			LocalVoice (1);
			sndPlaySound(NULL,SND_FILENAME|SND_ASYNC);
			SetList (1,"ATA\r");
		}		
		return;
	}
	//来电显示
	Type=strstr(buffer,"+CLIP:");
	if(Type!=NULL)
	{
		SetEvent(m_RingEvent);

		Type=strstr(buffer,"\"");
		strncpy(sbuf,Type+1,strlen(Type)-1);
		sbuf[strlen(Type)-1]='\0';

		Type=strstr(sbuf,"\"");
		strncpy(sbuf,sbuf,strlen(sbuf)-strlen(Type));
		sbuf[strlen(sbuf)-strlen(Type)]='\0';
#ifdef	TEST
		MultiByteToWideChar (CP_ACP,0,sbuf,-1,out, strlen(sbuf));
		out[strlen(sbuf)]='\0';
		dlg->m_lst.InsertItem (0,out);
#endif
		return;
	}
	//如果有其他数据
	if(hProcRing != NULL && m_RingEvent==NULL)
	{
		hProcRing=NULL;
	}
	//列举短信结果读取
	Type=strstr(buffer,"+CMGL:");
	if(Type!=NULL)
	{
		Type=strstr(buffer,",");

		strncpy(readNum,buffer+6,strlen(buffer)-strlen(Type)-6);
		readNum[strlen(buffer)-strlen(Type)-6]='\0';
		//转换成ANSI
		sprintf(temp,"AT+CMGR=%d\r\0",atoi(readNum));//		
		SetList(1,temp);

		sprintf(temp,"AT+CMGD=%d\r\0",atoi(readNum));//		
		SetList(1,temp);
		
		return;
	}
	Type=strstr(buffer,"BUSY");
	if(Type!=NULL)
	{
		//有数据到来
		if (m_RingEvent != NULL)
		{
			ResetEvent(m_RingEvent);
			hProcRing=NULL;
		}

		LocalVoice (0);
		SetEvent(m_CmdFinish);
#ifdef	TEST
	dlg->m_lst.InsertItem (0,out);
#endif
		return;
	}
	Type=strstr(buffer,"NO");
	if(Type!=NULL)
	{
		//有数据到来
		if (m_RingEvent != NULL)
		{
			ResetEvent(m_RingEvent);
			hProcRing=NULL;
		}

		LocalVoice (0);
		SetEvent(m_CmdFinish);
#ifdef	TEST
	dlg->m_lst.InsertItem (0,out);
#endif
		return;
	}
	//发送短信开始
	Type=strstr(buffer,">");
	if(Type!=NULL)
	{
		SetEvent(m_CmdFinish);
#ifdef	TEST
	dlg->m_lst.InsertItem (0,out);
#endif
		return;
	}
	Type=strstr(buffer,"AT");
	if(Type!=NULL)
	{
		SetEvent(m_CmdFinish);
#ifdef	TEST
	dlg->m_lst.InsertItem (0,out);
#endif
		return;
	}
	//message complete
	Type=strstr(buffer,"OK");
	if(Type!=NULL)
	{
		SetEvent(m_CmdFinish);
#ifdef	TEST
	dlg->m_lst.InsertItem (0,out);
#endif
		return;
	}
	//ERROR
	Type=strstr(buffer,"ERROR");
	if(Type!=NULL)
	{
		SetEvent(m_CmdFinish);
#ifdef	TEST
	dlg->m_lst.InsertItem (0,out);
#endif
		return;
	}
	//INFORM MESSAGE COME
	Type=strstr(buffer,"+CMTI:");
	if(Type!=NULL)
	{
		Type=strstr(buffer,",");

		strncpy(readNum,Type+1,strlen(Type)-1);
		readNum[strlen(Type)-1]='\0';
		//转换成ANSI
		sprintf(temp,"AT+CMGR=%d\r\0",atoi(readNum));//		
		SetList(1,temp);

		sprintf(temp,"AT+CMGD=%d\r\0",atoi(readNum));//		
		SetList(1,temp);		
		return;
	}
	//SMS DATA
	if(strlen(buffer)<40)
	{
		return;
	}
	TextualSMS (buffer);
}

BOOL CComPort::SendData(char sText[])
{
	DWORD wrnum;
	COMSTAT lpStat;
	DWORD dwMask;                    //设置串口的事件屏蔽码。

	TCHAR out[512]=TEXT("\0");
	MultiByteToWideChar (CP_ACP,0,sText,-1,out, strlen(sText));
	out[strlen(sText)]='\0';
	dlg->m_lst.InsertItem (0,out);

	ClearCommError (m_hComm,&dwMask,&lpStat);
	// Write is pending.
	//WaitForSingleObject (m_Events,5*1000);
	//WaitForSingleObject (m_CmdFinish,5*1000);

	//ResetEvent (m_Events);
	//ResetEvent(m_CmdFinish);
	/*if (!WriteFile(m_hComm, sText, strlen(sText), &wrnum, NULL)) 
	{
		 return FALSE;
	}*/
	WriteFile(m_hComm, sText, strlen(sText), &wrnum, NULL);
	//WaitForSingleObject (m_Events,5*1000);
	//SetEvent (m_Events );
	

	//WaitForSingleObject (m_CmdFinish,5*1000);
	//SetEvent (m_CmdFinish );
	return TRUE;
}
BOOL CComPort::TalkData(char sText[])
{
	DWORD wrnum;
	COMSTAT lpStat;
	DWORD dwMask;                    //设置串口的事件屏蔽码。

	TCHAR out[512]=TEXT("\0");
	MultiByteToWideChar (CP_ACP,0,sText,-1,out, strlen(sText));
	out[strlen(sText)]='\0';
	dlg->m_lst.InsertItem (0,out);

	ClearCommError (m_hComm,&dwMask,&lpStat);
	// Write is pending.
	//WaitForSingleObject (m_Events,5*1000);
	//WaitForSingleObject (m_CmdFinish,5*1000);

	//ResetEvent (m_Events);
	//ResetEvent(m_CmdFinish);
	/*if (!WriteFile(m_hComm, sText, strlen(sText), &wrnum, NULL)) 
	{
		 return FALSE;
	}*/
	WriteFile(m_hComm, sText, strlen(sText), &wrnum, NULL);
	//WaitForSingleObject (m_Events,5*1000);
	//SetEvent (m_Events );
	

	WaitForSingleObject (m_CmdFinish,INFINITE);
	SetEvent (m_CmdFinish );
	return TRUE;
}

CComPort::SendData(char sText[],int iLen)
{
	DWORD wrnum;
//	COMSTAT lpStat;
	char Writbuffer[1024]="\0";

	//sprintf(Writbuffer,"AT+CMGS=%d\r%s\x1A\0",iLen,sText);
	sprintf(Writbuffer,"AT+CMGS=%d\r\0",iLen);
	//DWORD dwMask;                    //设置串口的事件屏蔽码。
	//ClearCommError (m_hComm,&dwMask,&lpStat);
	//WaitForSingleObject (m_Events,5*1000);

	//ResetEvent (m_Events);
	/*if (!WriteFile(m_hComm, Writbuffer, strlen(Writbuffer), &wrnum,NULL)) 
	{
		SetEvent (m_Events );
		return FALSE;
	}*/
	ResetEvent (m_CmdFinish);
	WriteFile(m_hComm, Writbuffer, strlen(Writbuffer), &wrnum,NULL);

	//WaitForSingleObject (m_Events,1*1000);
	WaitForSingleObject (m_CmdFinish,10);
	//SetEvent (m_Events );

	//MessageBox(NULL,TEXT("GO ON"),TEXT("NEXT"),MB_OK);
	//ResetEvent (m_Events);
	//ResetEvent (m_CmdFinish);
	sprintf(Writbuffer,"%s\x1A\0",sText);
	/*if (!WriteFile(m_hComm, Writbuffer, strlen(Writbuffer), &wrnum,NULL)) 
	{
		SetEvent (m_Events );
		return FALSE;
	}*/
	WriteFile(m_hComm, Writbuffer, strlen(Writbuffer), &wrnum,NULL);
	
//	WaitForSingleObject (m_Events,5*1000);
	//WaitForSingleObject (m_CmdFinish,5*1000);
//	SetEvent (m_Events );

	//MessageBox(NULL,TEXT("发送完毕"),TEXT("Finish"),MB_OK);

	return TRUE;
}



BOOL CComPort::EncodeSMSBody(TCHAR sText[],char sDest[],int iCode)
{
	char temp[1024]="\0",RetVal[1024]="\0",send[1024]="\0";
	int iTemp=0,iLen=0;
	char tpRet[1024]="\0";
	strcpy(send,"\0");//initialize
	/*if(!m_log.GetLog ("SMSCNo",tpRet))
		return FALSE;*/
#ifdef TAIWAN
	strcpy(temp,"886");//smsc code
#else
	strcpy(temp,"86");//smsc code
#endif

//	if(!setlog.GetStringFromINI("SMSC",tpRet))
//		return FALSE;
	strcat(temp,theApp.AppSetup.SMSC);    //smsc
	//temp[strlen(temp)]='\0';
	strcat(temp,"F\0");
	_swab(temp,RetVal,strlen(temp));//翻转字符
	sprintf(send,"%02X\0",strlen(RetVal)/2+1);//length
	iTemp=strlen(RetVal)/2+1;

	/*if(!m_log.GetLog ("SMSCTYPE",tpRet))
		return FALSE;*/
	strcat(send,"91");//type
	strcat(send,RetVal);//smsc complete
	strcpy(temp,"\0");
	strcpy(RetVal,"\0");

	strcat(send,"1100\0");//send mark
	//0891683108301705F011000D91683176118667F40000AA0A31323334353637383930.
	/*if(!m_log.GetLog ("DESTNo",tpRet))
		return FALSE;*/
#ifdef TAIWAN
	strcpy(temp,"886");//smsc code
#else
	strcpy(temp,"86");//smsc code
#endif
	strcat(temp,sDest);    //目的电话
	temp[strlen(temp)]='\0';
	strcat(temp,"F\0");
	_swab(temp,RetVal,strlen(temp));//翻转字符
	//SwapCode(temp,RetVal);
	sprintf(temp,"%02X\0",strlen(RetVal)-1);//desc length
	strcat(send,temp);
	/*if(!m_log.GetLog ("DESTTYPE",tpRet))
		return FALSE;*/
	strcat(send,"91");//desc type
	strcat(send,RetVal);//desc code
	strcpy(temp,"\0");
	strcpy(RetVal,"\0");
	
	char tp[8]="\0";
	switch(iCode)
	{
		/*case 1: //英文
			strcat(send,"0000FF");//编码和期限
			Encode7Text(sText,RetVal);//编码
			//短信长度
			sprintf(tp,"%02X\0",wcslen(sText));
			strcat(send,tp);
			break;*/
		case 2://中文
			strcat(send,"0019FF");//编码和期限
			Encode16Text(sText,RetVal);//编码
			//短信长度
			sprintf(temp,"%02X\0",((int)strlen(RetVal))/2);
			strcat(send,temp);
			break;
		default:
			return FALSE;
	}
	
	//strcpy(RetVal,buf);
	strcat(send,RetVal);
	iLen=strlen(send)/2-iTemp-1;

	//转换为命令列表

⌨️ 快捷键说明

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