1、短信功能! 网络连接中,请等待... Send -> Send -> AT Send -> Send -> AT Recv <- AT Recv <- OK Send -> AT+CMGF=0 Send -> AT+CNMI=1,2 输入号码,ENTER键发送,Cancel退出
2、 15950534830发送短消息 Send -> AT+CSCA="+8613800250500" 开始发送 Send -> AT+CMGS=57 Recv <- AT+CSCA="+8613800250500" Send -> 0891683108200505F011000D91685159504338F00008002A6B
3、228FCE4F7F752857FA4E8E 77ED6D88606F76846B658FDB7535673A768463A752367CFB7EDF000D000A Send -> Recv <- OK 发送成功 发送完毕 阅读短消息 服务中心:8613800250500 来自:8615950534830 时间:2009年12月09日10时10分08秒 内容:
4、杨甜 开始发送 Send -> AT+CMGS=27 Recv <- AT+CMGS=27 Send -> 0891683108200505F011000D91685159504338F00008000C6536523077ED4FE1000D000A Send -> Recv <- > 0891683108200505F011000D91685159504338F00008000C6536523077ED4FE1000D00 0A 发送完毕 代码打印: /*************************************************
5、/ /* */ /* FILE NAME VERSION */ /* */ /* GPRS.C
6、 1.0 */ /* */ /* DESCRIPTION */ /* */ /* JX4
7、4B0(S3C44B0X)GPRS通讯实验 */ /* */ /* */ /* DATA STRUCTURES
8、 */ /* */ /* FUNCTIONS : */ /* 在JX44B0教学实验箱进行GPRS通讯实验 */ /*
9、 */ /* DEPENDENCIES */ /* JX44B0-2 */ /* JX44B0-3 */ /*
10、 */ /* */ /* NAME: */ /* REMARKS: */ /*
11、 */ /* Copyright (C) 2003 Wuhan CVTECH CO.,LTD */ /****************************************************************************/ /****************************************************************************/ /* 学习JX44B0中电话呼叫功能和中英文短信功能
12、的实现方法: */ /* 注意: */ /* 1. 该实验仅仅适用与JX44B0-2以及JX44B0-3实验箱 */ /* 2. 实验之前请阅读用户手册,并进行正确的硬件连接 */ /* 3. 实验过程需要SIM卡,SIM可以使用中国移动和中国联通的各种手机卡 */ /* 4. SIM卡
13、请不要带电插拔,否则容易导致烧卡 */ /* 5. 短信实验中需要修改短信中心号码,请参照您的手机中的设置设置该值, */ /* 注意去掉前面的'+'号 */ /****************************************************************************/ /* 包含文件 */ #include "2410addr.h" #include "2410
14、lib.h" #include "gprs.h" /* 按键缓冲区 */ char gprs_key_recv_buf[GPRS_RECV_CMD_MAX_BUF]; int gprs_key_recv_read = 0; int gprs_key_recv_write = 0; /******************************************************************** // Function name : TRACE // Description : 在串口0上打印调试信息 // Return type
15、 void // Argument : char *string *********************************************************************/ void TRACE(char *string) { // disable int // gprs_disable_int(); Uart_Select(0); Uart_Printf(string); // enable int // gprs_enable_int(); } /********************
16、 // Function name : TestSMS // Description : 短信功能测试 // Return type : void // Argument : *********************************************************************/ void TestSMS() { int delaytime=0; int RecvError=0; enum GPRS_SMS_S
17、TATUS { 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
18、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 loopc
19、nt; __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,1); if(strstr(gprs_cmd_recv_string, "OK") != 0) break; Delay(10);
20、 } 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+
21、CMGF=0\r"); gprs_send_cmd(gprs_cmd_send_string); Delay(600); //strcpy(gprs_cmd_send_string, "AT+CNMI=2,1\r"); strcpy(gprs_cmd_send_string, "AT+CNMI=1,2\r"); gprs_send_cmd(gprs_cmd_send_string); Delay(600); // 进入空闲状态,开启状态机 gprs_sms_status = GPRS_SMS_IDLE; // 显示主界面 TRA
22、CE("输入号码,ENTER键发送,Cancel退出\n"); while(bexit == 0) { int key; int length; key = Key_GetKeyPoll(); 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
23、 == 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; bexi
24、t = 1; break; case 'F': //case 0x0d: //case 0x0a: TRACE("发送短消息\n"); gprs_sms_status = GPRS_SMS_SEND; // 设置服务中心号码 strcpy(gprs_cmd_send_string, "AT+CSCA=\"+8613800250500\"\r"); gprs_send_cmd(gprs_cmd_send_string); loopcnt = 0; do { gprs_re
25、cv_cmd(gprs_cmd_recv_string,1); 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_
26、code == AT_RECV_MSG_ERROR) { TRACE("服务中心号码设置错误\n"); bexit = 1; break; }else { // 发送短信 SM_PARAM Src; strcpy(Src.SCA, "8613800250500"); // 短消息服务中心号码(SMSC地址) strcpy(Src.TPA, "86"); strcat(Src.TPA, strcallnum); // 目标号码或回复号码(TP-DA或T
27、P-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\n"); // 原始用户信息(编码前或解码后的TP-UD) TRACE("开始发送\n");
28、 gprsSendMessage(&Src); TRACE("发送完毕\n"); TRACE("输入号码,ENTER键发送,Cancel退出\n"); gprs_sms_status = GPRS_SMS_IDLE; } break; } gprs_recv_cmd(gprs_cmd_recv_string,0); gprs_recv_msg_code = gprs_analyze_msg(gprs_cmd_recv_string); if((gprs_recv
29、msg_code == AT_RECV_MSG_CMTI)||(gprs_recv_msg_code == AT_RECV_MSG_CMT)) { char *pDest; pDest = strstr(gprs_cmd_recv_string, ","); if(pDest != 0) { SM_PARAM Msg; pDest++; // Read Message //sprintf(gprs_cmd_send_string, "AT+CMGR=%d\r", atoi(pDest)
30、); //gprs_send_cmd(gprs_cmd_send_string); // receive message delaytime = 0; do { RecvError = gprs_recv_cmd(gprs_cmd_recv_string,0); Delay(10); delaytime ++; if((delaytime == 30) && (RecvError == GPRS_ERR)) { SM_PARAM
31、Msg; gprsDecodePdu(gprs_cmd_recv_string, &Msg); // 阅读短消息 TRACE("阅读短消息\n"); gprs_print_msg(&Msg); // 发送短信 SM_PARAM Src; strcpy(Src.SCA, "8613800250500"); // 短消息服务中心号码(SMSC地址) strcpy(Src.TPA, "86");
32、 strcat(Src.TPA, "15950534830"); // 目标号码或回复号码(TP-DA或TP-RA) Src.TP_PID = 0; // 用户信息协议标识(TP-PID) Src.TP_DCS = 8; // 用户信息编码方式(TP-DCS) strcpy(Src.TP_SCTS, "04060308421002"); // 服务时间戳字符串(TP_SCTS), 接收时用到 strcpy(Src.TP_UD, "收到短信\r\n"); // 原始用户信息(编码前或解码
33、后的TP-UD) TRACE("开始发送\n"); gprsSendMessage(&Src); TRACE("发送完毕\n"); break; } }while(1); }//end if }//end if end switch }//end while TRACE("退出\n"); } /**********************************************************
34、 // 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
35、>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], \
36、 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"); } /*****************
37、 // 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) { } }






