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

📄 modem.c

📁 一种MNODEM的控制程序.采用状态机的机制实现.
💻 C
📖 第 1 页 / 共 3 页
字号:
				mdm_wait1 = SWAIT3S;
			}
			break;
		case INIT_READALL_SMS_WAIT:
			mdm_wait1--;
			if(mdm_wait1 == 0) mdm_state1 = INIT_DEL_SMS;
			break;
		case INIT_DEL_SMS:
			if(mdm_sending_busy==0){
				SendATCmd(ModemOperateCMDString[13].pSend, strlen(ModemOperateCMDString[13].pSend), 0);
				mdm_state1 = INIT_DEL_SMS_WAIT;
				mdm_wait1 = SWAIT1S;
			}
			break;
		case INIT_DEL_SMS_WAIT:
			mdm_wait1--;
			if(mdm_wait1 == 0) {
				return INIT_OK;//初始化正确,完成
			}
			break;*/
		default:
			mdm_state1 = 0;
	}
	return 0;
}

void GetSMSPick_Proc(uchar flag)
{
	uchar i,j;
	i = j = 0;
	if(flag)
	{ 
    	while(i < mdmRtnbuf_cnt){
    		if(mdmRtnbuf[i] == ':') break;
    		i++;
    	}
        i=i+2;
    	while(i < mdmRtnbuf_cnt){
    		if(mdmRtnbuf[i] == ',') break;
    		EEBuf[j++] = mdmRtnbuf[i];
    		i++;
    	}
    	EEBuf[j++] = '\0';
    	SmsIndexBuf[SmsBT] = StrToUChar(&EEBuf[0]);
    	if(++SmsBT >= 40) SmsBT = 0;
    }
    
    i = j = 0;
	for(j=0;j<mdmRtnbuf_cnt;j++) if(mdmRtnbuf[j]=='"') break;/*查找第一个",*/
	j++;
	/*	+CMGL: 15,"REC UNREAD","+8613927413598",,"05/06/10,09:04:10+00"*/
	if(flag)	
	{
		if (NetPara.CommMode == COMM_MODE_CDMA_SMS)//CDMA
			j = j + 5;/*取掉"REC UNREAD",*/
		else{
			while(j<mdmRtnbuf_cnt)
			{
				if(mdmRtnbuf[j]=='"')break;/*查找第二个",*/
				j++;
			}
			j++;
			while(j<mdmRtnbuf_cnt)
			{
				if(mdmRtnbuf[j]=='"')break;/*查找第三个",*/
				j++;
			}
			j++;
		}
	}
	/*直通方式解包*/
	/*GSM====>+CMT: "+8613927413598",,"05/06/10,09:08:06+00"*/
	/*CDMA===>+CMT:"13927413598","05/06/22,12 :20 :12",129,0,2,0,"13927413598",15
X ARE YOU OK? X */

	while(i<mdmRtnbuf_cnt){
		if(mdmRtnbuf[i+j]=='"') break;/*查找第二个",电话号结束*/
		SMSPick.tel[i] = mdmRtnbuf[j+i];
		i++;
	}
	SMSPick.tel[i++] = 0;
  if(NetPara.CommMode != COMM_MODE_PSTN_DATA)
  {
	if (NetPara.CommMode == COMM_MODE_CDMA_SMS){/*CDMA*/
		SMSPick.year = (mdmRtnbuf[j+i+2]<<4)+(mdmRtnbuf[j+i+3]&0x0f);
		SMSPick.month = (mdmRtnbuf[j+i+5]<<4)+(mdmRtnbuf[j+i+6]&0x0f);
		SMSPick.day = (mdmRtnbuf[j+i+8]<<4)+(mdmRtnbuf[j+i+9]&0x0f);
		SMSPick.hour = (mdmRtnbuf[j+i+11]<<4)+(mdmRtnbuf[j+i+12]&0x0f);
		SMSPick.minute = (mdmRtnbuf[j+i+15]<<4)+(mdmRtnbuf[j+i+16]&0x0f);
		SMSPick.second = (mdmRtnbuf[j+i+19]<<4)+(mdmRtnbuf[j+i+20]&0x0f);
		SMSPick.gst = 0;
	}
	else{/*GSM*/
		SMSPick.year = (mdmRtnbuf[j+i+3]<<4)+(mdmRtnbuf[j+i+4]&0x0f);
		SMSPick.month = (mdmRtnbuf[j+i+6]<<4)+(mdmRtnbuf[j+i+7]&0x0f);
		SMSPick.day = (mdmRtnbuf[j+i+9]<<4)+(mdmRtnbuf[j+i+10]&0x0f);
		SMSPick.hour = (mdmRtnbuf[j+i+12]<<4)+(mdmRtnbuf[j+i+13]&0x0f);
		SMSPick.minute = (mdmRtnbuf[j+i+15]<<4)+(mdmRtnbuf[j+i+16]&0x0f);
		SMSPick.second = (mdmRtnbuf[j+i+18]<<4)+(mdmRtnbuf[j+i+19]&0x0f);
		SMSPick.gst = (mdmRtnbuf[j+i+21]<<4)+(mdmRtnbuf[j+i+22]&0x0f);
	}
  }
}

uchar GetSMSIndex()
{//+CMTI: "SM",17
	uchar i=0,j=0;
	while(i < mdmRtnbuf_cnt){
		if(mdmRtnbuf[i] == ',') break;
		i++;
	}
	i++;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == 0x0d)||(mdmRtnbuf[i] == 0)) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	EEBuf[j++] = '\0';
	return(StrToUChar(&EEBuf[0]));
}

schar GetCSQPara_Proc()
{//+CSQ: 30,99
	uchar i=0,j=0;
	while(i < mdmRtnbuf_cnt){
		if(mdmRtnbuf[i] == ':') break;
		i++;
	}
	i++;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == ',')) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	EEBuf[j++] = '\0';
	i = StrToUChar(&EEBuf[0]);
	if(i > 32) i = 32;//处理当为99时, 则查表返回值为0;
	return (ModemCSQ_Tab[i]);
}

void GetCCEDPara_Proc()
{//+CCED: 460,  00, 2532,    1039,        47,  594, 56,,,0,,,0,460,00,2532,0f48,43,66,59,460,00,2532,
 //       MCC,  MNC,LAC(HEX),CI(HEX),    BSIC,BCCH,RxLev,RxLev Full

	uchar i=0,j=0;
	//uint l;
	while(i < mdmRtnbuf_cnt){
		if(mdmRtnbuf[i] == ':') break;
		i++;
	}
	i++;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == ',')) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	i++;
	EEBuf[j++] = '\0';
	RealPara.MCC = StrToUInt(&EEBuf[0]);
	
	j=0;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == ',')) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	i++;
	EEBuf[j++] = '\0';
	RealPara.MNC = StrToUChar(&EEBuf[0]);

	j=0;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == ',')) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	i++;
	EEBuf[j++] = '\0';
	RealPara.LAC = StrHexToUInt(&EEBuf[0]);

	j=0;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == ',')) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	i++;
	EEBuf[j++] = '\0';
	RealPara.CI = StrHexToUInt(&EEBuf[0]);
	
	j=0;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == ',')) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	i++;
	EEBuf[j++] = '\0';
	RealPara.BSIC = StrToUChar(&EEBuf[0]);
	
	j=0;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == ',')) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	i++;
	EEBuf[j++] = '\0';
	RealPara.BCCH = StrToUInt(&EEBuf[0]);
	
	j=0;
	while(i < mdmRtnbuf_cnt){
		if((mdmRtnbuf[i] == ',')) break;
		EEBuf[j++] = mdmRtnbuf[i];
		i++;
	}
	EEBuf[j++] = '\0';
	RealPara.RxLev = (schar) StrToUChar(&EEBuf[0]);
}

uchar Wait_SMS_Proc()
{
	uchar ucRtn=0, i, j;
	switch(mdm_state1){
		case 0:
			mdm_state1 = 1;
			mdm_ATCCED_timer = MAX_SEND_CCED_TIME - 10;
			break;
		case 1:/*等待消息*/
			Rev_OK = ReadCMDLine();
			if(Rev_OK){
				if (strncmp(mdmRtnbuf,"+CMT:",5)==0) {/*直通时,收到短信*/
					GetSMSPick_Proc(0);
					if (NetPara.CommMode == COMM_MODE_CDMA_SMS){
						//next_state1 = 1;
						SendATCmd(ModemOperateCMDString[0].pSend, 
							strlen(ModemOperateCMDString[0].pSend), 0);						
						mdm_state1 = 4;
						mdm_wait1 = SWAIT5S;
						mdm_sending_busy = 1;
					}
					else{
						mdm_state1 = 1;
						//next_state1 = 0;
						mdm_wait1 = SWAIT1S;
					}
					mdmRtnbuf_cnt = 0;
				}
				else if ((strncmp(mdmRtnbuf,"+CMGR:",6)==0) 
				  /*|| (strncmp(mdmRtnbuf,"+CMGL:",6)==0)*/)
				{/*读取到短信*/
					GetSMSPick_Proc(1);
					mdm_state1 = 5;
					mdm_wait1 = SWAIT1S;
					mdmRtnbuf_cnt = 0;
					msgA_state = 4;
					PrintToUartB("Notify...Read SMS!",18);
				}
				else if (/*(strncmp(mdmRtnbuf,"+CMGR:",6)==0) 
				  || */(strncmp(mdmRtnbuf,"+CMGL:",6)==0))
				{/*读取到短信*/
					GetSMSPick_Proc(1);
					//mdm_state1 = 5;
					//mdm_wait1 = SWAIT1S;
					mdmRtnbuf_cnt = 0;
					msgA_state = 4;
				}
				else if (strncmp(mdmRtnbuf,"OK\r\n",4) == 0)/*收到OK*/
				{
					if(mdm_sending_busy) mdm_sending_busy = 0;
					Rev_OK = 0;
					mdmRtnbuf_cnt = 0;
				}
				else if (strncmp(mdmRtnbuf,"+CSQ:",5) == 0)/*收到OK*/
				{
					GetCSQPara_Proc();
					//if(mdm_sending_busy) mdm_sending_busy = 0;
					Rev_OK = 0;
					mdmRtnbuf_cnt = 0;
				}
				else if (strncmp(mdmRtnbuf,"+CCED:",6) == 0)/*收到OK*/
				{
					GetCCEDPara_Proc();
					//if(mdm_sending_busy) mdm_sending_busy = 0;
					Rev_OK = 0;
					mdmRtnbuf_cnt = 0;
				}
				else if((strncmp(mdmRtnbuf,"RING\r\n",6)==0))
				{/*振铃转应答*/
					ucRtn = 1;
				}
				else if(strncmp(mdmRtnbuf,"+CLIP:",6)==0)/*获取来电号*/
				{
					GetSMSPick_Proc(2);
					//SetLEDWarn(LED_ON, SWAIT100MS);
					RunLed_Period = SWAIT100MS;
				}

//				if(mdmRtnbuf[0] != SYNCB)	mdmRtnbuf_cnt = 0;
			}
			if(mdm_sending_busy == 0){
			    if (SmsBH != SmsBT){
			        mdm_state1 = 5;
			        mdm_wait1 = SWAIT50MS;
			    }
				else if(mdm_ATCCED_timer >= MAX_SEND_CCED_TIME)
				{//15分钟 检测modem是否在线
					mdm_ATCCED_timer = 0;
					mdm_state1 = 7;
					mdm_ReadSMS_Timer = 0;
					mdm_wait1 = SWAIT3S;
				}
				else if(mdm_ReadSMS_Timer >= MDM_READSMS_TIME){
					mdm_ReadSMS_Timer = 0;//保证操作modem之后, 间隔时间MDM_READSMS_TIME
					mdm_state1 = 2;
					mdm_wait1 = SWAIT3S;
				}
			}
			else{
				mdm_ReadSMS_Timer = 0;
			}
			break;
		case 2:/*非直通时,读取短信*/
			if((mdm_sending_busy == 0) && (mdm_wait1 == 0)){
				/*if (NetPara.CommMode == COMM_MODE_CDMA_SMS){
					SendATCmd(ModemOperateCMDString[3].pSend, strlen(ModemOperateCMDString[3].pSend), 0);
				}
				else{*/
			    if (SmsBH != SmsBT){
			        mdm_state1 = 5;
			        mdm_wait1 = SWAIT50MS;
			    }
			    else{
					SendATCmd(ModemOperateCMDString[12].pSend, strlen(ModemOperateCMDString[12].pSend), 0);
					mdm_state1 = 4;
					mdm_wait1 = SWAIT10S;
					mdm_sending_busy = 1;
					RevSmsIndicator = 0;
				}
			}
			if(mdm_wait1 > 0) mdm_wait1--;
			Rev_OK = ReadCMDLine();
			if(Rev_OK){
				if (strncmp(mdmRtnbuf,"OK\r\n",2) == 0)//收到OK
				{
					mdm_sending_busy = 0;
					Rev_OK = 0;
					mdmRtnbuf_cnt = 0;
				}
				else if ((strncmp(mdmRtnbuf,"+CMGR:",6)==0) 
				  || (strncmp(mdmRtnbuf,"+CMGL:",6)==0))
				{//读取到短信
					//mdm_sending_busy = 0;
					GetSMSPick_Proc(1);
					mdmRtnbuf_cnt = 0;
					msgA_state = 4;
					//mdm_state1 = 6;
					//mdm_wait1 = SWAIT1S;
					mdmRtnbuf_cnt = 0;
				}
			}
			break;
		case 3:/*如果是 CDMA系统时,发送AT+CNMA确认信号*/
//			if(mdm_sending_busy == 0){
/*
				SendATCmd(ModemOperateCMDString[0].pSend, strlen(ModemOperateCMDString[0].pSend), 0);
				mdm_state1 = 4;
				mdm_wait1 = WAIT1S;
				mdm_sending_busy = 1;*/
				mdm_state1 = 4;
				mdm_wait1 = 0;
//			}
			break;
		case 4:/*延时*/
			mdm_wait1--;
			Rev_OK = ReadCMDLine();
			if(Rev_OK){
				if (strncmp(mdmRtnbuf,"OK\r\n",2) == 0)//收到OK
				{
					mdm_sending_busy = 0;
					Rev_OK = 0;
					mdm_wait1 = SWAIT100MS;
/*					if(next_state1){
						mdm_state1 = next_state1;
						next_state1 = 0;
					}
					else*/
					if(RevSmsIndicator>0)//没有读取到SMS则不执行删除操作
						mdm_state1 = 5;
					else
						mdm_state1 = 1;
					mdmRtnbuf_cnt = 0;
				}
				else if ((strncmp(mdmRtnbuf,"+CMGR:",6)==0) 
				  || (strncmp(mdmRtnbuf,"+CMGL:",6)==0))
				{//读取到短信
					//mdm_sending_busy = 0;
					GetSMSPick_Proc(1);
					mdmRtnbuf_cnt = 0;
					msgA_state = 4;
					//mdm_state1 = 6;
					//mdm_wait1 = SWAIT1S;
					RevSmsIndicator++;
				}
			}
			else if((mdm_wait1 == 0)/*||(mdm_sending_busy == 0)*/){
				mdm_sending_busy = 0;
				if(RevSmsIndicator>0)//没有读取到SMS则不执行删除操作
					mdm_state1 = 5;
				else
					mdm_state1 = 1;
				mdmRtnbuf_cnt = 0;
			}
			break;
		case 5:
			if((mdm_sending_busy == 0)&&(--mdm_wait1 == 1)){
//				mdm_sending_busy = 0;
//				SendATCmd(ModemOperateCMDString[13].pSend, strlen(ModemOperateCMDString[13].pSend), 0);
//				mdm_state1 = 6;
//				mdm_wait1 = SWAIT10S;
//				mdm_sending_busy = 1;
				mdm_sending_busy = 0;
				SendATCmd(ModemOperateCMDString[2].pSend, strlen(ModemOperateCMDString[2].pSend), 0);
			    j = UCharToStrCRLF(SmsIndexBuf[SmsBH], &EEBuf[0],1);
			    if(++SmsBH >= 40) SmsBH = 0;
				for(i = 0; i < j; i++)
				{
					atcmd[atpt++] = EEBuf[i];
				}

				mdm_state1 = 6;
				mdm_wait1 = SWAIT10S;
				mdm_sending_busy = 1;
			}
			break;
		case 6:/*读取短信内容*/
			Rev_OK = ReadCMDLine();
			if(Rev_OK)
			{
				if (strncmp(mdmRtnbuf,"OK\r\n",2) == 0)/*收到OK*/
				{
					mdm_sending_busy = 0;
					Rev_OK = 0;
					mdm_state1 = 1;
					mdmRtnbuf_cnt = 0;
					msgA_state = 0;
				}
				else if ((strncmp(mdmRtnbuf,"+CMGR:",6)==0) 
				  || (strncmp(mdmRtnbuf,"+CMGL:",6)==0))
				{//读取到短信
					//mdm_sending_busy = 0;
					GetSMSPick_Proc(1);
					mdmRtnbuf_cnt = 0;
					msgA_state = 4;
					//mdm_state1 = 6;
					//mdm_wait1 = SWAIT1S;
				}
			}
			if(--mdm_wait1 == 0){
				mdm_state1 = 1;
			}
			break;
		case 7://发送:AT+CCED=0
			SendATCmd(ModemOperateCMDString[10].pSend, strlen(ModemOperateCMDString[10].pSend), 0);
			mdm_state1 = 1;
			mdm_sending_busy = 1;
			break;
		case 8:/*删除卡上短信*/
			if((mdm_wait1 == 0)||(mdm_sending_busy == 0)){
				mdm_state1 = 0;
				return INIT_FAIL;//重新初始化MODEM,使短信处于直通方式
			}
			mdm_wait1--;
			break;
		default:
			mdm_state1 = 0;
			
	}
	return ucRtn;
}
/*==========================================================
	此函数的作用是定时检查MODEM是否注册网络,是否接收到网络信号,如果没有
检测到网络信号,则重新开关MODEM电,重新查找网络.
*/
uchar AT_CCED_Proc()
{
	uchar i;
	switch(mdm_state1){
		case 0:/*Initiallize*/
			//next_state1 = 0;
			mdm_state1 = 1;
			break;
		case 1:/*ready to send AT CCED command.*/
			if(mdm_sending_busy == 0)
			{
				next_state1++;
				SendATCmd(ModemOperateCMDString[4].pSend, strlen(ModemOperateCMDString[4].pSend), 0);
				mdm_state1 = 2;
				mdm_wait1 = 0;
				mdm_sending_busy = 1;
			}
			break;		
		case 2:/*wait response*/
			Rev_OK = ReadCMDLine();
			if(Rev_OK){
				if((strncmp(mdmRtnbuf,"+CSQ",4)==0)
				  &&(rtnPtr.lenAck != 0))
				{
					mdm_sending_busy = 0;
					if (NetPara.CommMode == COMM_MODE_CDMA_SMS)/* +CSQ:16, 99 */
						i = ((mdmRtnbuf[5]&0x0f) * 10) + (mdmRtnbuf[6]&0x0f);
					else/*+CSQ: 29,99*/
						i = ((mdmRtnbuf[6]&0x0f) * 10) + (mdmRtnbuf[7]&0x0f);
					if(i <= 31)/* MODEM OK*/
						return INIT_OK;
					else if(next_state1 > 2)
					{
						return INIT_FAIL;
					}
					else{
						mdm_state1 = 1;
					}
				}
				mdmRtnbuf_cnt = 0;
			}
			if(++mdm_wait1 > SWAIT20S){
				if(next_state1 > 2)
					return INIT_FAIL;
				else
					mdm_state1 = 1;

			}
			break;
		default:
			mdm_state1 = 0;
	}
	return 0;
}

uchar ModemDial_Proc()
{
	//uchar i;
	if(NetPara.CommMode != COMM_MODE_PSTN_DATA) return INIT_FAIL;
	switch(mdm_state1){
		case 0:
			mdm_wait1 = 0;
			mdm_state1 = 1;
			break;
		case 1:
			if(++mdm_wait1>SWAIT3S)
			{/*当MODEM开电复位后,要注册网络, 如果还未注册网络前,发拨号命令将会不成功
				因此此处延时等待确保注册完成后拨号.*/
				SetDTR(0, ON);
				SendATCmd(ModemOperateCMDString[5].pSend, 
					strlen(ModemOperateCMDString[5].pSend), 3);
				mdm_wait1 = 0;

⌨️ 快捷键说明

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