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

📄 main.c

📁 武汉创维特的arm培训例程试验程序
💻 C
📖 第 1 页 / 共 2 页
字号:
				gprs_tel_call_out_status = GPRS_TEL_CALL_OUT_CALLING;
				strcpy(gprs_cmd_send_string, "ATD");
				strcat(gprs_cmd_send_string, strcallnum);
				strcat(gprs_cmd_send_string, ";\r");
				gprs_send_cmd(gprs_cmd_send_string);
				break;
		}
		
		gprs_recv_cmd(gprs_cmd_recv_string);
		gprs_recv_msg_code = gprs_analyze_msg(gprs_cmd_recv_string);
		if(gprs_tel_call_out_status == GPRS_TEL_CALL_OUT_CALLING)
		{
			switch(gprs_recv_msg_code)
			{
				// 接听
				case AT_RECV_MSG_OK:
					TRACE("开始通话\n");
					strcpy(gprs_cmd_send_string, "AT+PPSPKR=0\r");
					Delay(200);
					gprs_send_cmd(gprs_cmd_send_string);
					Delay(200);
					gprs_send_cmd(gprs_cmd_send_string);
					gprs_tel_call_out_status = GPRS_TEL_CALL_OUT_PHONE_ON;
				break;				
				// 对方挂机
				case AT_RECV_MSG_NO_CARRIER:
				// 错误
				case AT_RECV_MSG_ERROR:
					gprs_tel_call_out_status = GPRS_TEL_CALL_OUT_IDLE;
				break;
			}
		}
	}
	
	TRACE("退出呼出功能\n");
}
/********************************************************************
// Function name	: TestTel
// Description	    : 电话功能
// Return type		: void
// Argument         : 
*********************************************************************/
void TestTel()
{
	enum GPRS_TEL_STATUS
	{
		GPRS_TEL_INIT,     // 正在初始化
		GPRS_TEL_IDLE,     // 初始化完毕,等待输入
		GPRS_TEL_CALL_IN,  // 呼入 
		GPRS_TEL_CALL_OUT, // 呼出
		GPRS_TEL_OUT       // 退出
	};
	
	char gprs_cmd_send_string[512];
	char gprs_cmd_recv_string[512];
	char ch;
	int  loopcnt;
	int  gprs_tel_status;
	int  bexit = 0;

	// 打印提示信息	
	TRACE("电话功能!\n");
	TRACE("网络连接中,请等待...\n");
	
	// 系统初始化
	gprs_tel_status = GPRS_TEL_INIT;
	gprs_init();	
////////////////////////////////////////////////////////////////
// GPRS复位	
{
	int loopcnt;
__RESET:
	// 延时一定时间
	Delay(150);
	
	// 发送AT命令
	gprs_send_cmd("\r");
	gprs_send_cmd("AT\r");
	for(loopcnt = 0; loopcnt < 30; loopcnt++)
	{
		// 获取结果,如果读取到OK,认为复位成功,否则重新复位
		gprs_recv_cmd(gprs_cmd_recv_string);
		if(strstr(gprs_cmd_recv_string, "OK") != 0)
			break;
		Delay(10);
	}
	if(loopcnt == 30)
	{
		Delay(300);
		gprs_pwr_on_off(GPRS_PWR_ON);
		goto __RESET;
	}
}
///////////////////////////////////////////////////////////////

	Delay(1500);
	gprs_send_cmd("\r");	
	gprs_send_cmd("ATE0\r");
	
	// 进入空闲状态,开启状态机
	gprs_tel_status = GPRS_TEL_IDLE;		
	// 显示主界面	
	TRACE("1 - 拨号 Cancel退出\n");
	while(bexit == 0)
	{
		int   key;
		switch(gprs_tel_status)
		{
			// 空闲状态,等待输入
			case GPRS_TEL_IDLE:
				key = gprs_get_key();
				if(key != 0)
				{
					switch(key)
					{
						case '1':
							gprs_tel_status = GPRS_TEL_CALL_OUT;
							break;
						case '2':
							gprs_tel_status = GPRS_TEL_CALL_IN;
							break;
						case 'E':
							gprs_tel_status = GPRS_TEL_OUT;
							bexit = 1;
							break;
					}
				}
				
				// 接收输入
				gprs_recv_cmd(gprs_cmd_recv_string);
				if(gprs_analyze_msg(gprs_cmd_recv_string) == AT_RECV_MSG_RING)
				{
					// 电话呼入
					gprs_tel_status = GPRS_TEL_CALL_IN;
				}
			break;
			// 电话呼入
			case GPRS_TEL_CALL_IN:
				// 显示电话呼入菜单
				TRACE("电话呼入,Enter键接听\n");
				gprs_tel_call_in();
				gprs_tel_status = GPRS_TEL_IDLE;
			break;
			// 电话呼出
			case GPRS_TEL_CALL_OUT:
				// 显示电话呼出菜单
				TRACE("呼叫电话,请拨号\n");
				gprs_tel_call_out();
				TRACE("1 - 拨号 Cancel退出\n");
				gprs_tel_status = GPRS_TEL_IDLE;
			break;
		}
	}	

	// 结束
	TRACE("退出电话功能\n");		
	gprs_uninit();
}
/********************************************************************
// Function name	: TestSMS
// Description	    : 短信功能测试
// Return type		: void
// Argument         : 
*********************************************************************/
void TestSMS()
{
	enum GPRS_SMS_STATUS
	{
		GPRS_SMS_INIT,     // 正在初始化
		GPRS_SMS_IDLE,     // 初始化完毕,等待输入
		GPRS_SMS_GET_NUM,  // 输入号码 
		GPRS_SMS_SEND,     // 呼出
	};
	
	char strcallnum[20];
	char gprs_cmd_send_string[512];
	char gprs_cmd_recv_string[512];
	char strtemp[10];
	int  gprs_recv_msg_code;
	char ch;
	int  loopcnt;
	int  gprs_sms_status;
	int  bexit = 0;
	strcallnum[0] = 0;
    
    // 打印提示信息	
	TRACE("短信功能!\n");
	TRACE("网络连接中,请等待...\n");
	
	// 系统初始化
	gprs_sms_status = GPRS_SMS_INIT;
	gprs_init();	

////////////////////////////////////////////////////////////////
// GPRS复位	
{
	int loopcnt;
__RESET:
	// 延时一定时间
	Delay(150);
	
	// 发送AT命令
	gprs_send_cmd("\r");
	gprs_send_cmd("AT\r");
	
	for(loopcnt = 0; loopcnt < 30; loopcnt++)
	{
		// 获取结果,如果读取到OK,认为复位成功,否则重新复位
		gprs_recv_cmd(gprs_cmd_recv_string);
		if(strstr(gprs_cmd_recv_string, "OK") != 0)
			break;
		Delay(10);
	}
	if(loopcnt == 30)
	{
		Delay(300);
		gprs_pwr_on_off(GPRS_PWR_ON);
		goto __RESET;
	}
}
///////////////////////////////////////////////////////////////

	Delay(1500);
	gprs_send_cmd("\r");	
	gprs_send_cmd("ATE0\r");
	
	// switch to pdu mode
	strcpy(gprs_cmd_send_string, "AT+CMGF=0\r");
	gprs_send_cmd(gprs_cmd_send_string);

	strcpy(gprs_cmd_send_string, "AT+CNMI=2,1\r");
	gprs_send_cmd(gprs_cmd_send_string);
	
	// 进入空闲状态,开启状态机
	gprs_sms_status = GPRS_SMS_IDLE;
	// 显示主界面	
	TRACE("输入号码,ENTER键发送,Cancel退出\n");
	
	while(bexit == 0)
	{
		int   key;
		int   length;
		key = gprs_get_key();
		switch(key)
		{
			case '1':
			case '2':
			case '3':
			case '4':
			case '5':
			case '6':
			case '7':
			case '8':
			case '9':
			case '0':
				if(gprs_sms_status == GPRS_SMS_IDLE || \
				   gprs_sms_status == GPRS_SMS_GET_NUM)
				{
					gprs_sms_status = GPRS_SMS_GET_NUM;
					sprintf(strtemp, "%c", key);
					TRACE(strtemp);
					strcat(strcallnum, strtemp);
				}
				break;
			case 'E':
				// 退出
				gprs_sms_status = GPRS_SMS_IDLE;
				bexit = 1;
				break;
			case 'F':
			case 0x0d:
			case 0x0a:
				TRACE("发送短消息\n");
				gprs_sms_status = GPRS_SMS_SEND;
				// 设置服务中心号码
				strcpy(gprs_cmd_send_string, "AT+CSCA=\"+8613800270500\"\r");
				gprs_send_cmd(gprs_cmd_send_string);
				loopcnt = 0;
				do
				{
					gprs_recv_cmd(gprs_cmd_recv_string);
					gprs_recv_msg_code = gprs_analyze_msg(gprs_cmd_recv_string);
					
					loopcnt ++;
					if(loopcnt >= 20)
					{
						break;
					}
				}while(gprs_recv_msg_code != AT_RECV_MSG_OK && gprs_recv_msg_code != AT_RECV_MSG_ERROR);
				
				if(gprs_recv_msg_code == AT_RECV_MSG_ERROR)
				{
					TRACE("服务中心号码设置错误\n");
					bexit = 1;
					break;
				}else
				{
					// 发送短信
					SM_PARAM Src;
				
					strcpy(Src.SCA, "8613800270500");			// 短消息服务中心号码(SMSC地址)
					strcpy(Src.TPA, "86");
					strcat(Src.TPA, strcallnum);			// 目标号码或回复号码(TP-DA或TP-RA)
					strcallnum[0] = 0;
					Src.TP_PID = 0;			// 用户信息协议标识(TP-PID)
					Src.TP_DCS = 8;			// 用户信息编码方式(TP-DCS)
					strcpy(Src.TP_SCTS, "04060308421002");		// 服务时间戳字符串(TP_SCTS), 接收时用到
					strcpy(Src.TP_UD, "武汉创维特信息技术有限公司欢迎您\r\nwww.cvtech.com.cn");		// 原始用户信息(编码前或解码后的TP-UD)
					
					TRACE("开始发送\n");
					
					gprsSendMessage(&Src);
					
					TRACE("发送完毕\n");
					TRACE("输入号码,ENTER键发送,Cancel退出\n");
					gprs_sms_status = GPRS_SMS_IDLE;
				}
				break;
		}
		
		gprs_recv_cmd(gprs_cmd_recv_string);
		gprs_recv_msg_code = gprs_analyze_msg(gprs_cmd_recv_string);
		if(gprs_recv_msg_code == AT_RECV_MSG_CMTI)
		{
			char *pDest;
			
			// 收到短消息
			TRACE("收到短消息\n");
			
			// 解析短消息
			pDest = strstr(gprs_cmd_recv_string, ",");
			if(pDest != 0)
			{
				SM_PARAM Msg;
				
				pDest++;
				// 阅读短消息
				TRACE("阅读短消息\n");
				
				// Read Message
				sprintf(gprs_cmd_send_string, "AT+CMGR=%d\r", atoi(pDest));
				gprs_send_cmd(gprs_cmd_send_string);
				// receive message
				do
				{
					gprs_recv_cmd(gprs_cmd_recv_string);
					gprs_recv_msg_code = gprs_analyze_msg(gprs_cmd_recv_string);
					if(gprs_recv_msg_code == AT_RECV_MSG_CMGR)
					{
						SM_PARAM Msg;
						
						gprs_recv_cmd(gprs_cmd_recv_string);
						gprs_recv_cmd(gprs_cmd_recv_string);
						gprsDecodePdu(gprs_cmd_recv_string, &Msg);
						
						gprs_print_msg(&Msg);
						break;
					}
				}while(1);
			}
		}
	}
	TRACE("退出\n");
}
/********************************************************************
// Function name	: gprs_print_msg
// Description	    : 打印短消息
// Return type		: void
// Argument         : SM_PARAM* pMsg
*********************************************************************/
void gprs_print_msg(SM_PARAM* pMsg)
{
	char tmp[100];
	
	TRACE("\n服务中心:");
	TRACE(pMsg->SCA);
	TRACE("\n来自:");
	TRACE(pMsg->TPA);
	TRACE("\n时间:");
	sprintf(tmp, "20%c%c年%c%c月%c%c日%c%c时%c%c分%c%c秒", pMsg->TP_SCTS[0], pMsg->TP_SCTS[1], \
	                               pMsg->TP_SCTS[2], pMsg->TP_SCTS[3], \
	                               pMsg->TP_SCTS[4], pMsg->TP_SCTS[5], \
	                               pMsg->TP_SCTS[6], pMsg->TP_SCTS[7], \
	                               pMsg->TP_SCTS[8], pMsg->TP_SCTS[9], \
	                               pMsg->TP_SCTS[10], pMsg->TP_SCTS[11]);
	TRACE(tmp);
	TRACE("\n内容:");
	TRACE(pMsg->TP_UD);
	TRACE("\n");
}
/********************************************************************
// Function name	: Main
// Description	    : 主函数
// Return type		: void
// Argument         : void
*********************************************************************/
void Main(void)
{
	/* 配置系统时钟 */
    ChangeClockDivider(1,1);          // 1:2:4    
    ChangeMPllValue(0xa1,0x3,0x1);    // FCLK=202.8MHz  
	
	/* 中断初始化 */
    Isr_Init();
    /* 初始化端口 */
    Port_Init();
    
    /* 初始化串口 */
    Uart_Init(0,115200);
    Uart_Select(0);
    
#if 0
    TestTel();
#else
	TestSMS();
#endif
	
	while(1)
	{
	}
}

⌨️ 快捷键说明

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