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

GPS编程

开发平台:

Others

  1. /********************************************************
  2. * 文件名:  Check_GSM.C
  3. * 创建时间:2004年12月7日
  4. * 创建人:  
  5. * 版本号:  1.00
  6. * 功能:
  7. * 文件属性:特殊文件
  8. * 修改历史:(每条详述)
  9. ********************************************************/
  10. #include <msp430x14x.h>
  11. #include "Uart01.h"
  12. #include "General.h"
  13. #include "Define_Bit.h"
  14. #include "Sub_C.h"
  15. #include "M22_AT.h"
  16. #include "Check_GSM.h"
  17. #include "W_Protocol.h"
  18. #include "SPI45DB041.h"
  19. #include "D_Buffer.h"
  20. #include "Other_Define.h"
  21. #include "TA_Uart.h"
  22. #include "Handle_Protocol.h"
  23. #include "Disp_Protocol.h"
  24. #include "Do_Handle.h"
  25. #include "Do_SRAM.h"
  26. /*
  27. #include "Main_Init.h"
  28. #include "Do_Reset.h"
  29. #include "Do_GSM.h"
  30. #include "Msp430_Flash.h"
  31. */
  32. #define Debug_GSM_COM1
  33. void Do_SMS_Receive(unsigned int iLength,unsigned char iRLength);
  34. void Do_GPRS_Receive(void);
  35. void Deal_Command(void);
  36. unsigned char Check_Command(void);
  37. void IP_SOCKET_Switch(void);
  38. void Do_Parameter_Set(void);
  39. void Position_Echo(void);
  40. void Pass_Data_Echo(void);
  41. void Set_Cycle_Timer(void);
  42. void Disp_Dispaly_Info(void);
  43. void Set_TCP_OnOrOff(void);
  44. void Query_SYS_Ver(void);
  45. void Deal_Alarm_Echo(void);
  46. void Deal_Vehicle_Monitor(void);
  47. void Set_Phone_Limit(void);
  48. void Set_Area_Limit(void);
  49. void Send_RecordData(void);
  50. void Set_Distance_Par(void);
  51. void Set_Phone_Num(void);
  52. void Watch_Way(void);
  53. void Line_Data_Deal(void);
  54. //unsigned char Do_Deal_Area(unsigned char Add_Flash,unsigned char Add_Buffer );
  55. /********************************************************
  56. * 函数名:Check_GSM
  57. 作用域:外部文件调用
  58. * 功能: 判断处理GSM接收缓冲gReceive0_GSM_Buffer中的数据,如果判断有0x0d,0x0a表示有
  59. 一包GSM数据返回。将这一包数据转移到处理缓冲gGeneral_Buffer中进行处理
  60. * 参数:  全局变量:GSM的接收缓冲gReceive0_GSM_Buffer[],指针gReceive0_GSM_Buffer_Move
  61.   gReceive0_GSM_Buffer_Point。
  62.   数据处理缓冲gGeneral_Buffer[]
  63. * 返回值:0:表示对GSM数据接收缓冲未做任何处理
  64. 1:表示转移一包数据,并处理完成
  65. 其中在返回的过程中,有写特殊的出口处理,需要对一些全局变量进行操作。具体见具体详细描叙
  66. * 创建人:
  67. *
  68. * 修改历史:(每条详述)
  69. ********************************************************/
  70. unsigned int Check_GSM(void)
  71. {
  72. unsigned int i,j,k;
  73. for(k=0;k<sizeof(gGeneral_Buffer);k++) gGeneral_Buffer[k]=0;
  74. i = 0;
  75. j = gReceive0_GSM_Buffer_Move;
  76. if( gReceive0_GSM_Buffer_Point == gReceive0_GSM_Buffer_Move ) return(0);
  77. gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
  78. i++;j++;
  79. if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
  80. while(j!=gReceive0_GSM_Buffer_Point)
  81. {
  82. gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
  83. i++;j++;
  84. if( i >= sizeof(gGeneral_Buffer) )
  85. {
  86. // Send_COM1_String((unsigned char *)R_OVERTOP,sizeof(R_OVERTOP));
  87. for(i=0;i<sizeof(gGeneral_Buffer);i++)    gGeneral_Buffer[i]=0;
  88. for(i=0;i<sizeof(gReceive0_GSM_Buffer);i++) gReceive0_GSM_Buffer[i]=0;
  89. gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  90. gReceive0_GSM_Buffer_Point=0;
  91. gReceive0_GSM_Buffer_Move=0;
  92. return(0);
  93. }
  94. if( j >= sizeof(gReceive0_GSM_Buffer) )   j=0;
  95. /********************************************************
  96. ********************************************************/
  97. //判断有发送SMS的符号+++++++++++++++++++++++++++++++++++
  98. if( (gGeneral_Buffer[i-1]==' ')&&(gGeneral_Buffer[i-2]=='>') )
  99. {
  100. #ifdef Debug_GSM_COM1
  101. Send_COM1_String(gGeneral_Buffer,i);
  102. #endif
  103. gReceive0_GSM_Buffer_Move=j; //表示一包有效帧数据处理完
  104. if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  105. else     gReceive0_GSM_Buffer_End=j-1;
  106. return(1);
  107. }
  108. //判断有一包有效帧数据++++++++++++++++++++++++++++++++++++
  109. else if( (gGeneral_Buffer[i-1]==0x0a)&&(gGeneral_Buffer[i-2]==0x0d) )
  110. {
  111. #ifdef Debug_GSM_COM1
  112. Send_COM1_String(gGeneral_Buffer,i);
  113. #endif
  114. gReceive0_GSM_Buffer_Move=j; //表示一包有效帧数据处理完
  115. if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  116. else     gReceive0_GSM_Buffer_End=j-1;
  117. //*下面则是一个返回数据包在缓冲General_Buffer[]中,数据包的长度为i
  118. /********************************************************
  119. 1,判断是否有电话打入方面的处理:
  120. RING
  121. +CLIP: "13670155704",129,,,,0
  122. +CLIP: "13670155704",129,,,,0
  123. ********************************************************/
  124. //***************************************************************************
  125. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_RING,sizeof(String_RING))!=0)
  126. {
  127. return(0);
  128. }
  129. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CLIP,sizeof(String_CLIP))!=0)
  130. {
  131. if(   ((gGeneral_Flag&RESET_GSM_ON_F_1)==0 )
  132. &&((gGeneral_Flag&LAND_TCP_F_1)==0)
  133. &&((gInternal_Flag&GSM_ONEAT_SUCCESS_1)==0)   )
  134. {
  135. if((gGeneral_Flag&RING_F_1)==0) gHangUp_Timer=0;
  136. gGeneral_Flag|=TCP_PHONE_F_1;
  137. gStatus1_Flag|=PHONE_ONLINE_F_1;
  138. gGeneral_Flag|=RING_F_1;
  139. return(1);
  140. }
  141. else return(0);
  142. }
  143. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_BUSY,sizeof(String_BUSY))!=0)
  144. {
  145. return(1);
  146. }
  147. /********************************************************
  148. 2,判断是否有AT打头的属于AT指令的返回方面的处理或者空行
  149.   比方说AT指令的回显字符,或者0x0d,0x0a
  150. ********************************************************/
  151. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_AT,sizeof(String_AT))!=0)
  152. {
  153. return(0);
  154. }
  155. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_END,sizeof(String_END))!=0)
  156. {
  157. return(0);
  158. }
  159. /********************************************************
  160. 3,判断是否有NO CARRIER 返回的处理
  161. ********************************************************/
  162. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOCARRIER,sizeof(String_NOCARRIER))!=0)
  163. {
  164. if( (gM22_Status==TCP_HANG_WORK) )
  165. {
  166. if( (gGeneral_Flag&TCP_PHONE_F_1)==0 )
  167. {
  168. gM22_Status=GSM_WORK;
  169. gGSM_Oper_Type=GSM_PHONE;
  170. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  171. gPhone_Step=0;gTimer_GSM_AT=0;
  172. }
  173. else
  174. {
  175. if(gPhone_Status==ACTIVE_MONITOR)
  176. {
  177. //监听结束
  178. gPhone_Status=READY;
  179. gGeneral_Flag&=~TCP_PHONE_F_1;
  180. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  181. gGeneral_Flag|=MONITOR_RESUME_F_1;
  182. P6OUT&=~SEL_MIC;
  183. gGeneral_Flag|=TCP_STATUS_F_1;
  184. }
  185. else if( (gPhone_Status==ACTIVE_HANDLE)||(gGeneral_Flag&RING_F_1) )
  186.   {
  187. //手柄通话结束
  188. gPhone_Status=READY;
  189. gGeneral_Flag&=~RING_F_1;
  190. gGeneral_Flag&=~TCP_PHONE_F_1;
  191. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  192. //发送一个挂机信号给手柄
  193.     Send_COM3_Load(4,MAIN_HANG_UP,0);
  194. gSys_Handle=MAIN_HANG_UP;
  195. gGeneral_Flag|=TCP_STATUS_F_1;
  196. }
  197. gGeneral_Flag&=~DAILING_UP_F_1;
  198. gGeneral_Flag&=~MONITOR_ON_F_1;
  199. gPhone_Status=READY;
  200. gGeneral_Flag&=~TCP_PHONE_F_1;
  201. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  202. gGeneral_Flag&=~RING_F_1;
  203. gGeneral_Flag|=TCP_STATUS_F_1;
  204. gCommon_Flag&=~CHECK_RINGPHONE_F_1;
  205. }
  206. }
  207. else if(gM22_Status==GSM_WORK)
  208. {
  209. if(gPhone_Status==ACTIVE_MONITOR)
  210. {
  211. //监听结束
  212. gPhone_Status=READY;
  213. gGeneral_Flag&=~TCP_PHONE_F_1;
  214. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  215. }
  216. else if( (gPhone_Status==ACTIVE_HANDLE)||(gGeneral_Flag&RING_F_1) )
  217. {
  218. //手柄通话结束
  219. gPhone_Status=READY;
  220. gGeneral_Flag&=~RING_F_1;
  221. gGeneral_Flag&=~TCP_PHONE_F_1;
  222. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  223.         Send_COM3_Load(4,MAIN_HANG_UP,0);
  224.         gSys_Handle=MAIN_HANG_UP;
  225. //发送一个挂机信号给手柄
  226. }
  227. gGeneral_Flag&=~DAILING_UP_F_1;
  228. gGeneral_Flag&=~MONITOR_ON_F_1;
  229. gPhone_Status=READY;
  230. gGeneral_Flag&=~TCP_PHONE_F_1;
  231. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  232. gGeneral_Flag&=~RING_F_1;
  233. gGeneral_Flag|=MONITOR_RESUME_F_1;
  234. gCommon_Flag&=~CHECK_RINGPHONE_F_1;
  235. }
  236. return(1);
  237. }
  238. /********************************************************
  239. 4,判断是否有+CMT: 返回的处理(属于中断接收SMS的信息处理)
  240. +CMT: ,032
  241. 0891683108705505F0040D91683128782840F90004503011613495000CFF000000000000000000001B
  242. ********************************************************/
  243. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CMT,sizeof(String_CMT))!=0)
  244. {
  245.         gSMS_In_Lenth=0;
  246.         j=4;k=0;
  247.         while(1)
  248.         {
  249.          if(gGeneral_Buffer[j]==',') {k=1;break;}
  250.          j++;
  251.          if(j>i) break;
  252.         }
  253.         if(k==1)
  254.         {
  255.          for(k=0;k<3;k++)
  256.          {
  257. gSMS_In_Lenth*=10;
  258. gSMS_In_Lenth=gSMS_In_Lenth+(gGeneral_Buffer[k+j+1]-0x30);
  259.          }
  260. gInternal_Flag|=RECEIVE_SMS_F_1;
  261.         }
  262. return(0);
  263. }
  264. else if(gInternal_Flag&RECEIVE_SMS_F_1)
  265. {
  266. gInternal_Flag&=~RECEIVE_SMS_F_1;
  267. Do_SMS_Receive(i,gSMS_In_Lenth);
  268. return(0);
  269. }
  270. /********************************************************
  271. 5,其他
  272. ********************************************************/
  273. return(1);
  274. }//end else if( (gGeneral_Buffer[i-1]==0x0a)&&(gGeneral_Buffer[i-2]==0x0d) )
  275. }//end while
  276. return(0);
  277. }
  278. /********************************************************
  279. * 函数名:Check_TCP
  280. 作用域:外部文件调用
  281. * 功能:
  282. * 参数:  全局变量:GSM的接收缓冲gReceive0_GSM_Buffer[],指针gReceive0_GSM_Buffer_Move
  283.   gReceive0_GSM_Buffer_Point。
  284.   数据处理缓冲gGeneral_Buffer[]
  285. * 返回值:0:表示对GSM数据接收缓冲未做任何处理
  286. 1:表示转移一包数据,并处理完成
  287. 其中在返回的过程中,有写特殊的出口处理,需要对一些全局变量进行操作。具体见具体详细描叙
  288. * 创建人:
  289. *
  290. * 修改历史:(每条详述)
  291. 补充说明:
  292. ********************************************************/
  293. unsigned int Check_TCP(void)
  294. {
  295. unsigned int i,j,k,x;
  296. unsigned char nLength;
  297. unsigned char nFlag;
  298. nLength=0;
  299. //已经100ms,未接收到M22的数据,则可以判断接收缓冲区中的数据
  300. if(gM22_TCP_ECHO_Timer>60)
  301. {
  302. nFlag=0;
  303. for(k=0;k<sizeof(gGeneral_Buffer);k++) gGeneral_Buffer[k]=0;
  304. i = 0;
  305. j = gReceive0_GSM_Buffer_Move;
  306. if( gReceive0_GSM_Buffer_Point == gReceive0_GSM_Buffer_Move ) return(0);
  307. gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
  308. i++;j++;
  309. if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
  310. while(j!=gReceive0_GSM_Buffer_Point)
  311. {
  312. gGeneral_Buffer[i] = gReceive0_GSM_Buffer[j];
  313. i++;j++;
  314. if( i >= sizeof(gGeneral_Buffer) )
  315. {
  316. // Send_COM1_String((unsigned char *)R_OVERTOP,sizeof(R_OVERTOP));
  317. for(i=0;i<sizeof(gGeneral_Buffer);i++)    gGeneral_Buffer[i]=0;
  318. for(i=0;i<sizeof(gReceive0_GSM_Buffer);i++) gReceive0_GSM_Buffer[i]=0;
  319. gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  320. gReceive0_GSM_Buffer_Point=0;
  321. gReceive0_GSM_Buffer_Move=0;
  322. return(0);
  323. }
  324. if( j >= sizeof(gReceive0_GSM_Buffer) )   j=0;
  325. //如果能执行到这里,则已经将接收缓冲的数据转移到gGeneral_Buffer缓冲中。
  326. for(k=0;k<i;k++)
  327. {
  328. //判断是否为下行的命令数据包
  329. //例:FF 4F 0B 08 00 01 01 00 08 02 10 0D
  330. if( (gGeneral_Buffer[k]==SOH) //判断包头
  331. &&(gGeneral_Buffer[gGeneral_Buffer[k+3]+3]==EOT) //判断包尾
  332. &&(gGeneral_Buffer[k+1]==(char)(~gGeneral_Buffer[k+2])) ) //判断命令字是否取反
  333. {
  334. // Send_COM1_String((unsigned char *)TCP_COMMAAND,sizeof(TCP_COMMAAND));
  335. nLength=gGeneral_Buffer[k+3]+3+1; //分析有效数据包长度
  336. j = gReceive0_GSM_Buffer_Move;
  337. for(x=0;x<nLength+k;x++)
  338. {
  339. j++;
  340. if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
  341. }
  342. gReceive0_GSM_Buffer_Move=j; //移动处理处理缓冲区指针
  343. if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  344. else     gReceive0_GSM_Buffer_End=j-1;
  345. //处理适合Do_GPRS_Receive()处理的gGeneral_Buffer缓冲数据安排
  346. if(k==0)
  347. {
  348. for(x=nLength;x>=1;x--)
  349. {
  350. gGeneral_Buffer[x]=gGeneral_Buffer[x-1];
  351. }
  352. gGeneral_Buffer[0]=nLength;
  353. }
  354. else if(k>0)
  355. {
  356. gGeneral_Buffer[k-1]=nLength;
  357. for(x=0;x<=nLength;x++)
  358. {
  359. gGeneral_Buffer[x]=gGeneral_Buffer[k-1+x];
  360. }
  361. }
  362. gGeneral_Flag|=LAND_TCP_SUCCESS_F_1;
  363. Do_GPRS_Receive();
  364. nFlag=1;
  365. break;
  366. }
  367. //判断是否为FF 0D的握手数据
  368. else if( (gGeneral_Buffer[0]==0xFF)&&(gGeneral_Buffer[0+1]==0x0D) )
  369. {
  370. gGeneral_Flag|=LAND_TCP_SUCCESS_F_1;
  371. gLand_Interval_Timer=0;
  372. if(gFF0D_Receive_Timer<=2)
  373. {
  374. for(i=0;i<sizeof(gGeneral_Buffer);i++)    gGeneral_Buffer[i]=0;
  375. for(i=0;i<sizeof(gReceive0_GSM_Buffer);i++) gReceive0_GSM_Buffer[i]=0;
  376. gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  377. gReceive0_GSM_Buffer_Point=0;
  378. gReceive0_GSM_Buffer_Move=0;
  379. return(0);
  380. }
  381. else
  382. {
  383. Send_COM1_String((unsigned char *)TCP_TEST,sizeof(TCP_TEST));
  384. j = gReceive0_GSM_Buffer_Move;
  385. for(x=0;x<2;x++)
  386. {
  387. j++;
  388. if( j >= sizeof(gReceive0_GSM_Buffer) ) j=0;
  389. }
  390. gReceive0_GSM_Buffer_Move=j; //移动处理处理缓冲区指针
  391. if(j==0) gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  392. else     gReceive0_GSM_Buffer_End=j-1;
  393. gFF0D_Receive_Timer=0;
  394. nFlag=1;
  395. }
  396. break;
  397. }
  398. //判断是否出现TCP掉线信息
  399. //0D 0A 4F 4B 0D 0A 0D 0A 43 4F 4E 4E 45 43 54 0D 0A 0D 0A 4F
  400. //4B 0D 0A 0D 0A 4F 4B 0D 0A 0D 0A 4E 4F 20 43 41 52 52 49 45 52 0D 0A
  401. else if( (gGeneral_Buffer[k]==0x4E)
  402.  &&(gGeneral_Buffer[k+1]==0x4F)
  403.  &&(gGeneral_Buffer[k+2]==0x20)
  404.  &&(gGeneral_Buffer[k+3]==0x43)
  405.  &&(gGeneral_Buffer[k+4]==0x41)
  406.  &&(gGeneral_Buffer[k+5]==0x52)
  407.  &&(gGeneral_Buffer[k+6]==0x52)
  408.  &&(gGeneral_Buffer[k+7]==0x49)
  409.  &&(gGeneral_Buffer[k+8]==0x45)
  410.  &&(gGeneral_Buffer[k+9]==0x52)
  411.  &&(gGeneral_Buffer[k+10]==0x0D)
  412.  &&(gGeneral_Buffer[k+11]==0x0A) )
  413.   {
  414.   //如果满足条件,说明已经TCP断线
  415.   Send_COM1_String((unsigned char *)TCP_QUIT,sizeof(TCP_QUIT));
  416. gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
  417. gGSM_Oper_Type=GSM_PHONE;
  418. gM22_Status=GSM_WORK;
  419. gReceive0_GSM_Buffer_Move=gReceive0_GSM_Buffer_Point;
  420. if(gReceive0_GSM_Buffer_Point==0)  gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  421. else      gReceive0_GSM_Buffer_End=gReceive0_GSM_Buffer_Point-1;
  422. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  423. gPhone_Step=0;gTimer_GSM_AT=0;
  424.   break;
  425.   }
  426. }//for(k=0;k<i;k++)
  427. }//end while(j!=gReceive0_GSM_Buffer_Point)
  428. }//end gM22_GSM_ECHO_Timer>100
  429. return(0);
  430. }
  431. /********************************************************
  432. * 函数名:Do_SMS_Receive
  433. 作用域:本文件调用
  434. * 功能:  在G20中用AT+CMGR指令读取出SMS的内容,接收并处理
  435. * 参数:  iLength  作为接收整个数据的长度,如下的例子此数据为64
  436.          iRLength 作为AT+CMGR读出返回SMS的长度为32
  437.          全局变量缓冲gGeneral_Buffer
  438. * 返回值:这个模块是将返回数据区的值变换后存储在全局变量gGeneral_Buffer中,并调用
  439. Deal_Command()模块处理数据
  440. * 创建人:
  441. *
  442. * 修改历史:(每条详述)
  443. //////////////////////////////////////////////////////////
  444. AT+CMGR=1
  445. +CMGR: 0,,24
  446. 08                   0D
  447. 0891683108705505F004 0D91683176105507F4 0008 40 0111900093000462 C94E01 (0D 0A)
  448. ----------20-------- ---------20--------- ------20------------ -----8-------
  449. 0891683108705505F0 04 0D91683128782840F9 0004 40 01 03 41 34 5400 0C FF4FB00800302E303002C40D
  450. i=HEX(GSM_Echo_Buffer[0],GSM_Echo_Buffer[1]); 读出值为08
  451. j=(i+2)*2;  20个  (0D的第一个地址)
  452. i=HEX(GSM_Echo_Buffer[j],GSM_Echo_Buffer[j+1]); 读出值为0D
  453. j=j+(i+1)/2*2+22; (02的第一个地址)
  454. i=HEX(GSM_Echo_Buffer[j],GSM_Echo_Buffer[j+1]); 读出值为0C,后面的为数据包的内容
  455. j++;
  456. j++;
  457. +CMT: ,032
  458. 0891683108705505F0040D91683128782840F90004503011613495000CFF000000000000000000001B
  459. ********************************************************/
  460. void Do_SMS_Receive(unsigned int iLength,unsigned char iRLength)
  461. {
  462. unsigned int i,j,k;
  463. unsigned int m,n;
  464. unsigned char y;
  465. //判断SMS的长度与接收的数据是否符合,整个数据包是否收全。iLength为收到的数据包长
  466. //如上例中iRLength=24,iLength=68
  467. if(ASCIITOHEX(gGeneral_Buffer[0],gGeneral_Buffer[1])+iRLength+2==iLength/2)
  468. {
  469. //将内容提取出来仍然存储在General_Buffer[]缓冲中
  470.     i=ASCIITOHEX(gGeneral_Buffer[0],gGeneral_Buffer[1]);
  471.     j=(i+2)*2;
  472.     i=ASCIITOHEX(gGeneral_Buffer[j],gGeneral_Buffer[j+1]);
  473.     //+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  474.     for(m=0;m<sizeof(gNum_Phone_Temp);m++) gNum_Phone_Temp[m]=0;
  475.     m=j; //20
  476.     n=m+(i+1)/2*2+3; //37
  477.     y=0;
  478. gNum_Phone_Temp[y]=0;
  479. y++;
  480. if(gGeneral_Buffer[2]=='9')
  481. {
  482. gNum_Phone_Temp[y]='+';
  483. y++;
  484. }
  485. m=j+4;
  486. while(1)
  487. {
  488. if(m<n)
  489. {
  490. gNum_Phone_Temp[y]=gGeneral_Buffer[m+1];
  491. y++;
  492. gNum_Phone_Temp[y]=gGeneral_Buffer[m];
  493. y++;
  494. m++;m++;
  495. }
  496. else if(m==n)
  497. {
  498. gNum_Phone_Temp[y]=gGeneral_Buffer[m];
  499. y++;
  500. m++;
  501. }
  502. else break;
  503. }
  504. for(m=2;m<y;m++)
  505. {
  506. if( (gNum_Phone_Temp[m]>'9')||(gNum_Phone_Temp[m]<'0') )
  507. break;
  508. }
  509. gNum_Phone_Temp[0]=m-1;
  510. if(gNum_Phone_Temp[0]>14) gNum_Phone_Temp[0]=0;
  511. /*
  512. //显示出当前的号码存储的是否正确
  513.     Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  514. Send_COM1_Byte(ASCII(gNum_Phone_Temp[0]/10));
  515. Send_COM1_Byte(ASCII(gNum_Phone_Temp[0]%10));
  516. Send_COM1_Byte('<');
  517. for(m=1;m<=gNum_Phone_Temp[0];m++)
  518. {
  519. Send_COM1_Byte(gNum_Phone_Temp[m]);
  520. }
  521. Send_COM1_Byte('>');
  522. Send_COM1_Byte(0x0d); Send_COM1_Byte(0x0a);
  523. */
  524. //现在在缓冲gNum_Phone_Temp[]中存储的是这个的信息的来源号码
  525.     //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  526.     j=j+(i+1)/2*2+22;
  527.     i=ASCIITOHEX(gGeneral_Buffer[j],gGeneral_Buffer[j+1]);//表示数据区数据的长度
  528.     //这个时候,j所指向的是数据区的第一个字节,开始转移
  529.     //存储整个数据区的长度,不包括记录长度的第一个字节
  530.     gGeneral_Buffer[0]=i;
  531. for(k=1;k<=i;k++)
  532. {
  533. gGeneral_Buffer[k]=ASCIITOHEX(gGeneral_Buffer[j+2*k],gGeneral_Buffer[j+2*k+1]);
  534. }
  535. Deal_Command();
  536. }
  537. }
  538. /********************************************************
  539. * 函数名:Do_GPRS_Receive
  540. 作用域:本文件调用
  541. * 功能:
  542. * 参数:  全局变量缓冲gGeneral_Buffer
  543. * 返回值:
  544. * 创建人:
  545. *
  546. * 修改历史:(每条详述)
  547. ********************************************************/
  548. void Do_GPRS_Receive(void)
  549. {
  550. Deal_Command();
  551. }
  552. /********************************************************
  553. * 函数名:Deal_Command
  554. 作用域:本文件调用
  555. * 功能: 通过掉用Check_Command模块,进行下行协议的分析,根据不同的协议命令,
  556. 在这个模块中进行相应的处理和操作,具体见每个不同命令的详细描述
  557. * 参数:  全局变量缓冲gGeneral_Buffer[]
  558. * 返回值:根据不同,需要对一些全局变量重新进行附值操作(详细见不同命令的处理方式)
  559. * 创建人:
  560. *
  561. * 修改历史:(每条详述)
  562.     详细说明:
  563. Deal_Command();模块程序说明:已经通过程序知道了命令字,则需要进行针对不
  564. 同的命令字进行相应的操作
  565. 说明:不管是从GSM还是GPRS接收来的数据最后在运行这个子程序的时候,General_Buffer
  566. 缓冲中存储数据包的格式是一样的,举例:
  567. 0891683108705505F004 0D91683176105507F400 0840907271356100 02 00 41 (0x0d 0x0a)
  568. 08                   0D                                    02
  569. 这是从GSM接收到的数据,最后处理完成的结果General_Buffer缓冲中存储的结果为
  570. gGeneral_Buffer[0]=2   (长度)
  571. gGeneral_Buffer[1]=0
  572. gGeneral_Buffer[2]=41
  573. 同样道理GPRS接收的数据
  574. +MIPRTCP: 1,0,0041
  575. gGeneral_Buffer[0]=2   (长度)
  576. gGeneral_Buffer[1]=0
  577. gGeneral_Buffer[2]=41
  578. ********************************************************/
  579. void Deal_Command(void)
  580. {
  581. unsigned char nCmd;
  582. unsigned char nSpeed=0;
  583. // Send_COM1_Byte('S');
  584. #ifdef Debug_GSM_COM1
  585. Send_COM1_Byte(ASCII(gGeneral_Buffer[0]/16));
  586. Send_COM1_Byte(ASCII(gGeneral_Buffer[0]%16));
  587. Send_COM1_Byte('[');
  588. for(nCmd=1;nCmd<=gGeneral_Buffer[0];nCmd++)
  589. {
  590. if(nCmd==0) break;
  591. Send_COM1_Byte(ASCII(gGeneral_Buffer[nCmd]/16));
  592. Send_COM1_Byte(ASCII(gGeneral_Buffer[nCmd]%16));
  593. Clear_Exter_WatchDog();
  594. }
  595. Send_COM1_Byte(']');
  596. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  597. #endif
  598. nCmd=Check_Command();
  599. //补充说明:根据以前的兼容,则如果在上行的信息中,如果带有经度,纬度的上行数据,则在后面增加4个状态量的字节
  600. switch(nCmd)
  601. {//内容由开发者自己加入
  602. //1,车辆登陆响应(不加状态位)
  603. case VEHICLE_ENTRY_ECHO_DOWN:
  604. {
  605. break;
  606. }
  607. //2,车辆参数设置(不加状态位)
  608. case PARAMETER_SET_DOWN:
  609. {
  610. break;
  611. }
  612. //3,设置上传位置时间间隔 (不加状态位,从新写)
  613. case TIME_INTERVAL_DOWN:
  614. {
  615. break;
  616. }
  617. //4,设置服务器地址,端口 (不加状态位)
  618. case SET_ADDRESS_PORT_DOWN:
  619. {
  620.         break;
  621. }
  622. //5,车辆定位查询 ( 加状态位 )
  623. case  POSITION_ASK_DOWN:
  624. {
  625. break;
  626. }
  627. //6,报警应答(不加状态位)
  628. case ALARM_ECHO_DOWN:
  629. {
  630. break;
  631. }
  632. //7,车辆监听(不加状态位)
  633. case VEHICLE_MONITOR_DOWN:
  634. {
  635. break;
  636. }
  637. //8,外接部件的相关命令(不加状态位)
  638. case EXTER_EQUIPMENT_DOWN:
  639. {
  640. break;
  641. }
  642. //9-0,和显示终端相关的相关的命令(文字信息的处理)(不加状态位)
  643. case WORD_INFORMATION_DOWN:
  644. {
  645. break;
  646. }
  647. //9-1,下载动态菜单
  648. case SET_MENU_DOWN:
  649. {
  650. break;
  651. }
  652. //9-2,下载设定短消息的下行命令
  653. case SET_SMS_COMMAND_DOWN:
  654. {
  655. break;
  656. }
  657. //10,出城登记响应(不加状态位)
  658. case OUTCITY_ECHO_DOWN:
  659. {
  660. break;
  661. }
  662. //11,历史轨迹查询的下行命令(不加状态位),
  663. case TRACK_ASK_DOWN:
  664. {
  665. break;
  666. }
  667. //12,接收下行的设置终端进入/退出状态的命令 (不加状态位)从新写
  668. case SET_TCP_ONOROFF_DOWN:
  669. {
  670. break;
  671. }
  672. //13,车载终端的版本查询 (不加状态位)
  673. case QUERY_VERSION_DOWN:
  674. {
  675. break;
  676. }
  677. //14,车辆允许退出TCP登陆的响应(不加状态位)
  678. case ALLOW_TCP_QUIT_ECHO_DOWN:
  679. {
  680. break;
  681. }
  682. //15,中心提取解除设防密码的下行命令(不加状态位)
  683. case PASSWORD_ASK_DOWN:
  684. {
  685. break;
  686. }
  687. //16,中心强制设防或者解除设防状态的下行命令(不加状态位)
  688. case FORCE_FORTIFY_DOWN:
  689. {
  690. break;
  691. }
  692. //17,中心强制制动的下行命令(不加状态位)
  693. case SET_STOP_COMMAND_DOWN:
  694. {
  695. break;
  696. }
  697. //18,中心强制解除制动的下行命令(不加状态位)
  698. case FREE_STOP_COMMAND_DOWN:
  699. {
  700. break;
  701. }
  702. //19,收到设置最大时速的下行命令
  703. case SET_MAXSPEED_DOWN:
  704. {
  705. break;
  706. }
  707. //20,设置电话的权限的下行命令
  708. case SET_PHONE_LIMIT_DOWN:
  709. {
  710. break;
  711. }
  712. //21,收到重新设置里程初始值的下行命令
  713. case SET_DISTANCE_INIT_DOWN:
  714. {
  715. break;
  716. }
  717. //22,设置中心服务号码
  718. case SET_CENTER_NUM_DOWN:
  719. {
  720. break;
  721. }
  722. //23,设置区域参数的设置
  723. case SET_ALLOW_AREA_DOWM:
  724. {
  725. break;
  726. }
  727. //24,设置间隔距离的参数
  728. case SET_DISTANCE_DATA_DOWN:
  729. {
  730. break;
  731. }
  732. //25,接收到下行的电话号码本的参数
  733. case CARRY_PHONE_NUM_DOWN:
  734. {
  735. break;
  736. }
  737. //26,接收到重点监控的命令
  738. case VEHICLE_WATCH_DOWN:
  739. {
  740. break;
  741. }
  742. //27,接收到线路偏离数据的命令
  743. case LINE_DATA_DOWN:
  744. {
  745. break;
  746. }
  747. //28,接收到线路偏离数据的距离限制值的设置
  748. case LINE_LIMIT_DISTANCE_DOWN:
  749. {
  750. break;
  751. }
  752. //29,收到测试信息的测试SMS
  753. case TEST_SMS_COMMAND_DOWN:
  754. {
  755. break;
  756. }
  757. default:
  758. {
  759. break;
  760. }
  761. }
  762. }
  763. /********************************************************
  764. * 函数名:Check_Command
  765. 作用域:本文件调用
  766. * 功能:  针对全局变量缓冲gGeneral_Buffer[]中的数据进行数据有效果判断,如果有效则返回
  767. 有效数据包中的命令字
  768. * 参数:  需要对全局变量缓冲gGeneral_Buffer[]进行操作
  769. * 返回值:0:无效的数据包
  770. gGeneral_Buffer[2]:数据包有效,返回其中命令字
  771. * 创建人:
  772. *
  773. * 修改历史:(每条详述)
  774. 补充说明: 校验数据包,提取命令字,并判断返回命令字,主要是针对gGeneral_Buffer[]
  775. gGeneral_Buffer[]的具体分布如下:
  776. gGeneral_Buffer[0]表示整个数据包的长度(但不包括这个长度本身这个字节)
  777. gGeneral_Buffer[1]消息头0XFF
  778. gGeneral_Buffer[2]命令字 gGeneral_Buffer[2]命令字的取反
  779. ............
  780. ********************************************************/
  781. unsigned char Check_Command(void)
  782. {
  783. unsigned int i,j,k;
  784. if(gGeneral_Buffer[0]==0) return(0);
  785. if(gGeneral_Buffer[1]!=0xFF) return(0);
  786. if(gGeneral_Buffer[2]!=(char)(~gGeneral_Buffer[3]) ) return(0);
  787. //计算校验核
  788. i=gGeneral_Buffer[4]+1; //数据包长度
  789.     k=0;
  790.     for( j=1;j<=i;j++ ) k=k+gGeneral_Buffer[j]; //计算校验核
  791.     if( k/256!=gGeneral_Buffer[gGeneral_Buffer[4]+2] ) return(0);
  792.     if( k%256!=gGeneral_Buffer[gGeneral_Buffer[4]+3] ) return(0);
  793.     return( gGeneral_Buffer[2] );
  794. }
  795. /********************************************************
  796. * 函数名:IP_SOCKET_Switch
  797. 作用域:本文件调用
  798. * 功能:  这里是将从接收到的参数设置中的IP地址和端口号(long int)型的数据。
  799. IP地址直接是N个ASCII字符,则只需要直接存储在FLASH和buffer1中
  800. SOCKET因为是long int的数值,则需要转换成ASCLL字符的形式表示。这里做个限制
  801. 最多5位数字的ASCII。并存储在Flash 和buffer1中
  802. * 参数:
  803. * 返回值:
  804. * 创建人:
  805. *
  806. * 修改历史:(每条详述)
  807. 补充说明1:
  808. long int变量为IP_Port_Num,将这个变量所表示的数值转换为最多5位的ASCII数字形式
  809. 处理结果是在Flash和buffer1中存储断口数据
  810. 调用这个子程序,是在收到下行的设置服务器地址和端口号以后,处理好数据后,所得到的结果
  811. 先处理IP地址的数据,
  812. 还包括一个长度字节(General_Buffer[0])
  813. 补充说明2: 在运行这个子程序的时候,判断在gGeneral_Buffer[]中的命令字是属于设置服务器地址,端口
  814. gGeneral_Buffer[]的数据结构分布如下:
  815. gGeneral_Buffer[0]表示整个数据包的长度(但不包括这个长度字节本身)
  816. gGeneral_Buffer[1]----gGeneral_Buffer[9]  前面固定的(包括消息头,消息号等等)
  817. gGeneral_Buffer[10]----gGeneral_Buffer[10+N] IP地址的字符串,以0x00作为结束符号(ASCII字符串)
  818. gGeneral_Buffer[10+N+1]----gGeneral_Buffer[10+N+1+4] 为服务器通讯端口号(4个字节,为一个long int型数据)
  819. //处理第二类型GPRS数据的详细步骤
  820. //0x7B----0xB6用来存储针对下行信息的反馈信息(长度不固定)根据协议,此存储空间以60个字节存储
  821. //#define  ECHO_SMS_2 0x7B
  822. //0x7B 存储表示这个区域的SMS是否处理,为1(VAILD_2)则表示后面还有未处理的SMS,为0(NULL_2)则表示已经处理完了SMS
  823. //0x7C 存储数据包的命令字在这里则为nCommand
  824. //0x7D 存储数据包的ACK的值ACK
  825. //0x7E 存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
  826. //0x7F  从这开始存储数据包
  827. 在这个命令中的数据包为从在gGeneral_Buffer[10]开始
  828. ********************************************************/
  829. void IP_SOCKET_Switch(void)
  830. {
  831. unsigned int i,j,k;
  832. unsigned char APN_Length=0;
  833. unsigned char Check_Data=0;
  834. //在gGeneral_Buffer[i]中表示IP地址的第一个数
  835. i=10;
  836. while(1)
  837. {
  838. if(gGeneral_Buffer[i]==0x00) break;
  839. i++;
  840. if(i>gGeneral_Buffer[0])  return;
  841. }
  842. //存储IP地址的长度,不包括长度本身
  843. SRAM_Init();
  844. SRAM_Write(GPRS_IP_ADDRESS1_2,i-10);
  845. //一,+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  846. //1,IP的服务器地址的处理
  847. Check_Data=0;
  848. for(j=10;j<i;j++)
  849. {
  850. SRAM_Write(GPRS_IP_ADDRESS1_2+j-9,gGeneral_Buffer[j]);
  851. Check_Data += gGeneral_Buffer[j];
  852. }
  853. SRAM_Write(GPRS_IP_ADDRESS1_CHECK_2,Check_Data);
  854. //2,将IP地址的SOCKET数据存储在buffer1相应的缓冲区中,因为上面gGeneral_Buffer[i]=0x00
  855. gIP_Port_Num = gGeneral_Buffer[i+1];
  856. gIP_Port_Num<<=8;
  857. gIP_Port_Num += gGeneral_Buffer[i+2];
  858. gIP_Port_Num<<=8;
  859. gIP_Port_Num += gGeneral_Buffer[i+3];
  860. gIP_Port_Num<<=8;
  861. gIP_Port_Num += gGeneral_Buffer[i+4];
  862. //3,将GPRS的APN的内容存储在buffer1中
  863. k=i+5;
  864. while(1)
  865. {
  866. if(gGeneral_Buffer[k]==0x00) break;
  867. k++;
  868. if(k>gGeneral_Buffer[0]) return;
  869. }
  870. //4,存储APN地址的长度,不包括长度本身这个字节的内容
  871. APN_Length=k-i-5;
  872. if( (APN_Length>=4)&&(APN_Length<=25) )
  873. {
  874. SRAM_Write(GPRS_APN_ADDRESS2_2,APN_Length);
  875. //5,存储APN的数据值到相应的BUFFER1中
  876. Check_Data=0;
  877. for(j=i+5;j<k;j++)
  878. {
  879. SRAM_Write(GPRS_APN_ADDRESS2_2+j-i-4,gGeneral_Buffer[j]);
  880. Check_Data += gGeneral_Buffer[j];
  881. }
  882. SRAM_Write(GPRS_APN_END_2,Check_Data);
  883. }
  884. else
  885. {
  886. SRAM_Write(GPRS_APN_ADDRESS2_2,sizeof(APN_DEFAULT));
  887. //5,存储APN的数据值到相应的BUFFER1中
  888. Check_Data=0;
  889. for(i=0;i<sizeof(APN_DEFAULT);i++)
  890. {
  891. SRAM_Write(GPRS_APN_ADDRESS2_2+i+1,APN_DEFAULT[i]);
  892. Check_Data += APN_DEFAULT[i];
  893. }
  894. SRAM_Write(GPRS_APN_END_2,Check_Data);
  895. }
  896. //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  897. //存储作为第2类信息发送的响应数据的存储
  898. //服务器端口设置成功后的响应
  899. SRAM_Write(ECHO_SMS_2,VAILD_2);
  900. SRAM_Write(ECHO_SMS_2+1,ADDRESS_PORT_ECHO_UP);
  901. SRAM_Write(ECHO_SMS_2+2,gGeneral_Buffer[5]);
  902. SRAM_Write(ECHO_SMS_2+3,k-10);
  903. for(j=10;j<k;j++)
  904. {
  905. SRAM_Write(ECHO_SMS_2+4+j-10,gGeneral_Buffer[j]);
  906. }
  907. //因为端口号为一个long int 型的数据,则需要转换为ASCII字符的形式做实际应用
  908. //这里最多能表示5位的端口号,
  909. Check_Data=0;
  910. SRAM_Write(GPRS_SOCKET1_2+0,ASCII(gIP_Port_Num/10000));
  911. Check_Data += ASCII(gIP_Port_Num/10000);
  912. SRAM_Write(GPRS_SOCKET1_2+1,ASCII((gIP_Port_Num%10000)/1000));
  913. Check_Data += ASCII((gIP_Port_Num%10000)/1000);
  914. SRAM_Write(GPRS_SOCKET1_2+2,ASCII((gIP_Port_Num%1000)/100));
  915. Check_Data += ASCII((gIP_Port_Num%1000)/100);
  916. SRAM_Write(GPRS_SOCKET1_2+3,ASCII((gIP_Port_Num%100)/10));
  917. Check_Data +=ASCII((gIP_Port_Num%100)/10);
  918. SRAM_Write(GPRS_SOCKET1_2+4,ASCII(gIP_Port_Num%10));
  919. Check_Data += ASCII(gIP_Port_Num%10);
  920. SRAM_Write(GPRS_SOCKET1_END_2,Check_Data);
  921. gTimer=0;Clear_Exter_WatchDog();
  922. while(gTimer<100){}
  923. Clear_Exter_WatchDog();
  924. //二,++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  925. //注意,这里在程序刚上电的最开始已经检查过了FLASH的第1,第2扇区的数据
  926. //在这里则不需要在继续检查
  927. //读第一个扇区的数据到buffer2中
  928. // OperateSPIEnd();ReadOnePageToBuffer2(FLASH_INFO1_ONE_2);OperateSPIEnd();
  929. Deal_Sector(FLASH_INFO1_ONE_2);
  930. //1,将IP地址数据已经写入相应的buffer2中
  931. i=10;
  932. while(1)
  933. {
  934. if(gGeneral_Buffer[i]==0x00) break;
  935. i++;
  936. if(i>26) return;
  937. }
  938. //1-1,写IP地址数据长度
  939. OperateSPIEnd();
  940. WriteOneByteToBuffer2(GPRS_IP_ADDRESS1_F_2,i-10);
  941. //1-2,写IP地址数据包
  942. for(j=10;j<i;j++)
  943. {
  944. WriteNextByteToBuffer2(gGeneral_Buffer[j]);
  945. }
  946. OperateSPIEnd();
  947. gGeneral_Flag|=TCP_IP_VALID_1;
  948. gStatus2_Flag|=IP_VAILD_F_1;
  949. //2,将SOCKET的数据写入相应的buffer2中
  950. i=i+4;//此时的gGeneral_Buffer[i]=0x00
  951. i++;
  952. OperateSPIEnd();
  953. WriteOneByteToBuffer2(GPRS_SOCKET1_F_2,ASCII(gIP_Port_Num/10000));
  954. WriteNextByteToBuffer2(ASCII((gIP_Port_Num%10000)/1000));
  955. WriteNextByteToBuffer2(ASCII((gIP_Port_Num%1000)/100));
  956. WriteNextByteToBuffer2(ASCII((gIP_Port_Num%100)/10));
  957. WriteNextByteToBuffer2(ASCII(gIP_Port_Num%10));
  958. OperateSPIEnd();
  959. //3,将APN的内容写入相应的buffer2中
  960. OperateSPIEnd();
  961. //3-1,写入APN数据的长度
  962. WriteOneByteToBuffer2(GPRS_APN_DATA_F_2,APN_Length);
  963. //3-2,写APN数据包
  964. for(j=i;j<i+APN_Length;j++)
  965. {
  966. WriteNextByteToBuffer2(gGeneral_Buffer[j]);
  967. }
  968. OperateSPIEnd();
  969. RFlash_Sector(FLASH_INFO1_ONE_2);
  970. Re430_Flash(0);
  971. if(gM22_Status!=GSM_WORK) gOther_Flag|=QUIT_TCP_F_1;
  972. gCheck_Par_Timer=CHECK_SYS_PAR_TIME+1;
  973. Judge_SMS_Way();
  974. }
  975. /********************************************************
  976. * 函数名:Do_Parameter_Set
  977. 作用域:本文件调用
  978. * 功能:  如果在Deal_Command()模块中判断属于处理下行的数据命令字为
  979. 参数设置,则调用这个函数进行处理,收到的参数有
  980. 车型,类别,组别,车号,目标号码1(以0x00结束),目标号码2(备用)(以0x00结束)
  981. 对于上面信息的处理,一是存储在Flash相应的区域,一是存储在buffer1相应的区域
  982. 同时设置参数设置响应的标志(发送第一类的SMS),存储此ACK到gSMS_ACK[]相应的区域
  983. * 参数: 全局变量gGeneral_Buffer[]中的数据
  984. * 返回值:进行和参数相关的设置
  985. * 创建人:
  986. *
  987. * 修改历史:(每条详述)
  988. 补充说明: 在运行这个子程序的时候,判断在gGeneral_Buffer[]中的数据是参数设置,此时
  989. gGeneral_Buffer[]的数据结构分布如下:
  990. gGeneral_Buffer[0]表示整个数据包的长度(但不包括这个长度字节本身)
  991. gGeneral_Buffer[1]----gGeneral_Buffer[9]  前面固定的(包括消息头,消息号等等)
  992. gGeneral_Buffer[10]----gGeneral_Buffer[14]   需要设置的车型,类别,组别,车号
  993. gGeneral_Buffer[15]----gGeneral_Buffer[15+N] 中心的短消息接收号码(以0x00作为结束符)
  994. gGeneral_Buffer[15+N+1]-----gGeneral_Buffer[15+N+M] 中心的短消息接收备用号码 (以0x00作为结束符)
  995. 如果收到参数设置的下行命令,则首先的需要恢复出厂时的设置,将第0个扇区,第1个扇区,第2个扇区里的数据ERASE
  996. 执行条件:只有处于GSM工作方式下才处理
  997. ********************************************************/
  998. void Do_Parameter_Set(void)
  999. {
  1000. //进行参数设置响应(上行数据发送)
  1001. //表示第一类SMS的数据发送:参数设置响应
  1002. //设置发送参数设置响应的标志
  1003. Load_Buffer1_Echo(PARAMETER_SETECHO_UP,gGeneral_Buffer[5]);
  1004. Do_Par();
  1005. }
  1006. /********************************************************
  1007. * 函数名:Position_Echo
  1008. 作用域:本文件调用
  1009. * 功能:  收到下行的需要定位查询的命令,则做相关的处理
  1010. 将此时此刻的效果的经度,纬度,时间信息打成数据包
  1011. 存储在第二类SMS数据的存储区(buffer1的0x7B----0xB6区域)
  1012. 0x7B设置为1(VAILD_2),并将数据包依次存储在后面的字节缓冲中。
  1013. 后面数据包的形式为
  1014. * 参数: 全局变量gGeneral_Buffer[]中的数据
  1015. * 返回值:进行和参数相关的设置
  1016. * 创建人:
  1017. *
  1018. * 修改历史:(每条详述)
  1019. 补充说明:
  1020. 补充说明:具体在buffer1中存储第2类SMS的数据形式如下:0x7B----0xB6(整个分配的区域大小)
  1021.   0x7B 存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,为0则表示已经处理完了SMS
  1022.   0x7C 存储数据包的命令字在这里则为nCommand
  1023.   0x7D 存储数据包的ACK的值ACK
  1024.   0x7E 存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
  1025.   0x7F  从这开始存储数据包
  1026. 数据区的内容:
  1027. LONGTITUDE 4 bytes,无符号整型 经度
  1028. LATITUDE 4 bytes,无符号整型 纬度
  1029. SPEED 1 byte, 无符号整型 速度,单位:米/秒
  1030. AZIMUTH 1 byte, 无符号整型 方位角/15,单位:度
  1031. FLAG 1 byte, 无符号整型 标志
  1032. TIME 6 bytes,字符型 时间(YYMMDDHHMISS)
  1033. ********************************************************/
  1034. void Position_Echo(void)
  1035. {
  1036. unsigned char nCheck=0;
  1037. unsigned int i=0;
  1038. //1,如果中心号码无效果,则进行暂时的返回发送
  1039. if(   ((gGeneral_Flag&NUM1_VAILD_F_1)==0)
  1040. &&(gNum_Phone_Temp[0]<=14) )
  1041. {
  1042. //1,存储目标号码
  1043. SRAM_Init();
  1044. SRAM_Write(TARGET_NUMBER1_2+0,gNum_Phone_Temp[0]);
  1045. for(i=1;i<=gNum_Phone_Temp[0];i++)
  1046. {
  1047. SRAM_Write(TARGET_NUMBER1_2+i,gNum_Phone_Temp[i]);
  1048. nCheck += gNum_Phone_Temp[i];
  1049. }
  1050. SRAM_Write(TARGET_NUMBER1_CHECK_2,nCheck);
  1051. //2,存储车组,车类,车型,车号
  1052. gKind=gGeneral_Buffer[6];
  1053. gGroup=gGeneral_Buffer[7];
  1054. gVID = gGeneral_Buffer[8];
  1055. gVID<<=8;
  1056. gVID += gGeneral_Buffer[9];
  1057. gGeneral_Flag|=NUM1_VAILD_F_1;
  1058. }
  1059. SRAM_Init();
  1060. SRAM_Write(ECHO_SMS_2+0,VAILD_2);
  1061. SRAM_Write(ECHO_SMS_2+1,POSITION_ASKECHO_UP);
  1062. SRAM_Write(ECHO_SMS_2+2,gGeneral_Buffer[5]);
  1063. SRAM_Write(ECHO_SMS_2+3,17+4);
  1064. Write_PartData_Sram(ECHO_SMS_2+3); //17
  1065. SRAM_Write(ECHO_SMS_2+3+18,0);
  1066. SRAM_Write(ECHO_SMS_2+3+19,0);
  1067. SRAM_Write(ECHO_SMS_2+3+20,gStatus2_Flag);
  1068. SRAM_Write(ECHO_SMS_2+3+21,gStatus1_Flag);
  1069. Judge_SMS_Way();
  1070. }
  1071. /********************************************************
  1072. * 函数名:Set_Cycle_Timer
  1073. 作用域:本地文件调用
  1074. * 功能: 收到设置上传位置时间间隔的下行命令后,做一些相关的处理
  1075. 一是附给变量gCycle_GPRS和gCycle_GSM,二是存储在相应的Flash区中
  1076. gCycle_GPRS变量存储的是在GPRS在线的状态下发送行驶状态数据上行信息的时间间隔
  1077. gCycle_GSM变量存储的是在GSM在线的但GPRS不在线的状态下发送行驶状态数据上行信息的时间间隔
  1078. * 参数:  无
  1079. * 返回值:无
  1080. * 创建人:
  1081. *
  1082. * 修改历史:(每条详述)
  1083. ********************************************************/
  1084. void Set_Cycle_Timer(void)
  1085. {
  1086. unsigned int i=0,j=0;
  1087. unsigned char nACK=0;
  1088. nACK=gGeneral_Buffer[5];
  1089. gCycle_TCP = gGeneral_Buffer[1+9];
  1090. gCycle_TCP <<= 8;
  1091. gCycle_TCP += gGeneral_Buffer[1+10];
  1092. gCycle_GSM = gGeneral_Buffer[1+11];
  1093. gCycle_GSM <<= 8;
  1094. gCycle_GSM += gGeneral_Buffer[1+12];
  1095. if( (gCycle_TCP>0)&&(gCycle_TCP<5) ) gCycle_TCP=5;
  1096. if( (gCycle_GSM>0)&&(gCycle_GSM<5) ) gCycle_GSM=5;
  1097. //如果间隔距离符合条件,则将间隔距离设置为0
  1098. if( gCycle_TCP>=5 )
  1099. {
  1100. gCycle_Distance=0;
  1101. }
  1102. gPublic_Flag &=~ SET_DISTANCE_OK_F_1;
  1103. gSet_Distance_Info_Count=WAIT_DISPINFO_TIME-2;
  1104. // OperateSPIEnd();ReadOnePageToBuffer2(FLASH_INFO2_ONE_2);OperateSPIEnd();
  1105. Deal_Sector(FLASH_INFO2_ONE_2);
  1106. WriteOneByteToBuffer2(TCP_TIMER_2,gGeneral_Buffer[1+9]);
  1107. WriteNextByteToBuffer2(gGeneral_Buffer[1+10]);
  1108. WriteNextByteToBuffer2(gGeneral_Buffer[1+11]);
  1109. WriteNextByteToBuffer2(gGeneral_Buffer[1+12]);
  1110. WriteNextByteToBuffer2(0);
  1111. WriteNextByteToBuffer2(0);
  1112. OperateSPIEnd();
  1113. RFlash_Sector(FLASH_INFO2_ONE_2);
  1114. Re430_Flash(1);
  1115. OperateSPIEnd();
  1116. Clear_Exter_WatchDog();
  1117. SRAM_Init();
  1118. SRAM_Write(ECHO_SMS_2+0,VAILD_2);
  1119. SRAM_Write(ECHO_SMS_2+1,TIME_INTERVAL_ECHO_UP);
  1120. SRAM_Write(ECHO_SMS_2+2,nACK);
  1121. SRAM_Write(ECHO_SMS_2+3,21);
  1122. Write_PartData_Sram(ECHO_SMS_2+3); //17
  1123. SRAM_Write(ECHO_SMS_2+3+18,0);
  1124. SRAM_Write(ECHO_SMS_2+3+19,0);
  1125. SRAM_Write(ECHO_SMS_2+3+20,gStatus2_Flag);
  1126. SRAM_Write(ECHO_SMS_2+3+21,gStatus1_Flag);
  1127. Judge_SMS_Way();
  1128. //1,IP地址有效果,并且2,TCP的开关量是否开启
  1129. if( (gGeneral_Flag&TCP_IP_VALID_1)&&((gON_OFF_Temp0&TCP_LAND_ON_OFF_1)==0) )
  1130. {
  1131. if( (gCycle_TCP>0)&&(gCycle_Send_Status!=ALARM_DATA)&&(gCycle_Send_Status!=PASS_DATA) )
  1132. {
  1133. gCycle_Send_Status=TRACK_DATA_TIME;
  1134. }
  1135. else if( (gCycle_TCP==0)&&(gCycle_Send_Status==TRACK_DATA_TIME))
  1136. {
  1137. gCycle_Send_Status=NOP_DATA;
  1138. }
  1139. }
  1140. //1,IP地址无效,或者TCP的开关量关闭
  1141. else
  1142. {
  1143. if( (gCycle_GSM>0)&&(gCycle_Send_Status!=ALARM_DATA)&&(gCycle_Send_Status!=PASS_DATA) )
  1144. {
  1145. gCycle_Send_Status=TRACK_DATA_TIME;
  1146. }
  1147. else if( (gCycle_GSM==0)&&(gCycle_Send_Status==TRACK_DATA_TIME))
  1148. {
  1149. gCycle_Send_Status=NOP_DATA;
  1150. }
  1151. }
  1152. }
  1153. /********************************************************
  1154. * 函数名:Pass_Data_Echo()
  1155. 作用域:本地文件调用
  1156. * 功能: 接收到下行的查询历史轨迹的命令
  1157. 将需要查询的历史轨迹的起始时间附给变量Check_Track_Time_Start
  1158. 将需要查询的历史轨迹的结束时间附给变量Check_Track_Time_end
  1159. 然后设置有需要进行历史轨迹操作的标志位 gInternal_Flag|=PASS_DATA_F_1
  1160. * 参数:  无
  1161. * 返回值:无
  1162. * 创建人:
  1163. *
  1164. * 修改历史:(每条详述)
  1165. 补充说明:这个时候需要处理的gGeneral_Buffer[]缓冲中的数据
  1166. SMS_ACK[TRACK_ASKECHO_ACK]=gGeneral_Buffer[5]   存储ACK
  1167. ********************************************************/
  1168. void Pass_Data_Echo(void)
  1169. {
  1170. unsigned int i=0;
  1171. //存储发送历史轨迹的开始的ACK
  1172. gSMS_ACK[TRACK_ASKECHO_ACK]=gGeneral_Buffer[5];
  1173. //存储计算历史轨迹的开始时间
  1174. gCheck_Track_Time_Start=0;
  1175. gCheck_Track_Time_Start= ( (gGeneral_Buffer[10]%100)/10*16+ (gGeneral_Buffer[10]%10)  );
  1176. gCheck_Track_Time_Start <<= 8;
  1177. gCheck_Track_Time_Start += ( (gGeneral_Buffer[11]%100)/10*16+ (gGeneral_Buffer[11]%10) );
  1178. gCheck_Track_Time_Start <<= 8;
  1179. gCheck_Track_Time_Start += ( (gGeneral_Buffer[12]%100)/10*16+ (gGeneral_Buffer[12]%10) );
  1180. gCheck_Track_Time_Start <<= 8;
  1181. gCheck_Track_Time_Start += ( (gGeneral_Buffer[13]%100)/10*16+ (gGeneral_Buffer[13]%10) );
  1182.     //存储计算历史轨迹的结束时间
  1183.     gCheck_Track_Time_end=0;
  1184. gCheck_Track_Time_end= ( (gGeneral_Buffer[15]%100)/10*16+ (gGeneral_Buffer[15]%10) );
  1185. gCheck_Track_Time_end <<= 8;
  1186. gCheck_Track_Time_end += ( (gGeneral_Buffer[16]%100)/10*16+ (gGeneral_Buffer[16]%10) );
  1187. gCheck_Track_Time_end <<= 8;
  1188. gCheck_Track_Time_end += ( (gGeneral_Buffer[17]%100)/10*16+ (gGeneral_Buffer[17]%10) );
  1189. gCheck_Track_Time_end <<= 8;
  1190. gCheck_Track_Time_end+= ( (gGeneral_Buffer[18]%100)/10*16+ (gGeneral_Buffer[18]%10) );;
  1191. //如果接收到的历史轨迹开始查询时间和结束时间相同,则表示接收到的是结束历史轨迹查询的命令
  1192. if(gCheck_Track_Time_Start==gCheck_Track_Time_end)
  1193. {
  1194. gCycle_Send_Status=NOP_DATA;
  1195. gCircle_Buffer_Point=0;
  1196. for(i=0;i<sizeof(gCircle_Buffer);i++) gCircle_Buffer[i]=0;
  1197. gOther_Flag&=~FIND_PASSPAGE_F_1;gOther_Flag&=~FIRST_PASSPAGE_F_1;gOther_Flag&=~SEND_PASSPAGE_F_1;
  1198. gOther_Flag&=~PASS_DATA_LASE_F_1;
  1199. gOther_Flag&=~SEND_PASSPAGE_F_1;
  1200. //设置发送历史轨迹结束的标志
  1201. Load_Buffer1_Echo(TRACK_ENDECHO_UP,gGeneral_Buffer[5]);
  1202. Send_COM1_String( (unsigned char *)PASS_END,sizeof(PASS_END) );
  1203. return;
  1204. }
  1205. if (gCycle_Send_Status!=ALARM_DATA )
  1206. {
  1207. gCycle_Send_Status=PASS_DATA;gOther_Flag|=FIND_PASSPAGE_F_1;
  1208. gOther_Flag&=~FIRST_PASSPAGE_F_1;gOther_Flag&=~SEND_PASSPAGE_F_1;
  1209. if(gPassTrack_Store_Sector==FLASH_PASTDATA_E_2-1)
  1210. {
  1211. gPassPage_First=FLASH_PASTDATA_S_2;
  1212. gPassPage_End=FLASH_PASTDATA_E_2-1;
  1213. }
  1214. else if(gPassTrack_Store_Sector>=FLASH_PASTDATA_E_2)
  1215. {
  1216. gPassPage_First=FLASH_PASTDATA_S_2+1;
  1217. gPassPage_End=FLASH_PASTDATA_E_2;
  1218. }
  1219. else
  1220. {
  1221. gPassPage_First=gPassTrack_Store_Sector+2;
  1222. gPassPage_End=FLASH_PASTDATA_E_2;
  1223. }
  1224. }
  1225. #ifdef Debug_GSM_COM1
  1226. Send_COM1_String( (unsigned char *)TIME_START,sizeof(TIME_START) );
  1227. Send_COM1_Byte('[');
  1228.     Send_COM1_Byte(ASCII(gCheck_Track_Time_Start/0x10000000));
  1229.     Send_COM1_Byte(ASCII((gCheck_Track_Time_Start%0x10000000)/0x1000000));
  1230.     Send_COM1_Byte(ASCII((gCheck_Track_Time_Start%0x1000000)/0x100000));
  1231.     Send_COM1_Byte(ASCII((gCheck_Track_Time_Start%0x100000)/0x10000));
  1232.     Send_COM1_Byte(ASCII((gCheck_Track_Time_Start%0x10000)/0x1000));
  1233.     Send_COM1_Byte(ASCII((gCheck_Track_Time_Start%0x1000)/0x100));
  1234.     Send_COM1_Byte(ASCII((gCheck_Track_Time_Start%0x100)/0x10));
  1235. Send_COM1_Byte(ASCII(gCheck_Track_Time_Start%0x10));
  1236. Send_COM1_Byte(']');
  1237. Send_COM1_String( (unsigned char *)TIME_END,sizeof(TIME_END) );
  1238. Send_COM1_Byte('[');
  1239.     Send_COM1_Byte(ASCII(gCheck_Track_Time_end/0x10000000));
  1240.     Send_COM1_Byte(ASCII((gCheck_Track_Time_end%0x10000000)/0x1000000));
  1241.     Send_COM1_Byte(ASCII((gCheck_Track_Time_end%0x1000000)/0x100000));
  1242.     Send_COM1_Byte(ASCII((gCheck_Track_Time_end%0x100000)/0x10000));
  1243.     Send_COM1_Byte(ASCII((gCheck_Track_Time_end%0x10000)/0x1000));
  1244.     Send_COM1_Byte(ASCII((gCheck_Track_Time_end%0x1000)/0x100));
  1245.     Send_COM1_Byte(ASCII((gCheck_Track_Time_end%0x100)/0x10));
  1246. Send_COM1_Byte(ASCII(gCheck_Track_Time_end%0x10));
  1247. Send_COM1_Byte(']');
  1248. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1249. Send_COM1_String( (unsigned char *)PAGE_S,sizeof(PAGE_S) );
  1250. Send_COM1_Byte('[');
  1251.     Send_COM1_Byte(ASCII(gPassPage_First/1000));
  1252.     Send_COM1_Byte(ASCII((gPassPage_First%1000)/100));
  1253.     Send_COM1_Byte(ASCII(((gPassPage_First%1000)%100)/10));
  1254. Send_COM1_Byte(ASCII(gPassPage_First%10));
  1255. Send_COM1_Byte(']');
  1256. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1257. Send_COM1_String( (unsigned char *)PAGE_E,sizeof(PAGE_E) );
  1258. Send_COM1_Byte('[');
  1259.     Send_COM1_Byte(ASCII(gPassPage_End/1000));
  1260.     Send_COM1_Byte(ASCII((gPassPage_End%1000)/100));
  1261.     Send_COM1_Byte(ASCII(((gPassPage_End%1000)%100)/10));
  1262. Send_COM1_Byte(ASCII(gPassPage_End%10));
  1263. Send_COM1_Byte(']');
  1264. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1265. #endif
  1266. Judge_SMS_Way();
  1267. }
  1268. /********************************************************
  1269. * 函数名:Disp_Dispaly_Info();
  1270. 作用域:本地文件调用
  1271. * 功能:
  1272. * 参数:  无
  1273. * 返回值:无
  1274. * 创建人:
  1275. *
  1276. * 修改历史:(每条详述)
  1277. ********************************************************/
  1278. void Disp_Dispaly_Info(void)
  1279. {
  1280.     unsigned int i=0;
  1281. if(gDisp_Buffer_Point+gGeneral_Buffer[0]+2+6<=sizeof(gDisp_Buffer))
  1282. {
  1283.     gDisp_Buffer[gDisp_Buffer_Point]=gGeneral_Buffer[0]+2+6;
  1284.     gDisp_Buffer_Point++;
  1285.     gDisp_Buffer[gDisp_Buffer_Point]=0;
  1286.     gDisp_Buffer_Point++;
  1287.     gDisp_Buffer[gDisp_Buffer_Point]='@';
  1288.     gDisp_Buffer_Point++;
  1289.     gDisp_Buffer[gDisp_Buffer_Point]='%';
  1290.     gDisp_Buffer_Point++;
  1291.     gDisp_Buffer[gDisp_Buffer_Point]=gGeneral_Buffer[0]+2+4;
  1292.     gDisp_Buffer_Point++;
  1293.     gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_WORD_DOWN;
  1294.     gDisp_Buffer_Point++;
  1295.     //从0xFF开始存储数据(转移整个中心的数据包)
  1296.     Copy_String(gGeneral_Buffer+1,gDisp_Buffer+gDisp_Buffer_Point,gGeneral_Buffer[0]);
  1297.     gDisp_Buffer_Point=gDisp_Buffer_Point+gGeneral_Buffer[0];
  1298.     gDisp_Buffer[gDisp_Buffer_Point]='$';
  1299.     gDisp_Buffer_Point++;
  1300.     gDisp_Buffer[gDisp_Buffer_Point]='&';
  1301.     gDisp_Buffer_Point++;
  1302. }
  1303. //下面是显示调试信息
  1304. /*
  1305. #ifdef Debug_GSM_COM1
  1306. Send_COM1_Byte(ASCII(gDisp_Buffer[0]/16));
  1307. Send_COM1_Byte(ASCII(gDisp_Buffer[0]%16));
  1308. Send_COM1_Byte('=');
  1309. Send_COM1_Byte(ASCII(gDisp_Buffer_Point/16));
  1310. Send_COM1_Byte(ASCII(gDisp_Buffer_Point%16));
  1311. Send_COM1_Byte('{');
  1312. for(i=0;i<gDisp_Buffer[0];i++)
  1313. {
  1314. Send_COM1_Byte(ASCII(gDisp_Buffer[i]/16));
  1315. Send_COM1_Byte(ASCII(gDisp_Buffer[i]%16));
  1316. }
  1317. Send_COM1_Byte('}');
  1318. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1319. #endif
  1320. */
  1321. }
  1322. /********************************************************
  1323. * 函数名:Set_TCP_OnOrOff();
  1324. 作用域:本地文件调用
  1325. * 功能:
  1326. * 参数:  无
  1327. * 返回值:无
  1328. * 创建人:
  1329. *
  1330. * 修改历史:(每条详述)
  1331. 补充说明:接收到下行的是设置进入/退出联网状态的命令,
  1332. 需要进行如下几个操作,存储需要响应的ACK
  1333. 1,改变进入TCP的开关量,并存储扇区0
  1334. 2,写入B类数据区此命令的回应上行命令
  1335. ********************************************************/
  1336. void Set_TCP_OnOrOff(void)
  1337. {
  1338. unsigned int i=0,j=0;
  1339. SRAM_Init();
  1340. SRAM_Write(ECHO_SMS_2+0,VAILD_2);
  1341. SRAM_Write(ECHO_SMS_2+1,SET_TCP_ONOROFF_ECHO_UP);
  1342. SRAM_Write(ECHO_SMS_2+2,gGeneral_Buffer[5]);
  1343. SRAM_Write(ECHO_SMS_2+3,1);
  1344. SRAM_Write(ECHO_SMS_2+4,gGeneral_Buffer[10]);
  1345. Judge_SMS_Way();
  1346. }
  1347. /********************************************************
  1348. * 函数名:Query_SYS_Ver();
  1349. 作用域:本地文件调用
  1350. * 功能:
  1351. * 参数:  无
  1352. * 返回值:无
  1353. * 创建人:
  1354. *
  1355. * 修改历史:(每条详述)
  1356. ********************************************************/
  1357. void Query_SYS_Ver(void)
  1358. {
  1359. unsigned int i=0;
  1360. SRAM_Init();
  1361. SRAM_Write(ECHO_SMS_2+0,VAILD_2);
  1362. SRAM_Write(ECHO_SMS_2+1,QUERY_VERSION_ECHO_UP);
  1363. SRAM_Write(ECHO_SMS_2+2,gGeneral_Buffer[5]);
  1364. SRAM_Write(ECHO_SMS_2+3,14);
  1365. SRAM_Write(ECHO_SMS_2+4,SYS_EDITION[0]);
  1366. SRAM_Write(ECHO_SMS_2+5,SYS_EDITION[1]);
  1367. for(i=0;i<6;i++)
  1368. {
  1369. SRAM_Write(ECHO_SMS_2+6+i,SYS_TIME[i]);
  1370. }
  1371. for(i=0;i<6;i++)
  1372. {
  1373. SRAM_Write(ECHO_SMS_2+12+i,SYS_UPDATATIME[i]);
  1374. }
  1375. Judge_SMS_Way();
  1376. }
  1377. /********************************************************
  1378. * 函数名:Deal_Alarm_Echo();
  1379. 作用域:本地文件调用
  1380. * 功能:
  1381. * 参数:  无
  1382. * 返回值:无
  1383. * 创建人:
  1384. *
  1385. * 修改历史:(每条详述)
  1386. ********************************************************/
  1387. void Deal_Alarm_Echo(void)
  1388. {
  1389. unsigned int i=0,j=0;
  1390. gSMS_ACK[ALARM_ACK]=gGeneral_Buffer[5];
  1391. gCycle_Alarm = gGeneral_Buffer[10];
  1392. gCycle_Alarm <<= 8;
  1393. gCycle_Alarm += gGeneral_Buffer[11];
  1394. if( gCycle_Alarm == 0)
  1395. {
  1396. gAlarm_Type=NOP_ALARM;
  1397. gCycle_Send_Status=NOP_DATA;
  1398. gAlarm_Count=0;
  1399. gStatus2_Flag&=~ROB_ALARM_F_1;
  1400. Load_Buffer1_Echo(ALARM_END_UP,gGeneral_Buffer[5]);
  1401. }
  1402. else if( gCycle_Alarm <= 5 ) gCycle_Alarm=5;
  1403. }
  1404. /********************************************************
  1405. * 函数名:Deal_Vehicle_Monitor();
  1406. 作用域:本地文件调用
  1407. * 功能:
  1408. * 参数:  无
  1409. * 返回值:无
  1410. * 创建人:
  1411. *
  1412. * 修改历史:(每条详述)
  1413. ********************************************************/
  1414. void Deal_Vehicle_Monitor(void)
  1415. {
  1416. unsigned int i=0,j=0;
  1417. i=10;j=0;
  1418. while(gGeneral_Buffer[i]!=0x00)
  1419. {
  1420. i++;j++;if(j>16) {j=0;break;}
  1421. }
  1422. //接收到下行的监听信令。
  1423. if(j>4)
  1424. {
  1425. SRAM_Init();
  1426. SRAM_Write(PHONE_AT_2+0,VAILD_2);
  1427. SRAM_Write(PHONE_AT_2+1,M_DIAL);
  1428. SRAM_Write(PHONE_AT_2+2,j);
  1429. for(i=0;i<j;i++)
  1430. {
  1431. SRAM_Write(PHONE_AT_2+3+i,gGeneral_Buffer[i+10]);
  1432. }
  1433. }
  1434. }
  1435. /********************************************************
  1436. * 函数名:Defence_Password_Ask_Echo();
  1437. 作用域:本地文件调用
  1438. * 功能:
  1439. * 参数:  无
  1440. * 返回值:无
  1441. * 创建人:
  1442. *
  1443. * 修改历史:(每条详述)
  1444. ********************************************************/
  1445. void Defence_Password_Ask_Echo(void)
  1446. {
  1447. unsigned int i=0;
  1448. unsigned char OldPassWord_Length=0;
  1449. //读取FLASH相应存储密码区域的密码信息,将密码暂时存储在gGeneral_Buffer[]中
  1450. OperateSPIEnd();
  1451. ReadOnePageToBuffer2(FLASH_INFO1_ONE_2);
  1452. OperateSPIEnd();
  1453. gGeneral_Buffer[0]=ReadByteFromBuffer2(PASSWORD1_F_2);
  1454. for(i=1;i<6;i++)
  1455. {
  1456. gGeneral_Buffer[i]=ReadNextFromBuffer2();
  1457. }
  1458. OperateSPIEnd();
  1459. //调试显示出读出的密码是否正确
  1460. #ifdef Debug_GSM_COM1
  1461. Send_COM1_Byte('P');Send_COM1_Byte('[');
  1462. for(i=0;i<6;i++) Send_COM1_Byte(gGeneral_Buffer[i]);
  1463. Send_COM1_Byte(']');Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1464. #endif
  1465. //读出的密码存储在gGeneral_Buffer[0]---gGeneral_Buffer[5]
  1466. for(i=0;i<6;i++)
  1467. {
  1468. if( (gGeneral_Buffer[i]<'0')||(gGeneral_Buffer[i]>'9') ) break;
  1469. }
  1470. //知道密码的长度
  1471. OldPassWord_Length=i;
  1472. //调试显示密码的数据
  1473. #ifdef Debug_GSM_COM1
  1474. Send_COM1_Byte(ASCII(OldPassWord_Length/10));
  1475. Send_COM1_Byte(ASCII(OldPassWord_Length%10));
  1476. Send_COM1_Byte('[');
  1477. for(i=0;i<OldPassWord_Length;i++) Send_COM1_Byte(gGeneral_Buffer[i]);
  1478. Send_COM1_Byte(']');Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1479. #endif
  1480. SRAM_Init();
  1481. SRAM_Write(OTHER_SMS_2+0,VAILD_2);
  1482. SRAM_Write(OTHER_SMS_2+1,PASSWORD_ASKECHO_UP);
  1483. SRAM_Write(OTHER_SMS_2+2,gGeneral_Buffer[5]);
  1484. SRAM_Write(OTHER_SMS_2+3,OldPassWord_Length+1);
  1485. for(i=0;i<OldPassWord_Length;i++)
  1486. {
  1487. SRAM_Write(OTHER_SMS_2+4+i,gGeneral_Buffer[i]);
  1488. }
  1489. SRAM_Write(OTHER_SMS_2+4+OldPassWord_Length,0x00);
  1490. Judge_SMS_Way();
  1491. }
  1492. /********************************************************
  1493. * 函数名:Set_Phone_Limit();
  1494. 作用域:本地文件调用
  1495. * 功能:
  1496. * 参数:  无
  1497. * 返回值:无
  1498. * 创建人:
  1499. *
  1500. * 修改历史:(每条详述)
  1501. ********************************************************/
  1502. void Set_Phone_Limit(void)
  1503. {
  1504. unsigned char nACK=0;
  1505. nACK=gGeneral_Buffer[5];
  1506. //1,接收判断
  1507. //判断电话呼入限制的功能
  1508. if(gGeneral_Buffer[10]==0)
  1509. {
  1510. //电话呼入禁止
  1511. gON_OFF_Temp0&=~PHONE_IN_ON;
  1512. gStatus2_Flag|=HANDLE_PHONE_IN_LIMIT;
  1513. }
  1514. else if(gGeneral_Buffer[10]==0xFF)
  1515. {
  1516. //电话呼出允许
  1517. gON_OFF_Temp0|=PHONE_IN_ON;
  1518. gStatus2_Flag&=~HANDLE_PHONE_IN_LIMIT;
  1519. }
  1520. //判断电话呼出限制的功能
  1521. if(gGeneral_Buffer[11]==0)
  1522. {
  1523. //电话呼出禁止
  1524. gON_OFF_Temp0&=~PHONE_OUT_ON;
  1525. gStatus2_Flag|=HANDLE_PHONE_OUT_LIMIT;
  1526. }
  1527. else if(gGeneral_Buffer[11]==0xFF)
  1528. {
  1529. //电话呼出允许
  1530. gON_OFF_Temp0|=PHONE_OUT_ON;
  1531. gStatus2_Flag&=~HANDLE_PHONE_OUT_LIMIT;
  1532. }
  1533. //2,处理后的状态存储
  1534. //根据状态的改变,则需要重新更新扇区5中的数据,并重新计算校验核,写入扇区
  1535. // OperateSPIEnd();ReadOnePageToBuffer2(FLASH_INFO2_ONE_2);OperateSPIEnd();
  1536. Deal_Sector(FLASH_INFO2_ONE_2);
  1537. WriteOneByteToBuffer2(ON_OFF_V1_2,gON_OFF_Temp0);
  1538. OperateSPIEnd();
  1539. RFlash_Sector(FLASH_INFO2_ONE_2);
  1540. Re430_Flash(1);
  1541. //3,处理完后的响应
  1542. //下面是处理需要发送接收到终端进入/退出联网状态的响应
  1543. SRAM_Init();
  1544. SRAM_Write(ECHO_SMS_2+0,VAILD_2);
  1545. SRAM_Write(ECHO_SMS_2+1,SET_PHONE_LIMIT_ECHO_UP);
  1546. SRAM_Write(ECHO_SMS_2+2,nACK);
  1547. SRAM_Write(ECHO_SMS_2+3,2);
  1548. SRAM_Write(ECHO_SMS_2+4,gGeneral_Buffer[10]);
  1549. SRAM_Write(ECHO_SMS_2+5,gGeneral_Buffer[11]);
  1550. gGeneral_Flag&=~LAND_TCP_ERROR_F_1;
  1551. Judge_SMS_Way();
  1552. }
  1553. /********************************************************
  1554. * 函数名:Set_Center_Num();
  1555. 作用域:本地文件调用
  1556. * 功能:
  1557. * 参数:  无
  1558. * 返回值:无
  1559. * 创建人:
  1560. *
  1561. * 修改历史:(每条详述)
  1562. ********************************************************/
  1563. void Set_Center_Num(void)
  1564. {
  1565. unsigned int i=0,j=0,k=0;
  1566. unsigned char cNum1,cNum2,cNum3;
  1567. //先读出Flash相应的第5个扇区的数据到buffer2中
  1568. OperateSPIEnd();ReadOnePageToBuffer2(FLASH_INFO2_ONE_2);OperateSPIEnd();
  1569. //1,处理接收中心服务号码
  1570. //========================================
  1571. i=1+9;
  1572. while(1)
  1573. {
  1574. if(gGeneral_Buffer[i]==0x00) break;
  1575. i++;
  1576. if(i>1+9+15) return;
  1577. //这里的15表示目标号码1不会超过15个数
  1578. }
  1579. cNum1=i-(1+9);
  1580. //如果中心服务号码的长度没有超过15,则目标号码有效
  1581. if( (i<=1+9+15)&&(cNum1>0) )
  1582. {
  1583. //计算出此中心服务的号码长度并写入buffer2中相应的位置
  1584. OperateSPIEnd();
  1585. WriteOneByteToBuffer2(CENTER_NUM_F_2,cNum1);
  1586. for(j=1+9;j<i;j++)
  1587. {
  1588. WriteNextByteToBuffer2(gGeneral_Buffer[j]);
  1589. }
  1590. OperateSPIEnd();
  1591. }
  1592. OperateSPIEnd();
  1593. //2,处理接收报警电话号码
  1594. //========================================
  1595. j=i+1;
  1596. while(1)
  1597. {
  1598. if(gGeneral_Buffer[j]==0x00) break;
  1599. j++;
  1600. if(j>1+i+15) return;
  1601. }
  1602. cNum2=j-i;
  1603. if( (j<=1+i+15)&&(cNum2>0) )
  1604. {
  1605. //计算出此报警号码的号码长度并写入buffer2
  1606. OperateSPIEnd();
  1607. WriteOneByteToBuffer2(ARALM_NUM_2,cNum2);
  1608. for(k=i+1;k<j;k++)
  1609. {
  1610. WriteNextByteToBuffer2(gGeneral_Buffer[k]);
  1611. }
  1612. OperateSPIEnd();
  1613. }
  1614. OperateSPIEnd();
  1615. //3,处理接收监听电话号码
  1616. //========================================
  1617. k=j+1;
  1618. while(1)
  1619. {
  1620. if(gGeneral_Buffer[k]==0x00) break;
  1621. k++;if(k>1+j+15) return;
  1622. }
  1623. cNum3=k-j;
  1624. if( (k<=j+1+15)&&(cNum3>0) )
  1625. {
  1626. }
  1627. //4,预留电话号码
  1628. //========================================
  1629. //5,将更新的设置重新写入相应的Flash
  1630. OperateSPIEnd();
  1631. RFlash_Sector(FLASH_INFO2_ONE_2);
  1632. Re430_Flash(1);
  1633. //6,接收处理完毕,则发送设置响应
  1634. //========================================
  1635. SRAM_Init();
  1636. SRAM_Write(ECHO_SMS_2+0,VAILD_2);
  1637. SRAM_Write(ECHO_SMS_2+1,CENTER_NUMECHO_UP);
  1638. SRAM_Write(ECHO_SMS_2+2,gGeneral_Buffer[5]);
  1639. SRAM_Write(ECHO_SMS_2+3,21);
  1640. Write_PartData_Sram(ECHO_SMS_2+3);
  1641. SRAM_Write(ECHO_SMS_2+3+18,0);
  1642. SRAM_Write(ECHO_SMS_2+3+19,gStatus3_Flag);
  1643. SRAM_Write(ECHO_SMS_2+3+20,gStatus2_Flag);
  1644. SRAM_Write(ECHO_SMS_2+3+21,gStatus1_Flag);
  1645. Judge_SMS_Way();
  1646. }
  1647. /********************************************************
  1648. * 函数名:Set_Area_Limit();
  1649. 作用域:本地文件调用
  1650. * 功能:
  1651. * 参数:  无
  1652. * 返回值:无
  1653. * 创建人:
  1654. * 修改历史:(每条详述)
  1655. 此程序的处理是将响应的区域参数存储在外部SRAM中,和buffer2中。并计算gArea_Par的值
  1656. ********************************************************/
  1657. void Set_Area_Limit(void)
  1658. {
  1659. unsigned int  i=0;
  1660. unsigned char Buffer2_Temp=0;
  1661. gArea_Par=0;
  1662. //1,存储外部的FLASH中。
  1663. OperateSPIEnd();ReadOnePageToBuffer2(FLASH_AREA_ONE_2);OperateSPIEnd();
  1664. WriteOneByteToBuffer2(FAREA1_LON_1_2,gGeneral_Buffer[1+9]);
  1665. for(i=1;i<68;i++)
  1666. {
  1667. WriteNextByteToBuffer2(gGeneral_Buffer[1+9+i]);
  1668. }
  1669. OperateSPIEnd();
  1670. RFlash_Sector(FLASH_AREA_ONE_2);
  1671. //3,存储外部的SRAM中的相应位置
  1672. SRAM_Init();
  1673. SRAM_Write( SAREA_DATA_FS,0x55); //存储区域的有效标志
  1674. for(i=0;i<68;i++)
  1675. {
  1676. SRAM_Write( (SAREA1_LON_1_2+i),gGeneral_Buffer[1+9+i]);
  1677. }
  1678. SRAM_Write( SAREA_DATA_FE,0xAA);
  1679. //4,显示当前区域的参数
  1680. gArea_Par=0;
  1681. SRAM_Init();
  1682. Buffer2_Temp=SRAM_Read(SAREA1_PAR_2);
  1683. if( Buffer2_Temp==0x55) {gArea_Par|=AREA1_ON;}
  1684. else if(Buffer2_Temp==0xAA) {gArea_Par|=AREA1_ON;gArea_Par|=AREA1_DIR;}
  1685. Buffer2_Temp=SRAM_Read(SAREA2_PAR_2);
  1686. if( Buffer2_Temp==0x55) {gArea_Par|=AREA2_ON;}
  1687. else if(Buffer2_Temp==0xAA) {gArea_Par|=AREA2_ON;gArea_Par|=AREA2_DIR;}
  1688. Buffer2_Temp=SRAM_Read(SAREA3_PAR_2);
  1689. if( Buffer2_Temp==0x55) {gArea_Par|=AREA3_ON;}
  1690. else if(Buffer2_Temp==0xAA) {gArea_Par|=AREA3_ON;gArea_Par|=AREA3_DIR;}
  1691. Buffer2_Temp=SRAM_Read(SAREA4_PAR_2);
  1692. if( Buffer2_Temp==0x55) {gArea_Par|=AREA4_ON;}
  1693. else if(Buffer2_Temp==0xAA) {gArea_Par|=AREA4_ON;gArea_Par|=AREA4_DIR;}
  1694. //4,接收到区域参数的响应
  1695. Load_Buffer1_Echo(ALLOW_AREA_ECHO_UP,gGeneral_Buffer[5]);
  1696. if(gArea_Par!=0) gStatus2_Flag|=AREA_VAILD_F_1;
  1697. else gStatus2_Flag&=~AREA_VAILD_F_1;
  1698. }
  1699. /********************************************************
  1700. * 函数名:Send_RecordData();
  1701. 作用域:本地文件调用
  1702. * 功能:
  1703. * 参数:  无
  1704. * 返回值:无
  1705. * 创建人:
  1706. * 修改历史:(每条详述)
  1707. 补充说明:将外部数据从新组包,发送给记录仪,然后等待回音
  1708. ********************************************************/
  1709. void Send_RecordData(void)
  1710. {
  1711.     unsigned int i=0;
  1712. gSMS_ACK[RECORD_EQUIPMENT_ACK]=gGeneral_Buffer[5];
  1713. for(i=11;i<=gGeneral_Buffer[0]-3;i++)
  1714. {
  1715. Send_COM1_Byte(gGeneral_Buffer[i]);
  1716. }
  1717. /*
  1718. #ifdef Debug_GSM_COM1
  1719. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1720. for(i=11;i<=gGeneral_Buffer[0]-3;i++)
  1721. {
  1722. Send_COM1_Byte(ASCII(gGeneral_Buffer[i]/0x10));
  1723. Send_COM1_Byte(ASCII(gGeneral_Buffer[i]%0x10));
  1724. }
  1725. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1726. #endif
  1727. */
  1728. }
  1729. /********************************************************
  1730. * 函数名:Set_Distance_Par();
  1731. 作用域:本地文件调用
  1732. * 功能:
  1733. * 参数:  无
  1734. * 返回值:无
  1735. * 创建人:
  1736. * 修改历史:(每条详述)
  1737. ********************************************************/
  1738. void Set_Distance_Par(void)
  1739. {
  1740. gCycle_Distance = gGeneral_Buffer[1+9];
  1741. gCycle_Distance <<= 8;
  1742. gCycle_Distance += gGeneral_Buffer[1+10];
  1743. if(gGeneral_Buffer[1+11]==1)
  1744. {
  1745. gON_OFF_Temp1 &=~ DISTANCE_TCP_ON_1;
  1746. gStatus3_Flag |= DISTANCE_ON_F_1;
  1747. }
  1748. else if(gGeneral_Buffer[1+11]==0)
  1749. {
  1750. gON_OFF_Temp1 |= DISTANCE_TCP_ON_1;
  1751. gStatus3_Flag &=~ DISTANCE_ON_F_1;
  1752. }
  1753. gCycle_TCP=0;
  1754. gCycle_GSM=0;
  1755. gCycle_Send_Status = NOP_DATA;
  1756. Load_Buffer1_Echo(SET_DISTANCE_DATA_UP,gGeneral_Buffer[5]);
  1757. //根据状态的改变,则需要重新更新扇区0中的数据,并重新计算校验核,写入扇区
  1758. //OperateSPIEnd();ReadOnePageToBuffer2(FLASH_INFO2_ONE_2);OperateSPIEnd();
  1759. Deal_Sector(FLASH_INFO2_ONE_2);
  1760. WriteOneByteToBuffer2(ON_OFF_V2_2,gON_OFF_Temp1);
  1761. OperateSPIEnd();
  1762. WriteOneByteToBuffer2(TCP_TIMER_2,0);
  1763. WriteNextByteToBuffer2(0);
  1764. WriteNextByteToBuffer2(0);
  1765. WriteNextByteToBuffer2(0);
  1766. WriteNextByteToBuffer2(gGeneral_Buffer[1+9]);
  1767. WriteNextByteToBuffer2(gGeneral_Buffer[1+10]);
  1768. OperateSPIEnd();
  1769. RFlash_Sector(FLASH_INFO2_ONE_2);
  1770. Re430_Flash(1);
  1771. gPublic_Flag &=~ SET_DISTANCE_OK_F_1;
  1772. gSet_Distance_Info_Count=WAIT_DISPINFO_TIME-2;
  1773. }
  1774. /********************************************************
  1775. * 函数名:Set_Phone_Num();
  1776. 作用域:本地文件调用
  1777. * 功能:
  1778. * 参数:  无
  1779. * 返回值:无
  1780. * 创建人:
  1781. * 修改历史:(每条详述)
  1782. 电话号码本的存储,固定2个扇区,每个扇区存储10个电话本
  1783. 一个电话本固定23个字节的长度,8(姓名)+13(电话号码)
  1784. 扇区的0xFF处,存储当前页的号码个数,如果值为0,则需要另外存储一个扇区页
  1785. ********************************************************/
  1786. void Set_Phone_Num(void)
  1787. {
  1788. Do_Phone_Note();
  1789. //存储作为第2类信息发送的响应数据的存储
  1790. //服务器端口设置成功后的响应
  1791. SRAM_Init();
  1792. SRAM_Write(ECHO_SMS_2+0,VAILD_2);
  1793. SRAM_Write(ECHO_SMS_2+1,ASK_PHONE_NUMECHO_UP);
  1794. SRAM_Write(ECHO_SMS_2+2,gGeneral_Buffer[5]);
  1795. SRAM_Write(ECHO_SMS_2+3,2);
  1796. SRAM_Write(ECHO_SMS_2+4,gGeneral_Buffer[1+9]);
  1797. SRAM_Write(ECHO_SMS_2+5,gGeneral_Buffer[1+10]);
  1798. Judge_SMS_Way();
  1799. }
  1800. /********************************************************
  1801. * 函数名:Watch_Way();
  1802. 作用域:本地文件调用
  1803. * 功能:
  1804. * 参数:  无
  1805. * 返回值:无
  1806. * 创建人:
  1807. * 修改历史:(每条详述)
  1808. ********************************************************/
  1809. void Watch_Way(void)
  1810. {
  1811. unsigned int i=0;
  1812. gWatch_Circle = gGeneral_Buffer[1+9];
  1813. gWatch_Circle <<= 8;
  1814. gWatch_Circle += gGeneral_Buffer[1+10];
  1815. gWatch_Time = gGeneral_Buffer[1+11];
  1816. gWatch_Time <<= 8;
  1817. gWatch_Time += gGeneral_Buffer[1+12];
  1818. gWatch_Count = gGeneral_Buffer[1+13];
  1819. gWatch_Count <<= 8;
  1820. gWatch_Count += gGeneral_Buffer[1+14];
  1821. if(gWatch_Circle==0)
  1822. {
  1823. if(gCycle_Send_Status==WATCH_DATA) gCycle_Send_Status=NOP_DATA;
  1824. gWatch_Count=0;gWatch_Time=0;
  1825. gWatch_Type=WATCH_TYPE_NULL;
  1826. Load_Buffer1_Echo(ASK_FREEWATCH_UP,gGeneral_Buffer[5]);
  1827. }
  1828. else
  1829. {
  1830. if(   (gCycle_Send_Status==TRACK_DATA_TIME)
  1831. ||(gCycle_Send_Status==TRACK_DATA_DISTANCE)
  1832. ||(gCycle_Send_Status==NOP_DATA)  )
  1833. {
  1834. gCycle_Send_Status=WATCH_DATA;
  1835. gPublic_Flag&=~ACCOFF_OK_F_1;
  1836. gPublic_Flag&=~ACC_OFF_UP_F_1;
  1837. gPublic_Flag&=~ACCOFF_TRACK_F_1;
  1838. ACC_OFF_Timer=0;
  1839. if(gWatch_Time!=0)
  1840. {
  1841. gWatch_Count=0;
  1842. gWatch_Type=WATCH_TYPE_TIME;
  1843. }
  1844. else
  1845. {
  1846. if(gWatch_Count!=0) gWatch_Type=WATCH_TYPE_COUNT;
  1847. else
  1848. {
  1849. Load_Buffer1_Echo(ASK_FREEWATCH_UP,gGeneral_Buffer[5]);
  1850. }
  1851. }
  1852. }
  1853. }
  1854. }
  1855. /********************************************************
  1856. * 函数名:Line_Data_Deal();
  1857. 作用域:本地文件调用
  1858. * 功能:
  1859. * 参数:  无
  1860. * 返回值:无
  1861. * 创建人:
  1862. * 修改历史:(每条详述)
  1863. ********************************************************/
  1864. void Line_Data_Deal(void)
  1865. {
  1866. unsigned int i=0,j=0;
  1867. unsigned char nTemp=0;
  1868. unsigned char Line_Num=0;
  1869. nTemp=gGeneral_Buffer[1+10]; //帧数(范围值1,2)
  1870. Line_Num=gGeneral_Buffer[1+11]; //当前线路点的个数(1--30)
  1871. SRAM_Init();
  1872. SRAM_Write(ECHO_SMS_2+0,VAILD_2);
  1873. SRAM_Write(ECHO_SMS_2+1,LINE_DATA_ECHO_UP);
  1874. SRAM_Write(ECHO_SMS_2+2,gGeneral_Buffer[5]);
  1875. SRAM_Write(ECHO_SMS_2+3,2);
  1876. SRAM_Write(ECHO_SMS_2+4,gGeneral_Buffer[1+9]);
  1877. SRAM_Write(ECHO_SMS_2+5,gGeneral_Buffer[1+10]);
  1878. Judge_SMS_Way();
  1879. if(Line_Num>30 )
  1880. {
  1881. Line_Num=30;
  1882. }
  1883. OperateSPIEnd();
  1884. //表示当前是第一页的数据
  1885. if(nTemp==1)
  1886. {
  1887. ReadOnePageToBuffer2(FLASH_LINEDATA1_ONE_2);
  1888. }
  1889. //表示是当前第二页的数据
  1890. else if(nTemp==2)
  1891. {
  1892. ReadOnePageToBuffer2(FLASH_LINEDATA2_ONE_2);
  1893. }
  1894. OperateSPIEnd();
  1895. //写buffer2中第一个数据
  1896. WriteOneByteToBuffer2(FLINE_DATA_1,gGeneral_Buffer[1+12]);
  1897. for(i=1;i<8*Line_Num;i++)
  1898. {
  1899. WriteNextByteToBuffer2(gGeneral_Buffer[1+12+i]);
  1900. }
  1901. for(i=8*Line_Num+1;i<264;i++)
  1902. {
  1903. WriteNextByteToBuffer2(0xFF);
  1904. }
  1905. OperateSPIEnd();
  1906. //写入当前页点的个数
  1907. WriteOneByteToBuffer2(FLINE_NUM_1,Line_Num);
  1908. WriteNextByteToBuffer2(~Line_Num);
  1909. OperateSPIEnd();
  1910. if(nTemp==1) RFlash_Sector(FLASH_LINEDATA1_ONE_2);
  1911. else if(nTemp==2) RFlash_Sector(FLASH_LINEDATA2_ONE_2);
  1912. Clear_Exter_WatchDog();
  1913. OperateSPIEnd();
  1914. //将扇区存储在相应的FLASH中
  1915. //判断是否接收完线路报警,如果接收完,则将FLAHS中的数据转移到SRAM中
  1916. if(gGeneral_Buffer[1+9]==gGeneral_Buffer[1+10])
  1917. {
  1918. Load_Info_Four();
  1919. }
  1920. }