Do_Reset.C
上传用户:zanguozi01
上传日期:2014-02-19
资源大小:155k
文件大小:27k
源码类别:

GPS编程

开发平台:

Others

  1. /********************************************************
  2. * 文件名:  Do_Reset.h
  3. * 创建时间:2004年10月20日
  4. * 创建人:  
  5. * 版本号:  1.00
  6. * 功能:
  7. *
  8. * 修改历史:(每条详述)
  9. ********************************************************/
  10. #include <msp430x14x.h>
  11. #include "General.h"
  12. #include "Other_Define.h"
  13. #include "Main_Init.h"
  14. #include "Do_Reset.h"
  15. #include "M22_AT.h"
  16. #include "Check_GSM.h"
  17. #include "Sub_C.h"
  18. #include "Define_Bit.h"
  19. #include "Uart01.h"
  20. #include "SPI45DB041.h"
  21. #include "D_Buffer.h"
  22. #include "W_Protocol.h"
  23. #include "Do_SRAM.h"
  24. /*
  25. #include "Disp_Protocol.h"
  26. */
  27. //#define Debug_GSM_COM1
  28. void Wait_Return_M22(unsigned char Next_Step);
  29. /********************************************************
  30. * 函数名:Do_OFF_Power
  31. 作用域:外部文件调用
  32. * 功能:  进行GPS和GSM模块掉电重启的操作。
  33. * 参数:
  34. * 返回值:需要对一些相关的全局变量进行附值
  35. * 创建人:
  36. *
  37. * 修改历史:(每条详述)
  38. ********************************************************/
  39. void Do_OFF_Power(void)
  40. {
  41. //设置高电平,以关断2576输出
  42. Clear_Exter_WatchDog();
  43. gM22_GSM_ECHO_Timer=0;
  44. gGet_Driver_Info_Count=0;
  45. gRecord_Data_Timer=0;
  46. if(gOFF_Power_S==1)
  47. {
  48. P6OUT|=POWER_ON_OFF;
  49.     gTimer=0;
  50.     gOFF_Power_S=2;
  51. }
  52. //延长OFF_TIME时间后,则重新设置低电平,开启2576输出
  53. else if((gOFF_Power_S==2)&&(gTimer>OFF_TIME))
  54. {
  55. P6OUT&=~POWER_ON_OFF;
  56.     gOFF_Power_S=3;
  57.     gTimer=0;
  58. }
  59. else if((gOFF_Power_S==3)&&(gTimer>DELAY_TIME))
  60. {
  61.     gTimer=0;
  62.     gOFF_Power_S=0;
  63.     if(gGeneral_Flag&OFF_M22_F_1)
  64.     {
  65. Send_COM1_Byte('M');
  66.     }
  67.     else if(gGeneral_Flag&OFF_GPS_F_1)
  68.     {
  69. Send_COM1_Byte('G');
  70.     }
  71.     Send_COM1_String((unsigned char *)POWER_OFF,sizeof(POWER_OFF));
  72.     Reset_Variable();
  73.     gGeneral_Flag&=~OFF_M22_F_1; //取消掉电M22的标志位
  74.     gGeneral_Flag&=~OFF_GPS_F_1; //取消掉电GPS的标志位
  75.     gPhone_Status=READY;
  76.     gStatus1_Flag&=~PHONE_ONLINE_F_1;
  77. }
  78. }
  79. /********************************************************
  80. * 函数名:Do_Reset_GSM_On
  81. 作用域:外部文件调用
  82. * 功能:  针对G20模块在上电后的启动步骤的操作,进行一些AT指令的初始化
  83. * 参数:
  84. * 返回值:需要对一些相关的全局变量进行附值
  85. * 创建人:
  86. *
  87. * 修改历史:(每条详述)
  88. ********************************************************/
  89. void Do_Reset_GSM_On(void)
  90. {
  91. static unsigned char M22_ReturnER_Count=0; //AT指令返回错误的记数
  92. unsigned int i=0,j=0;
  93. gVolume=TWO;
  94. gGeneral_Flag&=~LAND_TCP_F_1;
  95. Clear_Exter_WatchDog();
  96. gGet_Driver_Info_Count=0;
  97. gSet_Distance_Info_Count=0;
  98. //1,AT
  99. if(gReset_M22_On_Setp==1)
  100. {
  101. if(gTimer_GSM_AT>300)
  102. {
  103. Send_COM0_String((unsigned char *)AT,sizeof(AT));
  104. gTimer_GSM_AT=0;
  105. gReset_M22_On_Setp=2;
  106. }
  107. else Check_GSM();
  108. }
  109. else if(gReset_M22_On_Setp==2)
  110. {
  111. if(Check_GSM()!=0)
  112. {
  113. gTimer_GSM_AT=0;
  114.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK))!=0)
  115.     {
  116.      M22_ReturnER_Count=0;
  117.      gReset_M22_On_Setp=3;
  118.     }
  119.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  120.     {
  121.      M22_ReturnER_Count++;
  122. if(M22_ReturnER_Count>10)
  123. {
  124. M22_ReturnER_Count=0;
  125. gGeneral_Flag|=OFF_M22_F_1;
  126. gOFF_Power_S=1;
  127. gPhone_Status=READY;
  128. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  129. return;
  130. }
  131. else gReset_M22_On_Setp=1;
  132.     }
  133. }
  134. else if(gTimer_GSM_AT>3000)
  135. {
  136.      M22_ReturnER_Count++;
  137. if(M22_ReturnER_Count>10)
  138. {
  139. M22_ReturnER_Count=0;
  140. gGeneral_Flag|=OFF_M22_F_1;
  141. gOFF_Power_S=1;
  142. gPhone_Status=READY;
  143. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  144. return;
  145. }
  146. else gReset_M22_On_Setp=1;
  147. }
  148. }
  149. //2,ATZ
  150. else if(gReset_M22_On_Setp==3)
  151. {
  152. if(gTimer_GSM_AT>300)
  153. {
  154. Send_COM0_String((unsigned char *)ATZ,sizeof(ATZ));
  155. gTimer_GSM_AT=0;
  156. gReset_M22_On_Setp=4;
  157. }
  158. else Check_GSM();
  159. }
  160. else if(gReset_M22_On_Setp==4)
  161. {
  162. Wait_Return_M22(5);
  163. /*
  164. if(Check_GSM()!=0)
  165. {
  166. gTimer_GSM_AT=0;
  167.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK))!=0)
  168.     {
  169.      gReset_M22_On_Setp=5;
  170.     }
  171.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  172.     {
  173.      gReset_M22_On_Setp=1;
  174.     }
  175. }
  176. else if(gTimer_GSM_AT>3000)
  177. {
  178. gReset_M22_On_Setp=1;
  179. }
  180. */
  181. }
  182. //3,AT+CGMM
  183. else if(gReset_M22_On_Setp==5)
  184. {
  185. if(gTimer_GSM_AT>1000)
  186. {
  187. Send_COM0_String((unsigned char *)AT_CGMM,sizeof(AT_CGMM));
  188. gTimer_GSM_AT=0;
  189. gReset_M22_On_Setp=6;
  190. }
  191. else Check_GSM();
  192. }
  193. //4,AT+CGMR
  194. else if(gReset_M22_On_Setp==6)
  195. {
  196. if(gTimer_GSM_AT>1000)
  197. {
  198. Send_COM0_String((unsigned char *)AT_CGMR,sizeof(AT_CGMR));
  199. gTimer_GSM_AT=0;
  200. gReset_M22_On_Setp=7;
  201. }
  202. else Check_GSM();
  203. }
  204. //5,AT+CGSN
  205. else if(gReset_M22_On_Setp==7)
  206. {
  207. if(gTimer_GSM_AT>1000)
  208. {
  209. Send_COM0_String((unsigned char *)AT_CGSN,sizeof(AT_CGSN));
  210. gTimer_GSM_AT=0;
  211. gReset_M22_On_Setp=8;
  212. }
  213. else Check_GSM();
  214. }
  215. //6,AT+CMGF=0
  216. else if(gReset_M22_On_Setp==8)
  217. {
  218. if(gTimer_GSM_AT>1000)
  219. {
  220. Send_COM0_String((unsigned char *)AT_CMGF0,sizeof(AT_CMGF0));
  221. gTimer_GSM_AT=0;
  222. gReset_M22_On_Setp=9;
  223. }
  224. else Check_GSM();
  225. }
  226. else if(gReset_M22_On_Setp==9)
  227. {
  228. Wait_Return_M22(10);
  229. /*
  230. if(Check_GSM()!=0)
  231. {
  232. gTimer_GSM_AT=0;
  233.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK))!=0)
  234.     {
  235.      gReset_M22_On_Setp=10;
  236.     }
  237.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  238.     {
  239.      gReset_M22_On_Setp=1;
  240.     }
  241. }
  242. else if(gTimer_GSM_AT>6000)
  243. {
  244. gReset_M22_On_Setp=1;
  245. }
  246. */
  247. }
  248. //6-1,AT+CREG?
  249. else if(gReset_M22_On_Setp==10)
  250. {
  251. if(gTimer_GSM_AT>2000)
  252. {
  253. Send_COM0_String((unsigned char *)AT_CREG,sizeof(AT_CREG));
  254. gTimer_GSM_AT=0;
  255. gReset_M22_On_Setp=11;
  256. }
  257. else Check_GSM();
  258. }
  259. else if(gReset_M22_On_Setp==11)
  260. {
  261. if(Check_GSM()!=0)
  262. {
  263. gTimer_GSM_AT=0;
  264.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CREG,sizeof(String_CREG))!=0)
  265.     {
  266.      if( (gGeneral_Buffer[8]==',')&&(gGeneral_Buffer[10]=='1') )
  267.      {
  268.      gReset_M22_On_Setp=12;
  269.      gM22_ReturnER_SIM_Count=0;
  270.      }
  271.      else
  272.      {
  273.      gM22_ReturnER_SIM_Count++;
  274.      if(gM22_ReturnER_SIM_Count>60)
  275.      {
  276. gGeneral_Flag|=OFF_M22_F_1;
  277. gOFF_Power_S=1;
  278. gPhone_Status=READY;
  279. gM22_ReturnER_SIM_Count=0;
  280. return;
  281.      }
  282.      else
  283.      {
  284.      gReset_M22_On_Setp=10;
  285.      gTimer_GSM_AT=0;
  286.      }
  287.      }
  288.     }
  289. }
  290. else if(gTimer_GSM_AT>6000)
  291. {
  292. gReset_M22_On_Setp=1;
  293. }
  294. }
  295. //7,AT+COPS?
  296. else if(gReset_M22_On_Setp==12)
  297. {
  298. if(gTimer_GSM_AT>2000)
  299. {
  300. Send_COM0_String((unsigned char *)AT_COPS_C,sizeof(AT_COPS_C));
  301. gTimer_GSM_AT=0;
  302. gReset_M22_On_Setp=13;
  303. }
  304. else Check_GSM();
  305. }
  306. else if(gReset_M22_On_Setp==13)
  307. {
  308. if(Check_GSM()!=0)
  309. {
  310. gTimer_GSM_AT=0;
  311.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_COPS,sizeof(String_COPS))!=0)
  312.     {
  313.      if( (gGeneral_Buffer[8]==',')&&(gGeneral_Buffer[9]=='0') )
  314.      {
  315.      //表示已经找到SIM卡的网络
  316.      gReset_M22_On_Setp=14;
  317.      gM22_ReturnER_SIM_Count=0;
  318.      }
  319.      else
  320.      {
  321.      gM22_ReturnER_SIM_Count++;
  322.      if(gM22_ReturnER_SIM_Count>60)
  323.      {
  324. gGeneral_Flag|=OFF_M22_F_1;
  325. gOFF_Power_S=1;
  326. gPhone_Status=READY;
  327. gM22_ReturnER_SIM_Count=0;
  328. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  329. return;
  330.      }
  331.      else
  332.      {
  333.      gReset_M22_On_Setp=12;
  334.      }
  335.      }
  336.     }
  337. }
  338. else if(gTimer_GSM_AT>6000)
  339. {
  340. gReset_M22_On_Setp=1;
  341. }
  342. }
  343. //8,AT+CIMI
  344. else if(gReset_M22_On_Setp==14)
  345. {
  346. if(gTimer_GSM_AT>1000)
  347. {
  348. Send_COM0_String((unsigned char *)AT_CIMI,sizeof(AT_CIMI));
  349. gTimer_GSM_AT=0;
  350. gReset_M22_On_Setp=15;
  351. }
  352. else Check_GSM();
  353. }
  354. //9,AT+CSCA?
  355. else if(gReset_M22_On_Setp==15)
  356. {
  357. if(gTimer_GSM_AT>1000)
  358. {
  359. Send_COM0_String((unsigned char *)AT_CSCA_C,sizeof(AT_CSCA_C));
  360. gTimer_GSM_AT=0;
  361. gReset_M22_On_Setp=16;
  362. }
  363. else Check_GSM();
  364. }
  365. else if(gReset_M22_On_Setp==16)
  366. {
  367. if(Check_GSM()!=0)
  368. {
  369. gTimer_GSM_AT=0;
  370.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CSCA,sizeof(String_CSCA))!=0)
  371.     {
  372.      //具体将读出的短消息中心号码存储在buffer1相应的区域中(直接以ASCII形式存储)
  373.      if(gGeneral_Buffer[7]=='"')
  374.      {
  375.      i=8;
  376. while(1)
  377. {
  378. if(gGeneral_Buffer[i]=='"') break;
  379. i++;if(i>8+20) {gReset_M22_On_Setp=1;return;} //非法长度,则退出
  380. }
  381. if(i>8+1)
  382. {
  383. Load_SMS_CenterNum(i);
  384. gInternal_Flag|=CENTER_NUM_VAILD_F_1;
  385. gInternal_Flag&=~SET_CSCA_F_1;
  386. }
  387. else
  388. {
  389. gInternal_Flag&=~CENTER_NUM_VAILD_F_1;
  390. gInternal_Flag|=SET_CSCA_F_1;
  391. }
  392. gReset_M22_On_Setp=17;
  393. }
  394.      else gReset_M22_On_Setp=1;
  395.     }
  396.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  397.     {
  398.      gReset_M22_On_Setp=1;
  399.     }
  400. }
  401. }
  402. //10,AT$NOSLEEP=1
  403. else if(gReset_M22_On_Setp==17)
  404. {
  405. if(gTimer_GSM_AT>1000)
  406. {
  407. Send_COM0_String((unsigned char *)AT_NOSLEEP1,sizeof(AT_NOSLEEP1));
  408. gTimer_GSM_AT=0;
  409. gReset_M22_On_Setp=18;
  410. }
  411. else Check_GSM();
  412. }
  413. else if(gReset_M22_On_Setp==18)
  414. {
  415. Wait_Return_M22(19);
  416. }
  417. //11,AT+COLP=1
  418. else if(gReset_M22_On_Setp==19)
  419. {
  420. if(gTimer_GSM_AT>1000)
  421. {
  422. Send_COM0_String((unsigned char *)AT_COLP1,sizeof(AT_COLP1));
  423. gTimer_GSM_AT=0;
  424. gReset_M22_On_Setp=20;
  425. }
  426. else Check_GSM();
  427. }
  428. else if(gReset_M22_On_Setp==20)
  429. {
  430. Wait_Return_M22(21);
  431. }
  432. //12,AT+CLIP=1
  433. else if(gReset_M22_On_Setp==21)
  434. {
  435. if(gTimer_GSM_AT>1000)
  436. {
  437. Send_COM0_String((unsigned char *)AT_CLIP1,sizeof(AT_CLIP1));
  438. gTimer_GSM_AT=0;
  439. gReset_M22_On_Setp=22;
  440. }
  441. else Check_GSM();
  442. }
  443. else if(gReset_M22_On_Setp==22)
  444. {
  445. Wait_Return_M22(23);
  446. }
  447. //13,AT$AUPATH=3,1,选择差分的语音通道
  448. else if(gReset_M22_On_Setp==23)
  449. {
  450. if(gTimer_GSM_AT>1000)
  451. {
  452. Send_COM0_String((unsigned char *)AT_AUPATH,sizeof(AT_AUPATH));
  453. gTimer_GSM_AT=0;
  454. gReset_M22_On_Setp=24;
  455. }
  456. else Check_GSM();
  457. }
  458. else if(gReset_M22_On_Setp==24)
  459. {
  460. Wait_Return_M22(25);
  461. }
  462. //14,AT$AUGAIN=(0-2),(1,9)
  463. else if(gReset_M22_On_Setp==25)
  464. {
  465. if(gTimer_GSM_AT>1000)
  466. {
  467. Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
  468. Send_COM0_Byte('1');Send_COM0_Byte(',');
  469. Send_COM0_Byte('5');Send_COM0_Byte(0x0d);
  470. gTimer_GSM_AT=0;
  471. gReset_M22_On_Setp=26;
  472. }
  473. else Check_GSM();
  474. }
  475. else if(gReset_M22_On_Setp==26)
  476. {
  477. Wait_Return_M22(27);
  478. }
  479. else if(gReset_M22_On_Setp==27)
  480. {
  481. if(gTimer_GSM_AT>1000)
  482. {
  483. //2,固定调节SPEKER的接收增益
  484. Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
  485. Send_COM0_Byte('2');Send_COM0_Byte(',');Send_COM0_Byte(Handle_VOL[TWO]);Send_COM0_Byte(0x0d);
  486. gTimer_GSM_AT=0;
  487. gReset_M22_On_Setp=28;
  488. }
  489. else Check_GSM();
  490. }
  491. else if(gReset_M22_On_Setp==28)
  492. {
  493. Wait_Return_M22(29);
  494. }
  495. else if(gReset_M22_On_Setp==29)
  496. {
  497. if(gTimer_GSM_AT>1000)
  498. {
  499. //3,调节AT$AUVOL的接收增益
  500. Send_COM0_String((unsigned char *)AT_AUVOL,sizeof(AT_AUVOL));
  501. Send_COM0_Byte('5');Send_COM0_Byte(0x0d);
  502. gTimer_GSM_AT=0;
  503. gReset_M22_On_Setp=30;
  504. }
  505. else Check_GSM();
  506. }
  507. else if(gReset_M22_On_Setp==30)
  508. {
  509. Wait_Return_M22(31);
  510. }
  511. //15,AT+CNMI=2,2,0,0,0
  512. else if(gReset_M22_On_Setp==31)
  513. {
  514. if(gTimer_GSM_AT>1000)
  515. {
  516. Send_COM0_String((unsigned char *)AT_CNMI,sizeof(AT_CNMI));
  517. gTimer_GSM_AT=0;
  518. gReset_M22_On_Setp=32;
  519. }
  520. else Check_GSM();
  521. }
  522. else if(gReset_M22_On_Setp==32)
  523. {
  524. Wait_Return_M22(33);
  525. }
  526. //16,AT$TIMEOUT=XX(XX表示100--5000毫秒)
  527. else if(gReset_M22_On_Setp==33)
  528. {
  529. if(gTimer_GSM_AT>1000)
  530. {
  531. Send_COM0_String((unsigned char *)AT_TIMEOUT,sizeof(AT_TIMEOUT));
  532. gTimer_GSM_AT=0;
  533. gReset_M22_On_Setp=34;
  534. }
  535. else Check_GSM();
  536. }
  537. else if(gReset_M22_On_Setp==34)
  538. {
  539. Wait_Return_M22(35);
  540. }
  541. //17,AT+CMGD=1,4
  542. else if(gReset_M22_On_Setp==35)
  543. {
  544. if(gTimer_GSM_AT>1000)
  545. {
  546. Send_COM0_String((unsigned char *)AT_CMGD,sizeof(AT_CMGD));
  547. Send_COM0_Byte('1');
  548. Send_COM0_Byte(',');
  549. Send_COM0_Byte('4');
  550. Send_COM0_Byte(0x0d);
  551. gTimer_GSM_AT=0;
  552. gReset_M22_On_Setp=36;
  553. }
  554. else Check_GSM();
  555. }
  556. else if(gReset_M22_On_Setp==36)
  557. {
  558. Wait_Return_M22(37);
  559. }
  560. //18,AT+CMGD=1,4
  561. else if(gReset_M22_On_Setp==37)
  562. {
  563. if(gTimer_GSM_AT>1000)
  564. {
  565. Send_COM0_String((unsigned char *)AT_CMGD,sizeof(AT_CMGD));
  566. Send_COM0_Byte('1');
  567. Send_COM0_Byte(',');
  568. Send_COM0_Byte('4');
  569. Send_COM0_Byte(0x0d);
  570. gTimer_GSM_AT=0;
  571. gReset_M22_On_Setp=38;
  572. }
  573. else Check_GSM();
  574. }
  575. else if(gReset_M22_On_Setp==38)
  576. {
  577. Wait_Return_M22(39);
  578. }
  579. //19,显示程序的时间和作者
  580. else if(gReset_M22_On_Setp==39)
  581. {
  582. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  583. //开发商:哈工大泰森电子有限公司
  584. Send_COM1_String( (unsigned char *)MADE,sizeof(MADE) );
  585. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  586. //开发着:
  587. Send_COM1_String( (unsigned char *)AUTHOR,sizeof(AUTHOR) );
  588. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  589. //产品型号:
  590. Send_COM1_String( (unsigned char *)MODEL,sizeof(MODEL) );
  591. Send_COM1_Byte(':');
  592. Send_COM1_String( (unsigned char *)MODEL_TYPE2,sizeof(MODEL_TYPE2) );
  593. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  594. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  595. //开发日期
  596. Send_COM1_String( (unsigned char *)DESIGN_DATA,sizeof(DESIGN_DATA) );
  597. Send_COM1_String( (unsigned char *)EDIT_DATE,sizeof(EDIT_DATE) );
  598. //软件版本
  599. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  600. Send_COM1_String( (unsigned char *)SOFT_EDITION,sizeof(SOFT_EDITION) );
  601. Send_COM1_String( (unsigned char *)GPS_2005A,sizeof(GPS_2005A) );
  602. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  603. Send_COM1_String( (unsigned char *)UPDATE_TIME,sizeof(UPDATE_TIME) );
  604. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  605. gReset_M22_On_Setp=40;
  606. }
  607. //20,M22初始化完成
  608. else if(gReset_M22_On_Setp==40)
  609. {
  610. gReset_M22_On_Setp=0;
  611. gGeneral_Flag&=~RESET_GSM_ON_F_1;
  612. gM22_Status=GSM_WORK;
  613. gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
  614. gGSM_Oper_Type=GSM_PHONE;
  615. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  616. gPhone_Step=0;gTimer_GSM_AT=0;
  617. Send_COM1_String( (unsigned char *)M22_RESET_ON_OK,sizeof(M22_RESET_ON_OK) );
  618. gReceive1_Point=SRAM_RECORD_S;
  619. SRAM_Init();
  620. SRAM_Write(PHONE_AT_2+0,NULL_2);
  621. for(i=PHONE_AT_2+1;i<ECHO_SMS_2;i++)
  622. {
  623. SRAM_Write(i,0);
  624. }
  625. gInternal_Flag|=DISP_ON_F_1;
  626. gStatus1_Flag|=DISPLAY_ON_F_1;
  627. gTimer=0;
  628. while(gTimer<1000){Check_GSM();Clear_Exter_WatchDog();}
  629. gRecord_Data_Timer=0;
  630. gTimer_CSQ=GSM_CHECKCSQ_TIME+1;
  631. SRAM_Init();
  632. SRAM_Write(SHANDLE_DATA_VAILD,NULL_2);
  633. gCheck_Par_Timer=CHECK_SYS_PAR_TIME+1;
  634. }
  635. }
  636. /********************************************************
  637. * 函数名:Ask_SMS_Send
  638. 作用域:外部文件调用
  639. * 功能:  在进行SMS的发送操作AT+CMGS=L(长度)
  640. * 参数:  Input
  641. * 返回值: 无
  642. * 创建人:
  643. *
  644. * 修改历史:(每条详述)
  645. ********************************************************/
  646. void Ask_SMS_Send(unsigned char nInput)
  647. {
  648. Send_COM0_String((unsigned char *)AT_CMGS,sizeof(AT_CMGS));
  649. Send_COM0_Byte(ASCII(nInput/100));
  650. Send_COM0_Byte(ASCII((nInput%100)/10));
  651. Send_COM0_Byte(ASCII(nInput%10));
  652. Send_COM0_Byte(0x0d);
  653. }
  654. /********************************************************
  655. * 函数名:Send_SMS_Head
  656. 作用域:外部文件调用
  657. * 功能:  根据SMS的标准格式,这里是将短消息中心号码,目标电话号码,协议格式
  658. 发送到GSM模块
  659. * 参数:  I
  660. * 返回值: 无
  661. * 创建人:
  662. *
  663. * 修改历史:(每条详述)
  664. 发送SMS的头,包括短消息中心号码在内的固定长度
  665. 注意这里的头与在G18里不一样,必须将短消息中心号码在数据包头中
  666. AT+CMGS=27
  667. >
  668. 0891683108705505F011000D91683167108230F70008000CFF4FB008000101000102090D
  669.     在这个子模块中发送的数据则为0891683108705505F011000D91683167108230F7000800
  670.     这个部分只所有发送SMS数据的公共部分。在这个项目文件中,只要短消息中心号码
  671.     和目标电话号码不变,则这部分的发送数据一样。
  672.     0CFF4FB008000101000102090D 这部分属于数据区。会由后面的程序处理。
  673. 这里27的长度是指11000D91683167108230F70008000CFF4FB008000101000102090D
  674. AT+CSCA?
  675. +CSCA: "+8613800755500",145
  676. OK
  677. ********************************************************/
  678. void Send_SMS_Head(void)
  679. {
  680. unsigned int i,j,k,x;
  681. //读短消息中心号码的长度+8613800755500(11位)
  682. SRAM_Init();
  683. j=SRAM_Read(CENTER_NUM_2);
  684. //判断是否有+号
  685. i=SRAM_Read(CENTER_NUM_2+1);
  686. if(i=='+')
  687. {
  688. k=(j+1)/2+1;gInternal_Flag&=~SMS_CENTER_CLASS_1; //送91
  689. }
  690. else
  691. {
  692. k=(j+1)/2+2;gInternal_Flag|=SMS_CENTER_CLASS_1; //送A1
  693. }
  694. //发送号码的长度
  695. Send_COM0_Byte(ASCII(k/16));
  696. Send_COM0_Byte(ASCII(k%16));
  697. if(gInternal_Flag&SMS_CENTER_CLASS_1) Send_COM0_Byte('A');
  698. else Send_COM0_Byte('9');
  699. Send_COM0_Byte('1');
  700. //送A1,不带+,则前面的i也是正常的有效发送数据
  701. if(gInternal_Flag&SMS_CENTER_CLASS_1)
  702. {
  703. k=i;
  704. x=SRAM_Read(CENTER_NUM_2+2);
  705. Send_COM0_Byte(x);
  706. Send_COM0_Byte(k);
  707. i=3;
  708. }
  709. //送91,前面带+
  710. else
  711. {
  712. k=SRAM_Read(CENTER_NUM_2+2);
  713. x=SRAM_Read(CENTER_NUM_2+3);
  714. Send_COM0_Byte(x);
  715. Send_COM0_Byte(k);
  716. i=4;
  717. }
  718. while(1)
  719. {
  720. if(i<j)//如上例这里j=11
  721. {
  722. k=SRAM_Read(CENTER_NUM_2+i);
  723. x=SRAM_Read(CENTER_NUM_2+i+1);
  724. Send_COM0_Byte(x);
  725. Send_COM0_Byte(k);
  726. i++;
  727. i++;
  728. }
  729. //发送短消息中心号码的最后一个字节0
  730. else if(i==j)
  731. {
  732. k=SRAM_Read(CENTER_NUM_2+i);
  733. Send_COM0_Byte('F');
  734. Send_COM0_Byte(k);
  735. break;
  736. }
  737. else break;
  738. }
  739. // 发送1100 (如上例子),这个在所有的协议中均一致
  740. for(i=0;i<sizeof(SMS_Head_1);i++)
  741. {
  742. Send_COM0_Byte(SMS_Head_1[i]);
  743. }
  744. //++++++++++++++++++++++++++++++++++++++++++++++
  745. //发送目标电话号码
  746. //分析:如果存储为 14,'+','8','6','1','3','6','7','0','1','5','5','7','0','4'
  747. //或者存储为 13,'8','6','1','3','6','7','0','1','5','5','7','0','4'
  748. j=SRAM_Read(TARGET_NUMBER1_2);
  749. i=SRAM_Read(TARGET_NUMBER1_2+1);
  750. if(i=='+')
  751. {
  752. k=j-1;gInternal_Flag&=~SMS_TARGET_CLASS_1;
  753. }
  754. else
  755. {
  756. k=j;gInternal_Flag|=SMS_TARGET_CLASS_1;
  757. }
  758. Send_COM0_Byte(ASCII(k/16));
  759. Send_COM0_Byte(ASCII(k%16));
  760. if(gInternal_Flag&SMS_TARGET_CLASS_1) Send_COM0_Byte('A');
  761. else Send_COM0_Byte('9');
  762. Send_COM0_Byte('1');
  763. //送A1,不带+,则前面的i也是正常的有效发送数据
  764. if(gInternal_Flag&SMS_TARGET_CLASS_1)
  765. {
  766. k=i;
  767. x=SRAM_Read(TARGET_NUMBER1_2+2);
  768. Send_COM0_Byte(x);
  769. Send_COM0_Byte(k);
  770. i=3;
  771. }
  772. else //送91,前面带+
  773. {
  774. k=SRAM_Read(TARGET_NUMBER1_2+2);
  775. x=SRAM_Read(TARGET_NUMBER1_2+3);
  776. Send_COM0_Byte(x);
  777. Send_COM0_Byte(k);
  778. i=4;
  779. }
  780. while(1)
  781. {
  782. if(i<j)
  783. {
  784. k=SRAM_Read(TARGET_NUMBER1_2+i);
  785. x=SRAM_Read(TARGET_NUMBER1_2+i+1);
  786. Send_COM0_Byte(x);
  787. Send_COM0_Byte(k);
  788. i++;
  789. i++;
  790. }
  791. //目标电话号码的最后一个字节
  792. else if(i==j)
  793. {
  794. k=SRAM_Read(TARGET_NUMBER1_2+i);
  795. Send_COM0_Byte('F');
  796. Send_COM0_Byte(k);
  797. OperateSPIEnd();
  798. break;
  799. }
  800. else break;
  801. }
  802. OperateSPIEnd();
  803. // 发送短消息的协议方式(如上例子),这个在所有的协议中均一致
  804. for( i=0;i<6;i++ )
  805. {
  806. Send_COM0_Byte(SMS_Head_2[i]);
  807. }
  808. }
  809. /********************************************************
  810. * 函数名:Send_Echo_GSM_Head
  811. 作用域:外部文件调用
  812. * 功能:
  813. * 参数:  nInput  如果属于SMS的发送,则这个参数表示整个数据包的长度
  814.   nCommand 数据包中的命令字
  815.   nACK ACK响应,如果是属于主动发送的上行数据包,则ACK=0
  816.   nLength 指的是在数据包中从消息号到CHK以前的数据的字节数
  817. * 返回值: iCheckOut   这部分发送数据的和(用来计算校验核)
  818. * 创建人:
  819. *
  820. * 修改历史:(每条详述)
  821. 补充说明:具体在buffer1中存储第2类SMS的数据形式如下:0x7B----0xB6(整个分配的区域大小)
  822.   0x7B 存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,
  823.    为0则表示已经处理完了SMS
  824.   0x7C 存储数据包的命令字在这里则为nCommand
  825.   0x7D 存储数据包的ACK的值ACK
  826.   0x7E 存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
  827.   0x7F  从这开始存储数据包
  828. AT+CMGS=27
  829. >
  830. 0891683108705505F011000D91683167108230F70008000CFF4FB008000101000102090D
  831. 这里27的长度是指的是从1100 0D 91 68 3167108230F7 000800 0C FF4FB008000101000102090D
  832. 13760128037
  833. 所以Send_Echo_Head_1子模块的几个参数的计算方式如下:
  834. nInput的计算方式: nInput=12+(0x7d)
  835. nCommand的附值方式:nCommand=(0x7C)
  836. nACK的附值方式: nACK=(0x7E)
  837. nLength的附值方式: nLength=nInput-4
  838. 根据上面的描述,在发送第二累SMS的时候,AT+CMGS=后面跟的数据的长度的计算方式则为
  839. (目标号码长度+1)/2+8+12+(0x7E)
  840. 则根据上面的例子,目标号码为13760128037为11位.  8 是指的1100 0D 91 68 000800的长度
  841.   12指的是0C的长度,因为这是属于第一类的SMS的格式,数据长度为0,
  842.   但在在第二类的SMS中还需要加上数据区的长度,在这里存储在buffer1中的0x7e区域
  843. ********************************************************/
  844. unsigned int Send_Echo_GSM_Head(unsigned char nInput,unsigned char nCommand,unsigned char nACK,unsigned char nLength)
  845. {
  846. unsigned int iCheckOut=0;
  847. Send_COM0_Byte(ASCII(nInput/0x10));
  848. Send_COM0_Byte(ASCII(nInput%0x10));
  849. iCheckOut=0;
  850. Send_COM0_Byte(ASCII(SOH/0x10));
  851. Send_COM0_Byte(ASCII(SOH%0x10));
  852. iCheckOut+=SOH;
  853. Send_COM0_Byte(ASCII((char)nCommand/0x10));
  854. Send_COM0_Byte(ASCII((char)nCommand%0x10));
  855. iCheckOut+=(char)nCommand;
  856. Send_COM0_Byte(ASCII((char)(~nCommand)/0x10));
  857. Send_COM0_Byte(ASCII((char)(~nCommand)%0x10));
  858. iCheckOut+=(char)(~nCommand);
  859. Send_COM0_Byte(ASCII((nLength)/0x10));
  860. Send_COM0_Byte(ASCII((nLength)%0x10));
  861. iCheckOut+=(nInput-4);
  862. Send_COM0_Byte(ASCII(nACK/0x10)); //ACK响应字符
  863. Send_COM0_Byte(ASCII(nACK%0x10));
  864. iCheckOut+=nACK;
  865. Send_COM0_Byte(ASCII(gKind/0x10));
  866. Send_COM0_Byte(ASCII(gKind%0x10));
  867. iCheckOut+=gKind;
  868. Send_COM0_Byte(ASCII(gGroup/0x10));
  869. Send_COM0_Byte(ASCII(gGroup%0x10));
  870. iCheckOut+=gGroup;
  871. Send_COM0_Byte(ASCII(gVID/0x1000));
  872. Send_COM0_Byte(ASCII(gVID%0x1000/0x100));
  873. iCheckOut+=gVID/0x100;
  874. Send_COM0_Byte(ASCII(gVID%0x100/0x10));
  875. Send_COM0_Byte(ASCII(gVID%0x10));
  876. iCheckOut+=gVID%0x100;
  877. return(iCheckOut);
  878. //iCheckOut为计算前面发送部分的数据的校验和。如果后面还有更多的数据
  879. //在计算整个校验核的时候则要继续这个数据一起计算在内
  880. }
  881. /********************************************************
  882. * 函数名:Send_Echo_TCP_Head
  883. 作用域:外部文件调用
  884. * 功能:
  885. * 参数: iCheckIn 前面计算的校验核
  886.    nAddress 需要发送数据在buffer1中的首地址
  887.    nLength 需要发送的数据在buffer1中的长度
  888. * 返回值: iCheckOut  这部分发送数据的和(用来计算校验核)
  889. * 创建人:
  890. *
  891. * 修改历史:(每条详述)
  892. ********************************************************/
  893. unsigned int Send_Echo_TCP_Head(unsigned char nInput,unsigned char nCommand,unsigned char nACK,unsigned char nLength)
  894. {
  895. unsigned int iCheckOut=0;
  896. iCheckOut=nInput;
  897. iCheckOut=0;
  898. Send_COM0_Byte(SOH);
  899. iCheckOut+=SOH;
  900. Send_COM0_Byte( nCommand );
  901. iCheckOut+= nCommand;
  902. Send_COM0_Byte( (char)(~nCommand) );
  903. iCheckOut+=(char)(~nCommand);
  904. Send_COM0_Byte( nLength );
  905. iCheckOut+=nLength;
  906. Send_COM0_Byte( nACK );
  907. iCheckOut+=nACK;
  908. Send_COM0_Byte( gKind );
  909. iCheckOut+=gKind;
  910. Send_COM0_Byte( gGroup );
  911. iCheckOut+=gGroup;
  912. Send_COM0_Byte( gVID/0x100 );
  913. iCheckOut+=gVID/0x100;
  914. Send_COM0_Byte( gVID%0x100 );
  915. iCheckOut+=gVID%0x100;
  916. return(iCheckOut);
  917. //iCheckOut为计算前面发送部分的数据的校验和。如果后面还有更多的数据
  918. //在计算整个校验核的时候则要继续这个数据一起计算在内
  919. }
  920. /********************************************************
  921. * 函数名:Send_Buffer1_GSM_Data
  922. 作用域:外部文件调用
  923. * 功能: 打包发送存储在buffer1中的数据区的数据。并计算校验核
  924. * 参数: iCheckIn 前面计算的校验核
  925.    nAddress 需要发送数据在buffer1中的首地址
  926.    nLength 需要发送的数据在buffer1中的长度
  927. * 返回值: iCheckOut  这部分发送数据的和(用来计算校验核)
  928. * 创建人:
  929. *
  930. * 修改历史:(每条详述)
  931. ********************************************************/
  932. unsigned int Send_Buffer1_GSM_Data(unsigned int iCheckIn,unsigned char nAddress,unsigned char nLength)
  933. {
  934. unsigned int iCheckOut,i;
  935. unsigned char Data_Temp;
  936. OperateSPIEnd();
  937. iCheckOut=iCheckIn;
  938. if(nLength>0)
  939. {
  940. Data_Temp=SRAM_Read(nAddress);
  941. iCheckOut += Data_Temp;
  942. Send_COM0_Byte(ASCII(Data_Temp/0x10));
  943. Send_COM0_Byte(ASCII(Data_Temp%0x10));
  944. for(i=1;i<nLength;i++)
  945. {
  946. Data_Temp=SRAM_Read(nAddress+i);
  947. iCheckOut += Data_Temp;
  948. Send_COM0_Byte(ASCII(Data_Temp/0x10));
  949. Send_COM0_Byte(ASCII(Data_Temp%0x10));
  950. }
  951. }
  952. OperateSPIEnd();
  953. return(iCheckOut);
  954. }
  955. /********************************************************
  956. * 函数名:Send_Buffer1_TCP_Data
  957. 作用域:外部文件调用
  958. * 功能: 打包发送存储在buffer1中的数据区的数据。并计算校验核
  959. * 参数: iCheckIn 前面计算的校验核
  960.    nAddress 需要发送数据在buffer1中的首地址
  961.    nLength 需要发送的数据在buffer1中的长度
  962. * 返回值: iCheckOut  这部分发送数据的和(用来计算校验核)
  963. * 创建人:
  964. *
  965. * 修改历史:(每条详述)
  966. ********************************************************/
  967. unsigned int Send_Buffer1_TCP_Data(unsigned int iCheckIn,unsigned char nAddress,unsigned char nLength)
  968. {
  969. unsigned int iCheckOut,i;
  970. unsigned char Data_Temp;
  971. OperateSPIEnd();
  972. iCheckOut=iCheckIn;
  973. if(nLength>0)
  974. {
  975. Data_Temp=SRAM_Read(nAddress);
  976. iCheckOut += Data_Temp;
  977. Send_COM0_Byte( Data_Temp );
  978. for(i=1;i<nLength;i++)
  979. {
  980. Data_Temp=SRAM_Read(nAddress+i);
  981. iCheckOut += Data_Temp;
  982. Send_COM0_Byte( Data_Temp );
  983. }
  984. }
  985. OperateSPIEnd();
  986. return(iCheckOut);
  987. }
  988. /********************************************************
  989. * 函数名:Send_Echo_TCP_End
  990. 作用域:外部文件调用
  991. * 功能:  进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
  992. 是所有发送SMS,和GPRS数据均可调用的子程序
  993. * 参数:  Input  前面计算的校验核,在这里要发送出去
  994. * 返回值:
  995. * 创建人:
  996. *
  997. * 修改历史:(每条详述)
  998. ********************************************************/
  999. void Send_Echo_TCP_End(unsigned int iInput)
  1000. {
  1001. Send_COM0_Byte( iInput/0x100 );
  1002. Send_COM0_Byte( iInput%0x100 );
  1003. Send_COM0_Byte( EOT );
  1004. }
  1005. /********************************************************
  1006. * 函数名:Send_Echo_GSM_End
  1007. 作用域:外部文件调用
  1008. * 功能:  进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
  1009. 是所有发送SMS,和GPRS数据均可调用的子程序
  1010. * 参数:  Input  前面计算的校验核,在这里要发送出去
  1011. * 返回值:
  1012. * 创建人:
  1013. *
  1014. * 修改历史:(每条详述)
  1015. ********************************************************/
  1016. void Send_Echo_GSM_End(unsigned int iInput)
  1017. {
  1018. Send_COM0_Byte(ASCII(iInput/0x1000));
  1019. Send_COM0_Byte(ASCII(iInput%0x1000/0x100));
  1020. Send_COM0_Byte(ASCII(iInput%0x100/0x10));
  1021. Send_COM0_Byte(ASCII(iInput%0x10));
  1022. Send_COM0_Byte(ASCII(EOT/0x10));
  1023. Send_COM0_Byte(ASCII(EOT%0x10));
  1024. }
  1025. /********************************************************
  1026. * 函数名:Send_Echo_GSM_End
  1027. 作用域:外部文件调用
  1028. * 功能:  进行最后部分的数据发送,这部分可以与GPRS的数据发送共用
  1029. 是所有发送SMS,和GPRS数据均可调用的子程序
  1030. * 参数:  Input  前面计算的校验核,在这里要发送出去
  1031. * 返回值:
  1032. * 创建人:
  1033. *
  1034. * 修改历史:(每条详述)
  1035. ********************************************************/
  1036. void Wait_Return_M22(unsigned char Next_Step)
  1037. {
  1038. if(Check_GSM()!=0)
  1039. {
  1040. gTimer_GSM_AT=0;
  1041.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK))!=0)
  1042.     {
  1043.      gReset_M22_On_Setp=Next_Step;
  1044.     }
  1045.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  1046.     {
  1047.      gReset_M22_On_Setp=1;
  1048.     }
  1049. }
  1050. else if(gTimer_GSM_AT>3000)
  1051. {
  1052. gReset_M22_On_Setp=1;
  1053. }
  1054. }