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

📄 modem.c

📁 一种MNODEM的控制程序.采用状态机的机制实现.
💻 C
📖 第 1 页 / 共 3 页
字号:
				mdm_state1 = 2;
				//SetLEDWarn(LED_ON, SWAIT1S);
				RunLed_Period = SWAIT1S;
			}
			break;
			
		case 2:
			if(ReadCMDLine()){
/*				if (strncmp(mdmRtnbuf,						
					rtnPtr.pAck,
					rtnPtr.lenAck)==0) {
					mdm_state1 = 3;
					mdm_index++;
					if(mdm_sending_busy) mdm_sending_busy = 0;
				}
				else */if((strncmp(mdmRtnbuf,"ERROR\r\n",7)==0)/*命令错误错误*/
				  || (strncmp(mdmRtnbuf,"NO DIALTONE\r\n",4)==0)//无拨号音
				  || (strncmp(mdmRtnbuf,"BUSY\r\n",4)==0)/*拨号忙*/
				  || (strncmp(mdmRtnbuf,"NO ANSWER\r\n",11)==0)/*无应答*/
				  || (strncmp(mdmRtnbuf,"NO CARRIER\r\n",12)==0))/*无载波*/
				{
					mdm_state1 = 0;
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					return INIT_FAIL;
				}
				else if(strncmp(mdmRtnbuf,"CONNECT",7)==0)
				{/*连接成功*/
					mdm_state1 = 0;
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					return INIT_OK;
				}
				mdmRtnbuf_cnt = 0;
			}
			if(++mdm_wait1 > MAX_CONNECTTIME){
				mdm_state1 = 0;
				//SetLEDWarn(LED_ON, SWAIT1S);
				RunLed_Period = SWAIT1S;
				return INIT_FAIL;
			}
			break;
		default:
			mdm_state1 = 0;
	}
	return 0;
}

uchar GPRSLogin_Proc()
{
	//uchar i;
	switch(mdm_state1){
		case 0:
			if(MDMRvBuf_H == MDMRvBuf_T) {//容错检查
				mdmRtnbuf_cnt = 0;
				mdm_wait1 = 0;
				mdm_state1 = 1;
				ModemLineCount = 0;
			}
			ReadCMDLine();
			break;
		case 1:
			if(++mdm_wait1>SWAIT3S)
			{/*当MODEM开电复位后,要注册网络, 如果还未注册网络前,发拨号命令将会不成功
				因此此处延时等待确保注册完成后拨号.*/
				SetDTR(0, ON);
				mdm_wait1 = 0;
				mdm_state1 = 2;
				//SetLEDWarn(LED_ON, SWAIT1S);
				RunLed_Period = SWAIT1S;
				mdm_index = 0;
			}
			break;
		case 2:
			rtnPtr = GPRSModemDialString[mdm_index];
			if (rtnPtr.lenAck == 255){
				mdm_state1 = 4;
				mdm_wait1 = 0;
			}
			else{
				if((mdm_index>=3)&&(mdm_index<=7))
					SendATCmd(rtnPtr.pSend, strlen(rtnPtr.pSend), 0x80+mdm_index);
				else
					SendATCmd(rtnPtr.pSend, strlen(rtnPtr.pSend), 0);
				mdm_wait1 = 0;
				//SetLEDWarn(LED_ON,0);
				RunLed_Period = 255;
				mdm_state1 = 3;
			}
			break;
		case 3:
			if(ReadCMDLine()){
				//SetLEDWarn(LED_OFF,0);
				RunLed_Period = 1;
				if (strncmp(mdmRtnbuf,
					rtnPtr.pAck,
					rtnPtr.lenAck)==0) {
					mdm_state1 = INIT_MDM_GSM_SEND_ATCMD;
					mdm_index++;
					if(mdm_sending_busy) mdm_sending_busy = 0;
					/*if(++mdm_index>7) return INIT_OK; 初始化正确,完成*/
				}
				else if((strncmp(mdmRtnbuf,"ERROR\r\n",7)==0)
				  &&(rtnPtr.lenAck != 0))
				{/*响应错误*/
					mdm_state1 = INIT_MDM_WAIT_POWEROK;
					//SetLEDWarn(LED_ON,0);
					RunLed_Period = 255;
					return INIT_FAIL;
				}
				else  if(strncmp(mdmRtnbuf,rtnPtr.pSend,strlen(rtnPtr.pSend)-2)==0)//回显开
				{;
				}
				mdmRtnbuf_cnt = 0;
			}
			if(++mdm_wait1 > SWAIT10S){
				mdm_state1 = 0;
				return INIT_FAIL;
			}
			break;
		case 4:
			if(++mdm_wait1 > SWAIT3S){
				mdm_state1 = 0;
				return INIT_OK;/*初始化正确,完成*/
			}
			break;
		default:
			mdm_state1 = 0;
	}
	return 0;
}

uchar ModemAnswer_Proc()
{
//	uchar i;
	//if(NetPara.CommMode != COMM_MODE_PSTN_DATA) return INIT_FAIL;
	switch(mdm_state1){
		case 0:
			SetDTR(0, ON);
			rtnPtr = ModemOperateCMDString[6];
			SendATCmd(rtnPtr.pSend, strlen(rtnPtr.pSend), 1);
			mdm_wait1 = 0;
			mdm_state1 = 1;
			RingCount = 0;
			//SetLEDWarn(LED_ON, SWAIT500MS);
			RunLed_Period = SWAIT500MS;
			break;
		case 1:
			if(ReadCMDLine()){
				if((strncmp(mdmRtnbuf,"ERROR\r\n",7)==0)/*命令错误错误*/
				  || (strncmp(mdmRtnbuf,"BUSY\r\n",4)==0)/*拨号忙*/
				  || (strncmp(mdmRtnbuf,"NO ANSWER\r\n",11)==0)/*无应答*/
				  || (strncmp(mdmRtnbuf,"NO CARRIER\r\n",12)==0))/*无载波*/
				{
					mdm_state1 = 0;
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					return INIT_FAIL;
				}
				else if(strncmp(mdmRtnbuf,"CONNECT",7)==0)
				{/*连接成功*/
					mdm_state1 = 0;
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					return INIT_OK;
				}
				mdmRtnbuf_cnt = 0;
			}
			if(++mdm_wait1 > MAX_CONNECTTIME){
				mdm_state1 = 0;
				//SetLEDWarn(LED_ON, SWAIT1S);
				RunLed_Period = SWAIT1S;
				return INIT_FAIL;
			}
			break;
		default:
			mdm_state1 = 0;
	}
	return 0;
}

uchar ath_p()
{
//	uchar i;
	if(NetPara.CommMode != COMM_MODE_PSTN_DATA) return INIT_FAIL;
	switch(mdm_state1){
		case 0:
			SetDTR(0, OFF);
			SendATCmd(ModemOperateCMDString[7].pSend, 
				strlen(ModemOperateCMDString[7].pSend), 1);
			mdm_wait1 = 0;
			mdm_state1 = 1;
			//SetLEDWarn(LED_ON, SWAIT100MS);
			RunLed_Period = SWAIT100MS;
			break;
		case 1:
			if(++mdm_wait1>SWAIT200MS){//delay 500ms 
				SetDTR(0, ON);
				SendATCmd(ModemOperateCMDString[8].pSend, 
					strlen(ModemOperateCMDString[8].pSend), 1);
				mdm_wait1 = 0;
				mdm_state1 = 2;
				//SetLEDWarn(LED_ON, SWAIT100MS);
				RunLed_Period = SWAIT100MS;
			}
			break;
		case 2:
			if(ReadCMDLine()){
				if (strncmp(mdmRtnbuf,"OK\r\n",4)==0) {
					mdm_state1 = 2;
					mdm_index++;
					if(mdm_sending_busy) mdm_sending_busy = 0;
					//SetLEDWarn(LED_ON, SWAIT100MS);
					RunLed_Period = SWAIT100MS;
					return INIT_OK;
				}
				else if((strncmp(mdmRtnbuf,"ERROR\r\n",7)==0)
				  &&(rtnPtr.lenAck != 0))
				{/*命令错误错误*/
					mdm_state1 = 0;
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					return INIT_FAIL;
				}
				else if((strncmp(mdmRtnbuf,"BUSY\r\n",4)==0)
				  &&(rtnPtr.lenAck != 0))
				{/*拨号忙*/
					mdm_state1 = 0;
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					return INIT_FAIL;
				}
				else if((strncmp(mdmRtnbuf,"NO ANSWER\r\n",11)==0)
				  &&(rtnPtr.lenAck != 0))
				{/*无应答*/
					mdm_state1 = 0;
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					return INIT_FAIL;
				}
				else if((strncmp(mdmRtnbuf,"NO CARRIER\r\n",12)==0)
				  &&(rtnPtr.lenAck != 0))
				{/*无载波*/
					mdm_state1 = 0;
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					return INIT_FAIL;
				}
				mdmRtnbuf_cnt = 0;
			}
			if(++mdm_wait1 > SWAIT3S){/*超时退出*/
				mdm_state1 = 0;
				//SetLEDWarn(LED_ON, SWAIT1S);
				RunLed_Period = SWAIT1S;
				return INIT_FAIL;
			}
			break;
		default:
			mdm_state1 = 0;
	}
	return 0;
}

uchar SearchMDMBuffer_Proc(uchar *str)
{
	uchar i,j;
	uint l;
	j = strlen(str);
	if(mdmRtnbuf_cnt < j) return 0;
	//查找字符串
	l = 0;
	i = 0;
	while(l<mdmRtnbuf_cnt)
	{
		if(str[i] == mdmRtnbuf[l]) i++;
		else i = 0;
		l++;
		if(i >= j) return 1;
	}	
	return 0;
}

void Modem_Control()
{
	uchar rtn;

	switch(mdm_state){
		case MAIN_MDM_RESET:
			//SetLEDWarn(LED_ON, 0);
			RunLed_Period = 255;
			Reset_Modem(0);
			PrintToUartB("Init MODEM, Reset ON!",21);
			if ((NetPara.CommMode == COMM_MODE_UART)
			  ||((NetPara.EquipNo > 0)&&(NetPara.EquipNo < 0xff)))//从机时也当作串口直接连接
			{
				mdm_state = MAIN_MDM_UART_COMM;
				//SetLEDWarn(LED_OFF, 0);
				RunLed_Period = 1;
			}
			else{
				mdm_state = MAIN_MDM_RESET1;
			}
			mdm_wait = 0;
			mdm_wait1 = 0;
			mdm_state1 = 0;
			
	        ModemLineCount = 0;//2006-8-11增加,解决网管提取到上次包的问题。
		    MDMRvBuf_H = MDMRvBuf_T = 0;
			break;
		case MAIN_MDM_RESET1:
			RunLed_Period = 5;//MODEm初始化,指示灯快闪
			if(++mdm_wait>50){
				//SetLEDWarn(LED_ON, 0);
				RunLed_Period = 255;
				Reset_Modem(1);
				mdm_index = 0;
				//S_CommandA(0x28, 0, 1); //定时上报,
				PrintToUartB("Init MODEM, Reset Off!",22);
				mdm_state = MAIN_MDM_INIT;
				mdm_state1 = 0;
			}
			break;
		case MAIN_MDM_INIT:
			RunLed_Period = 5;//MODEm初始化,指示灯快闪
			rtn = Init_Modem_Proc();
			if (rtn == INIT_OK){
				
				//SetLEDWarn(LED_OFF, 0);
				RunLed_Period = 1;
				mdm_state1 = 0;
				PrintToUartB("Init MODEM, Success!",20);
				if(EqInfo.WorkMode == WORKMODE_UPGRADE){
					mdm_state1 = 0;
					mdm_state = MAIN_MDM_GPRS_DIAL;
				}
				else{
					if (NetPara.CommMode == COMM_MODE_PSTN_DATA)
					{/*数传模式*/
						mdm_state = MAIN_MDM_WAIT;
					}
					else
					{
						mdm_state = MAIN_MDM_SMS;
					}
				}
				RunLed_Period = 12;
			}
			else if (rtn == INIT_FAIL){
				mdm_state = MAIN_MDM_RESET;
			}
			break;
			
		case MAIN_MDM_SMS:
			switch(Wait_SMS_Proc()) {
				case 1://ring in
					//SetLEDWarn(LED_ON, SWAIT500MS);
					RunLed_Period = SWAIT500MS;
					if(++RingCount>=MAX_RINGIN){
						mdm_state1 = 0;
						mdm_state = MAIN_MDM_ANSWER;
						PrintToUartB("Ring In, Modem Answer!",22);
					}
					break;
				case 2:
					break;
				case 3:
					mdm_state = MAIN_MDM_RESET;
					break;
			}
			if(EqInfo.WorkMode == WORKMODE_UPGRADE){
				mdm_state = MAIN_MDM_GPRS_DIAL;
			}
			/*if (NetPara.CommMode == COMM_MODE_UART)
				mdm_state = MAIN_MDM_RESET;*/
/*			if(mdm_ATCCED_timer > MAX_SEND_CCED_TIME){//15分钟 检测modem是否在线
				mdm_ATCCED_timer = 0;
				mdm_state = MAIN_MDM_SEND_ATCCED;
				mdm_state1 = 0;
			}*/
			/*else				mdm_state = MAIN_MDM_RESET;*/
			break;

		case MAIN_MDM_WAIT:
			if(ReadCMDLine()){
				if((strncmp(mdmRtnbuf,"RING\r\n",6)==0))
				{/*振铃转应答*/
					//SetLEDWarn(LED_ON, SWAIT500MS);
					RunLed_Period = SWAIT500MS;
					if(++RingCount>=MAX_RINGIN)
						mdm_state = MAIN_MDM_ANSWER;
				}
				else if(strncmp(mdmRtnbuf,"+CLIP:",6)==0)/*获取来电号*/
				{
					GetSMSPick_Proc(2);
					//SetLEDWarn(LED_ON, SWAIT100MS);
					RunLed_Period = SWAIT100MS;
				}
				else if(strncmp(mdmRtnbuf,"CONNECT",7)==0)
				{/*自动应答连接成功*/
					mdm_state = MAIN_MDM_CONNECT;
					mdm_state1 = MAIN_MDM_ANSWER;
					mdm_wait = 0;
				}
				mdmRtnbuf_cnt = 0;
			}
			if((NetPara.CommMode == COMM_MODE_PSTN_DATA)
			  &&(MDMSendBuf_H!=MDMSendBuf_T))
			{//如果有数据要发送则 拨号
				mdm_state = MAIN_MDM_DIAL;
			}
			if(EqInfo.WorkMode == WORKMODE_UPGRADE){
				mdm_state = MAIN_MDM_GPRS_DIAL;
			}
			break;			
		case MAIN_MDM_DIAL:
			RunLed_Period = 5;//MODEm通信,指示灯快闪
			rtn = ModemDial_Proc();
			if (rtn == INIT_OK){
				mdm_state = MAIN_MDM_CONNECT;
				mdm_state1 = MAIN_MDM_DIAL;
				mdm_wait = 0;

			}
			else if (rtn == INIT_FAIL){
				mdm_state = MAIN_MDM_ONHOOK;//MAIN_MDM_RESET;
			}
			break;
		case MAIN_MDM_GPRS_DIAL:
			RunLed_Period = 5;//MODEm通信,指示灯快闪
			rtn = GPRSLogin_Proc();
			if (rtn == INIT_OK){
				mdm_state = MAIN_MDM_CONNECT;
				mdm_state1 = MAIN_MDM_GPRS_DIAL;
				mdm_wait = 0;

			}
			else if (rtn == INIT_FAIL){
				mdm_state = MAIN_MDM_ONHOOK;//MAIN_MDM_RESET;
			}
			break;
		case MAIN_MDM_ANSWER:
			RunLed_Period = 5;//MODEm通信,指示灯快闪
			rtn = ModemAnswer_Proc();
			if (rtn == INIT_OK){
				mdm_state = MAIN_MDM_CONNECT;
				mdm_state1 = MAIN_MDM_ANSWER;
				PrintToUartB("MODEM Connecting!",17);
				mdm_wait = 0;
			}
			else if (rtn == INIT_FAIL){
				mdm_state = MAIN_MDM_ONHOOK;//MAIN_MDM_RESET;
			}
			break;
		case MAIN_MDM_UART_COMM:
			Rev_OK = ReadRS232();//GetMDMCMD();
			if((NetPara.EquipNo == 0)||(NetPara.EquipNo == 0xff)){
			    if (NetPara.CommMode != COMM_MODE_UART)
				    mdm_state = MAIN_MDM_RESET;
			}
			break;
		case MAIN_MDM_CONNECT:
			RunLed_Period = 5;//MODEm通信,指示灯快闪
			Rev_OK = ReadRS232();//GetMDMCMD();
			
			if((CheckCarrierStatus(0) == 0)&&(mdm_wait > SWAIT5S)){
				RunLed_Period = SWAIT1S;
				mdm_state = MAIN_MDM_ONHOOK;
			    PrintToUartB("Hi,CARRIER LOST!",16);
			}
			if(Rev_OK)//GetMDMCMD();
			{//20050804, 数传收到结束命令的处理
				if(SearchMDMBuffer_Proc("NO CARRIER\r\n") > 0)
				{
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					mdm_state = MAIN_MDM_ONHOOK;
					Rev_OK = 0;
					PrintToUartB("String:NO CARRIER!",18);
				}
				else if(SearchMDMBuffer_Proc("BUSY\r\n") > 0)
				{
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					mdm_state = MAIN_MDM_ONHOOK;
					Rev_OK = 0;
				}
				else if(SearchMDMBuffer_Proc("ERROR\r\n") > 0)
				{
					//SetLEDWarn(LED_ON, SWAIT1S);
					RunLed_Period = SWAIT1S;
					mdm_state = MAIN_MDM_ONHOOK;
					Rev_OK = 0;
					
				}
				else Rev_OK = 1;
			}
			mdm_wait++;
			if(mdm_state1 == MAIN_MDM_DIAL) 
			{//有条件挂断
    			if(((MDMSendBuf_H==MDMSendBuf_T) && (AlmSmsBufIsBlank() > 0)&&(mdm_wait > SWAIT5S))
    			  || (mdm_wait > SWAIT50S)){
    				mdm_state = MAIN_MDM_ONHOOK;
    				//SetLEDWarn(LED_ON, SWAIT500MS);
    				RunLed_Period = SWAIT500MS;
    			}
			}
			else if(mdm_wait > MAX_HOOKONTIME)
			{//超时退出
				mdm_state = MAIN_MDM_ONHOOK;
			}
			break;
		case MAIN_MDM_ONHOOK:
			RunLed_Period = 12;//MODEm通信,指示灯快闪
			rtn = ath_p();
			if (rtn == INIT_OK){
				mdm_state = MAIN_MDM_RESET;//MAIN_MDM_INIT;
				mdm_state1 = 0;
				mdm_wait = 0;
				mdm_state1 = 0;
			}
			else if (rtn == INIT_FAIL){
				mdm_state = MAIN_MDM_RESET;

			}
			break;
		case MAIN_MDM_SEND_ATCCED:
/*			rtn = AT_CCED_Proc();
			if (rtn == INIT_OK){
				mdm_state = MAIN_MDM_SMS;*/
				mdm_state1 = 0;
/*			}
			else if (rtn == INIT_FAIL){
				mdm_state = MAIN_MDM_RESET;
			}*/
			break;
		default:
			mdm_state = MAIN_MDM_RESET;
			mdm_state1 = 0;
			break;
	}

	if(Rev_OK) {
		Rev_OK = 0;
		//SetLEDWarn(LED_ON, SWAIT1S);
		RunLed_Period = SWAIT1S;
 		ModemMsg_Proc(0,mdmRtnbuf,mdmRtnbuf_cnt);
 		mdmRtnbuf_cnt = 0;
	}
/*    if (last_cmd_wait){
    	if(--last_cmd_wait==0) {
    		last_cmd = 0;
    	}
    }*/
}

⌨️ 快捷键说明

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