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

GPS编程

开发平台:

Others

  1. /********************************************************
  2. * 文件名:  Do_GSM.C
  3. * 创建时间:2004年12月7日
  4. * 创建人:  
  5. * 版本号:  1.00
  6. * 功能:   针对GPS方面数据的处理
  7. * 文件属性:公共文件
  8. * 修改历史:(每条详述)
  9. ********************************************************/
  10. #include <msp430x14x.h>
  11. #include "TA_Uart.h"
  12. #include "General.h"
  13. #include "M22_AT.h"
  14. #include "Sub_C.h"
  15. #include "Define_Bit.h"
  16. #include "Uart01.h"
  17. #include "Handle_Protocol.h"
  18. #include "SPI45DB041.h"
  19. #include "D_Buffer.h"
  20. #include "Disp_Protocol.h"
  21. #include "Other_Define.h"
  22. #include "W_Protocol.h"
  23. #include "Do_Other.h"
  24. #include "Other_Define.h"
  25. #include "Record_Protocol.h"
  26. #include "Msp430_Flash.h"
  27. #include "Do_SRAM.h"
  28. /*
  29. #include "Main_Init.h"
  30. #include "Check_GSM.h"
  31. #include "Do_Reset.h"
  32. #include "Do_GSM.h"
  33. #include "Do_Handle.h"
  34. #include "Do_GPS.h"
  35. #include "Do_Disp.h"
  36. */
  37. //#define Debug_GPS_COM1
  38. unsigned char GPS_Buffer[80]; //接收存储GPS数据,只能接收一帧数据d
  39. unsigned char GPS_Buffer_Point=0; //接收指针
  40. unsigned char GPS_Send_Count=0;
  41. const unsigned char Tab[4][12]={ { 31,29,31,30,31,30,31,31,30,31,30,31 },
  42.                                  { 31,28,31,30,31,30,31,31,30,31,30,31 },
  43.                                  { 31,28,31,30,31,30,31,31,30,31,30,31 },
  44.                                  { 31,28,31,30,31,30,31,31,30,31,30,31 } };
  45. /********************************************************
  46. * 函数名:Do_GPS_Module
  47. 作用域:外部文件调用
  48. * 功能: 与手柄通讯模块。
  49. * 参数:
  50. * 返回值:
  51. * 创建人:
  52. *
  53. * 修改历史:(每条详述)
  54. 补充说明:
  55. 关于GPS数据的接收处理,则采用中断接收处理的方式,一旦中断接收完
  56. 数据后,在Do_GPS_Module里处理接收到的GPS数据,GPS_Buffer[]缓冲
  57. 负责接收GPS数据,但只能存储一个GPS数据包。全局变量gGPS_Receive_over
  58. 作为判断是否接收数据全部完成的记数,一旦中断接收到一个字节的数据
  59. 则gGPS_Receive_over=0,如果数据接收完,则不会在进入中断了,则
  60. gGPS_Receive_over会在定时中断中++,超过一定时间,仍然未在进入接收
  61. 中断接收到数据,则表示一个完整的GPS数据包接收完,则进入处理
  62. GPS数据处理部分。
  63. ********************************************************/
  64. void Do_GPS_Module(void)
  65. {
  66. unsigned int i=0,j=0,k=0;
  67. unsigned char CYear=0x05,CMonth=0x01,CDate=0x01,CHour=0x12,CMinute=0x00,CSecond=0x00;
  68. // unsigned char nFlag=0;
  69. unsigned char Check_Data=0;
  70. unsigned char Check_Record=0;
  71. // nFlag=gAlarm_Type;
  72. /********************************************************
  73. A,判断是否需要进行GPS的复位操作
  74. 判断是否满足复位GPS的标志位置位
  75. 具体此GPS置位的标志位的条件:每一次的无效点则gGPS_Invaild_Timer++
  76. 如果连续GPS_INVALID_COUNT的时间均为无效点,则需要置复位GPS的标志位GPS_RESET_F_1
  77. 但一旦有有效点,则需要将无效点的计数清为0。
  78. 如果满足复位GPS的条件,则需要将GPS的复位管脚设置为低电平,持续GPS_LOW_TIME时间后在置高
  79. ********************************************************/
  80. /********************************************************
  81. A,如果连续100秒,GPS无输出或者输出格式无效,则进行一次GPS模块掉电处理
  82. 如果连续5次进行了这样的操作,则以后不在进行GPS模块的掉电处理,则回直接设置
  83. GPS模块故障的标志位。
  84. ********************************************************/
  85. if(gGPS_No_Output_Timer>NO_OUTPUT_TIME)
  86. {
  87. gGPS_No_Output_Timer=0;
  88. gNO_GPS_Reset_Count=0;
  89. gCommon_Flag|=GPSNO_RESET_F_1;
  90. gStatus3_Flag|=GPS_OUTPUT_WAY_F_1;
  91. //如果GPS无输出,同时判断到显示终端和手柄无任何时候进行的通讯,则需要关闭看门狗,使得程序重新启动
  92. if(  ((gStatus1_Flag&DISPLAY_ON_F_1)==0)
  93.    &&((gStatus1_Flag&HANDLE_ON_0_F_1)==0)
  94.    &&((gStatus1_Flag&HANDLE_ON_1_F_1)==0) )
  95. {
  96. gOther_Flag|=RESET_PROGRAME_F_1;
  97. }
  98. }
  99. /********************************************************
  100. B 如果GPS超过5秒无输出,则如果以前是有效标志,则需要将其设置为
  101. 无效标志
  102. ********************************************************/
  103. else if((gGPS_No_Output_Timer>20)&&(gGeneral_Flag&GPS_VALID_F_1) )
  104. {
  105. gGeneral_Flag&=~GPS_VALID_F_1;
  106. }
  107. /********************************************************
  108. D,判断是否接受完数据:
  109. 在整个GPS的数据处理中。
  110. 1,无效点的累计和复位GPS标志的判断
  111. 2,处于设防状态下,速度超过3.6*4的有效点的累计
  112. (初步以判断连续有30个有效点满足条件均可,产生被盗报警信息)
  113. ********************************************************/
  114. else if( (gGPS_Receive_Over>90)&&(GPS_Buffer_Point>1) )
  115. {
  116. //判断接收到正确的包头,包尾
  117.         if((Compare_String((unsigned char *)String_GPRMC,GPS_Buffer,sizeof(String_GPRMC))==1)&&(GPS_Buffer[GPS_Buffer_Point-1]==0x0a))
  118. {
  119. //关GPS接收中断
  120. //比较器A的中断关闭
  121. //TAUARTCTL&=~TAUARTIE;
  122. if((gGeneral_Flag&TCP_PHONE_F_1)==0)
  123. {
  124. GPS_Send_Count++;
  125. if(GPS_Send_Count>10)
  126. {
  127. GPS_Send_Count=0;
  128. Send_COM1_String(GPS_Buffer,6);
  129. }
  130. }
  131. gNO_GPS_Reset_Count=0;
  132. gGPS_No_Output_Timer=0;
  133. gGeneral_Flag&=~GPS_VALID_F_1;
  134. gCommon_Flag&=~GPSNO_RESET_F_1;
  135. gStatus3_Flag&=~GPS_OUTPUT_WAY_F_1;
  136. i=0;
  137. while(1)
  138. {
  139. //处理时,分,秒信息
  140. while( i<GPS_Buffer_Point )
  141. {
  142.     if( GPS_Buffer[i]==',' ) break;i++;
  143. }
  144. if(GPS_Buffer[i]!=',') break;
  145. else
  146. {
  147. CHour  =ASCIITOHEX( GPS_Buffer[i+1],GPS_Buffer[i+2] );
  148. CMinute=ASCIITOHEX( GPS_Buffer[i+3],GPS_Buffer[i+4] );
  149. CSecond=ASCIITOHEX( GPS_Buffer[i+5],GPS_Buffer[i+6] );
  150. i++;
  151. }
  152. //处理GPS数据的有效性
  153. while( i<GPS_Buffer_Point )
  154. {
  155.     if( GPS_Buffer[i]==',' ) break;i++;
  156. }
  157. if(GPS_Buffer[i]!=',') break;
  158. if(GPS_Buffer[i+1]!='A')
  159. {
  160. gGeneral_Flag &=~GPS_VALID_F_1;
  161. }
  162. else
  163. {
  164. gGeneral_Flag |= GPS_VALID_F_1;
  165. gGPS_Invaild_Timer=0;
  166. }
  167. i++;
  168. while( i<GPS_Buffer_Point )
  169. {
  170.     if( GPS_Buffer[i]==',' ) break;i++;
  171. }
  172. if(GPS_Buffer[i]!=',') break;
  173. else
  174. { //纬度,只有在有效的状态下,才更新纬度值
  175. if(gGeneral_Flag&GPS_VALID_F_1)
  176. {
  177. gLatitude=ASCIITOHEX( 0,GPS_Buffer[i+1] )*10+ASCIITOHEX( 0,GPS_Buffer[i+2] );
  178. gLatitude=gLatitude*60;
  179. gLatitude=gLatitude+ASCIITOHEX( 0,GPS_Buffer[i+3] )*10+ASCIITOHEX( 0,GPS_Buffer[i+4] );
  180. gLatitude=gLatitude*10+ASCIITOHEX( 0,GPS_Buffer[i+6] );
  181. gLatitude=gLatitude*10+ASCIITOHEX( 0,GPS_Buffer[i+7] );
  182. gLatitude=gLatitude*10+ASCIITOHEX( 0,GPS_Buffer[i+8] );
  183. gLatitude=gLatitude*10+ASCIITOHEX( 0,GPS_Buffer[i+9] );
  184. gLatitude=gLatitude*6;
  185. }
  186. i++;
  187. }
  188. while( i<GPS_Buffer_Point )
  189. {
  190.     if( GPS_Buffer[i]==',' ) break;i++;
  191. }
  192. if(GPS_Buffer[i]!=',') break;
  193. i++;
  194. while( i<GPS_Buffer_Point )
  195. {
  196.     if( GPS_Buffer[i]==',' ) break;i++;
  197. }
  198. if(GPS_Buffer[i]!=',') break;
  199. else
  200. { //经度,只有在有效的状态下才更新经度值
  201. if(gGeneral_Flag&GPS_VALID_F_1)
  202. {
  203. gLongitude=ASCIITOHEX( 0,GPS_Buffer[i+1] );
  204. gLongitude=gLongitude*10+ASCIITOHEX( 0,GPS_Buffer[i+2] );
  205. gLongitude=gLongitude*10+ASCIITOHEX( 0,GPS_Buffer[i+3] );
  206. gLongitude=gLongitude*60;
  207. gLongitude=gLongitude+ASCIITOHEX( 0,GPS_Buffer[i+4] )*10+ASCIITOHEX( 0,GPS_Buffer[i+5] );
  208. gLongitude=gLongitude*10+ASCIITOHEX( 0,GPS_Buffer[i+7] );
  209. gLongitude=gLongitude*10+ASCIITOHEX( 0,GPS_Buffer[i+8] );
  210. gLongitude=gLongitude*10+ASCIITOHEX( 0,GPS_Buffer[i+9] );
  211. gLongitude=gLongitude*10+ASCIITOHEX( 0,GPS_Buffer[i+10] );
  212. gLongitude=gLongitude*6;
  213. }
  214. i++;
  215. }
  216. while( i<GPS_Buffer_Point )
  217. {
  218.     if( GPS_Buffer[i]==',' ) break;i++;
  219. }
  220. if(GPS_Buffer[i]!=',') break;
  221. i++;
  222. while( i<GPS_Buffer_Point )
  223. {
  224.     if( GPS_Buffer[i]==',' ) break;i++;
  225. }
  226. if(GPS_Buffer[i]!=',') break;
  227. else
  228. {
  229. j=0;
  230. gSpeed_Gps=0;
  231. while(1)
  232. {
  233.     if(GPS_Buffer[i+j+1]=='.') break;
  234.     if(GPS_Buffer[i+j+1]==',') break;
  235.     gSpeed_Gps=gSpeed_Gps*10+ASCIITOHEX(0,GPS_Buffer[i+j+1]);
  236.     j++;
  237.     if( j>=GPS_Buffer_Point ) break;
  238. }
  239. gSpeed_Gps=gSpeed_Gps/2;
  240. i++;
  241. }
  242. while( i<GPS_Buffer_Point )
  243. {
  244.     if( GPS_Buffer[i]==',' ) break;i++;
  245. }
  246. if(GPS_Buffer[i]!=',') break;
  247. else
  248. {
  249. j=0;
  250. k=0;
  251. while(1)
  252. {
  253.     if( GPS_Buffer[i+j+1]=='.' )break;
  254.     if( GPS_Buffer[i+j+1]==',' )break;
  255.     k=k*10+ASCIITOHEX( 0,GPS_Buffer[i+j+1] );
  256.     j++;
  257.     if( j>=GPS_Buffer_Point ) break;
  258. }
  259. gAzimuth=k/15;
  260. i++;
  261. }
  262. while( i<GPS_Buffer_Point )
  263. {
  264.     if( GPS_Buffer[i]==',' ) break;i++;
  265. }
  266. if(GPS_Buffer[i]!=',') break;
  267. else
  268. {
  269. CDate = ASCIITOHEX( GPS_Buffer[i+1],GPS_Buffer[i+2] );
  270. CMonth =ASCIITOHEX( GPS_Buffer[i+3],GPS_Buffer[i+4] );
  271. CYear = ASCIITOHEX( GPS_Buffer[i+5],GPS_Buffer[i+6] );
  272. i++;
  273. }
  274. break;
  275. }
  276. /********************************************************
  277. 1; 上面是处理接收完GPS数据
  278. 下面是需要进行接收的GPS数据进行跟进一步的处理
  279. 进一步的处理时间,年,月,日
  280. ********************************************************/
  281. while(1)
  282. {
  283. i=CHour/16*10+CHour%16;
  284. i=i+8;
  285. if( i<24 ){ CHour=i/10*16+i%10;break; }
  286. i=i-24;
  287. CHour=i/10*16+i%10;
  288. i=CDate/16*10+CDate%16;
  289. j=CYear/16*10+CYear%16;
  290. k=CMonth/16*10+CMonth%16;
  291. i++;
  292. if( i<=Tab[j/4][k-1] ){ CDate=i/10*16+i%10;break; }
  293. CDate=1;
  294. k++;
  295. if( k<=12 ){ CMonth=k/10*16+k%10;break; }
  296. CMonth=1;
  297. j++;
  298. CYear=j/10*16+j%10;
  299. break;
  300. }
  301. /********************************************************
  302. 2,如果CSecond=0,则需要向手柄和显示屏发送一个时间矫正
  303. ********************************************************/
  304. if(CSecond==0)
  305. {
  306. SRAM_Init();
  307. SRAM_Write(SHANDLE_DATA_VAILD+0,VAILD_2);
  308. SRAM_Write(SHANDLE_DATA_VAILD+1,0x24);
  309. SRAM_Write(SHANDLE_DATA_VAILD+2,0x09);
  310. SRAM_Write(SHANDLE_DATA_VAILD+3,MAIN_TIME);
  311. SRAM_Write(SHANDLE_DATA_VAILD+4,CYear);
  312. SRAM_Write(SHANDLE_DATA_VAILD+5,CMonth);
  313. SRAM_Write(SHANDLE_DATA_VAILD+6,CDate);
  314. SRAM_Write(SHANDLE_DATA_VAILD+7,CHour);
  315. SRAM_Write(SHANDLE_DATA_VAILD+8,CMinute);
  316. SRAM_Write(SHANDLE_DATA_VAILD+9,0x0d);
  317. if(   (gDisp_Buffer_Point+14<=sizeof(gDisp_Buffer))
  318.     &&((gCommon_Flag&ALLOW_OUT_DISP_F_1)==0)   )
  319. {
  320. gDisp_Buffer[gDisp_Buffer_Point]=14;
  321. gDisp_Buffer_Point++;
  322. gDisp_Buffer[gDisp_Buffer_Point]=0;
  323. gDisp_Buffer_Point++;
  324. gDisp_Buffer[gDisp_Buffer_Point]='@';
  325. gDisp_Buffer_Point++;
  326. gDisp_Buffer[gDisp_Buffer_Point]='%';
  327. gDisp_Buffer_Point++;
  328. gDisp_Buffer[gDisp_Buffer_Point]=12;
  329. gDisp_Buffer_Point++;
  330. gDisp_Buffer[gDisp_Buffer_Point]=DISP_MAIN_STATUS_DOWN;
  331. gDisp_Buffer_Point++;
  332. if(gGeneral_Flag&GPS_VALID_F_1)
  333. {
  334. gDisp_Buffer[gDisp_Buffer_Point]=CYear;
  335. gDisp_Buffer_Point++;
  336. gDisp_Buffer[gDisp_Buffer_Point]=CMonth;
  337. gDisp_Buffer_Point++;
  338. gDisp_Buffer[gDisp_Buffer_Point]=CDate;
  339. }
  340. else
  341. {
  342. gDisp_Buffer[gDisp_Buffer_Point]=0x05;
  343. gDisp_Buffer_Point++;
  344. gDisp_Buffer[gDisp_Buffer_Point]=0x01;
  345. gDisp_Buffer_Point++;
  346. gDisp_Buffer[gDisp_Buffer_Point]=0x01;
  347. }
  348. gDisp_Buffer_Point++;
  349. gDisp_Buffer[gDisp_Buffer_Point]=CHour;
  350. gDisp_Buffer_Point++;
  351. gDisp_Buffer[gDisp_Buffer_Point]=CMinute;
  352. gDisp_Buffer_Point++;
  353. gDisp_Buffer[gDisp_Buffer_Point]=CSecond;
  354. gDisp_Buffer_Point++;
  355. gDisp_Buffer[gDisp_Buffer_Point]='$';
  356. gDisp_Buffer_Point++;
  357. gDisp_Buffer[gDisp_Buffer_Point]='&';
  358. gDisp_Buffer_Point++;
  359. }
  360. }
  361. /********************************************************
  362. 3,如果GPS数据有效,则进行的有关处理
  363. ********************************************************/
  364.     if(gGeneral_Flag&GPS_VALID_F_1)
  365.     {
  366. /*
  367.      //显示当前GPS的经,纬度值
  368. Send_COM1_Byte('O');Send_COM1_Byte('[');
  369. Send_COM1_Byte(ASCII((gLongitude/0x1000000)/0x10));
  370. Send_COM1_Byte(ASCII((gLongitude/0x1000000)%0x10));
  371. Send_COM1_Byte(ASCII((gLongitude%0x1000000/0x10000)/0x10));
  372. Send_COM1_Byte(ASCII((gLongitude%0x1000000/0x10000)%0x10));
  373. Send_COM1_Byte(ASCII((gLongitude%0x10000/0x100)/0x10));
  374. Send_COM1_Byte(ASCII((gLongitude%0x10000/0x100)%0x10));
  375. Send_COM1_Byte(ASCII((gLongitude%0x100)/0x10));
  376. Send_COM1_Byte(ASCII((gLongitude%0x100)%0x10));
  377. Send_COM1_Byte(']');
  378. Send_COM1_Byte('A');Send_COM1_Byte('[');
  379. Send_COM1_Byte(ASCII((gLatitude/0x1000000)/0x10));
  380. Send_COM1_Byte(ASCII((gLatitude/0x1000000)%0x10));
  381. Send_COM1_Byte(ASCII((gLatitude%0x1000000/0x10000)/0x10));
  382. Send_COM1_Byte(ASCII((gLatitude%0x1000000/0x10000)%0x10));
  383. Send_COM1_Byte(ASCII((gLatitude%0x10000/0x100)/0x10));
  384. Send_COM1_Byte(ASCII((gLatitude%0x10000/0x100)%0x10));
  385. Send_COM1_Byte(ASCII((gLatitude%0x100)/0x10));
  386. Send_COM1_Byte(ASCII((gLatitude%0x100)%0x10));
  387. Send_COM1_Byte(']');
  388. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  389. */
  390. /////////////////////////////////////////
  391.                 gYear=CYear;
  392.                 gMonth=CMonth;
  393.                 gDate=CDate;
  394.                 gHour=CHour;
  395.                 gMinute = CMinute;
  396.                 gSecond=CSecond;
  397.                 gGPS_Invaild_Timer=0;
  398. gGps_Null_Count=0;
  399. gPublic_Flag &=~ GPS_NULL_F_1;
  400. //判断是否满足条件,进行记录仪的时间矫正设置的命令
  401. if(   (gPublic_Flag&SET_RECORD_TIME_F_1)
  402. &&(gSecond==0)
  403. &&(gStatus==NORMAL_TYPE)
  404. &&((gPublic_Flag&CHECK_TIME_F_1)==0)  )
  405. {
  406. Send_COM1_String( (unsigned char *)CHECK_TIME,sizeof(CHECK_TIME) );
  407.      Send_COM1_Byte(gStatus);
  408.      Check_Record = gStatus;
  409.      Send_COM1_Byte(0xAA);
  410.      Check_Record ^= 0xAA;
  411.      Send_COM1_Byte(0x75);
  412.      Check_Record ^= 0x75;
  413.      Send_COM1_Byte(G_SET_TIME); //命令字
  414.      Check_Record ^= G_SET_TIME;
  415.      Send_COM1_Byte(0);
  416.      Check_Record ^= 0;
  417.      Send_COM1_Byte(6); //长度6
  418.      Check_Record ^= 6;
  419.      Send_COM1_Byte(0x00);
  420.      Check_Record ^= 0x00; //保留字节
  421.      Send_COM1_Byte(gYear);
  422.      Check_Record ^= gYear;
  423.      Send_COM1_Byte(gMonth);
  424.      Check_Record ^= gMonth;
  425.      Send_COM1_Byte(gDate);
  426.      Check_Record ^= gDate;
  427.      Send_COM1_Byte(gHour);
  428.      Check_Record ^= gHour;
  429.      Send_COM1_Byte(gMinute);
  430.      Check_Record ^= gMinute;
  431.      Send_COM1_Byte(gSecond);
  432.      Check_Record ^= gSecond;
  433.      Send_COM1_Byte(Check_Record); //校验核
  434.      Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a); //包尾
  435. }
  436. /*
  437.                 //D:存储一分钟一个点的历史轨迹
  438.                 if( (CMinute!=CMinute_Temp)&&(gCycle_Send_Status!=PASS_DATA) )
  439.                 {
  440.                  gPassTrack_Store_Item++;
  441.                  //将指向下一个历史点的存储位置,如果判断已经到了页尾,则需要从新开始下一个页的存储
  442.                     if( ( gPassTrack_Store_Item>=16 )||( gPassTrack_Store_Item<=0 ) )
  443.                     {
  444.                      gPassTrack_Store_Item=1;
  445.                      //1,判断是否到了规定存储历史轨迹区域的最后一个扇区
  446. if((gPassTrack_Store_Sector>=FLASH_PASTDATA_E_2)||(gPassTrack_Store_Sector<FLASH_PASTDATA_S_2) )
  447. {
  448. gPassTrack_Store_Sector=FLASH_PASTDATA_S_2;
  449. }
  450. else  gPassTrack_Store_Sector++;
  451. //2,将下一个扇区的内容写成记忆页
  452. OperateSPIEnd();
  453. WriteOneByteToBuffer2(0xFF,0xaa);
  454. OperateSPIEnd();
  455. WriteBuffer2ToPage(gPassTrack_Store_Sector+1);
  456. gTimer=0;Clear_Exter_WatchDog();
  457. while(gTimer<500){}
  458. Clear_Exter_WatchDog();
  459. OperateSPIEnd();
  460.                     }
  461. OperateSPIEnd();
  462. //读对应gPassTrack_Store_Sector扇区中的数据到buffer2.
  463. ReadOnePageToBuffer2(gPassTrack_Store_Sector);
  464. //计算在这个扇区需要存到的下一个位置
  465. i=(gPassTrack_Store_Item-1)*17;
  466. OperateSPIEnd();
  467. //long int gLatitude  gLongitude 四个字节
  468. WriteOneByteToBuffer2( (i+0),gLongitude/0x1000000);
  469. WriteNextByteToBuffer2( gLongitude%0x1000000/0x10000 );
  470. WriteNextByteToBuffer2( gLongitude%0x10000/0x100 );
  471. WriteNextByteToBuffer2( gLongitude%0x100 );
  472. WriteNextByteToBuffer2( gLatitude/0x1000000 );
  473. WriteNextByteToBuffer2( gLatitude%0x1000000/0x10000 );
  474. WriteNextByteToBuffer2( gLatitude%0x10000/0x100 );
  475. WriteNextByteToBuffer2( gLatitude%0x100 );
  476. WriteNextByteToBuffer2( gSpeed );
  477. WriteNextByteToBuffer2( gAzimuth );
  478. WriteNextByteToBuffer2( nFlag|FLAG_GPSVAILD_1 );
  479. WriteNextByteToBuffer2( gYear );
  480. WriteNextByteToBuffer2( gMonth );
  481. WriteNextByteToBuffer2( gDate );
  482. WriteNextByteToBuffer2( gHour );
  483. WriteNextByteToBuffer2( gMinute );
  484. WriteNextByteToBuffer2( gSecond );
  485. OperateSPIEnd();
  486. //写已经存储的条数
  487. WriteOneByteToBuffer2( 0xFF,gPassTrack_Store_Item );
  488. //后面存储的是里程统计数据
  489. WriteNextByteToBuffer2( gALL_Distance/0x1000000 );
  490. WriteNextByteToBuffer2( gALL_Distance%0x1000000/0x10000 );
  491. WriteNextByteToBuffer2( gALL_Distance%0x10000/0x100 );
  492. WriteNextByteToBuffer2( gALL_Distance%0x100 );
  493. OperateSPIEnd();
  494. //将buffer2中的数据写入相应的Flash的区域中
  495. if( (gPassTrack_Store_Sector>=FLASH_PASTDATA_S_2)&&(gPassTrack_Store_Sector<=FLASH_PASTDATA_E_2) )
  496. {
  497. WriteBuffer2ToPage(gPassTrack_Store_Sector);
  498. gTimer=0;Clear_Exter_WatchDog();
  499. while(gTimer<500){}
  500. Clear_Exter_WatchDog();
  501. }
  502. OperateSPIEnd();
  503. CMinute_Temp=CMinute;
  504.                 }
  505.             */
  506.     }
  507. /********************************************************
  508. 4,如果GPS数据无效,则进行相关的处理
  509. ********************************************************/
  510.     else
  511.     {
  512. gGPS_Invaild_Timer++;
  513. //如果超过1800秒持续无效点,则重新掉电处理GPS模块
  514. if(gGPS_Invaild_Timer>GPS_INVALID_COUNT)
  515. {
  516. gGPS_Invaild_Timer=0;
  517. gGeneral_Flag|=OFF_GPS_F_1;
  518. gOFF_Power_S=1;
  519. }
  520.     }
  521. }
  522. GPS_Buffer_Point=0;
  523. gGPS_Receive_Over=0;
  524. for(i=0;i<sizeof(GPS_Buffer);i++) GPS_Buffer[i]=0;
  525. }
  526. TAUARTCTL|=TAUARTIE;       //比较器A的中断允许
  527. }
  528. /********************************************************
  529. * 函数名:Receive_COM2(中断子程序)
  530. 作用域:本地文件调用
  531. * 功能: 利用比较器A的中断向量,进行模拟串口2的接收处理,处理接收GPS的数据
  532. * 参数:
  533. * 返回值:
  534. * 创建人:
  535. *
  536. * 修改历史:(每条详述)
  537. ********************************************************/
  538. interrupt [TAUART_VECTOR] void Receive_COM2(void)
  539. {
  540. TAUARTCTL&=~TAUARTIFG; //清除比较器A的中断标志位
  541. if(RTI2&RECEIVE_FLAG) //表示接收到一个字节完成
  542. {
  543. GPS_Buffer[GPS_Buffer_Point]=SBUFIN2;
  544. GPS_Buffer_Point++;
  545. if(GPS_Buffer_Point>=sizeof(GPS_Buffer)) GPS_Buffer_Point=0;
  546. gGPS_Receive_Over=0;
  547. RX2_Ready();
  548. }
  549. }
  550. /********************************************************
  551. * 函数名:Disp_Ask_Info()
  552. 作用域:本地文件调用
  553. * 功能: 接收到来自显示终端的按键请求信息,需要将这些信息上行给中心
  554. * 参数:
  555. * 返回值:
  556. * 创建人:
  557. *
  558. * 修改历史:(每条详述
  559.    Dim Instring As String
  560.    Dim Buffer(10) As Byte
  561.    Dim IObuffer(14) As Byte
  562.    Dim InBuffer(10) As Byte
  563.    Dim Savebuffer(5) As Byte
  564.    Dim I
  565.    Buffer(0) = &H10
  566.    Buffer(1) = &H7A
  567.    Buffer(2) = &H0
  568.    Buffer(3) = &H1
  569.    Buffer(4) = &H0
  570.    Buffer(5) = &H0
  571.    Buffer(6) = &H1  ' RMC
  572.    Buffer(7) = &H0
  573.    'buffer(7)=&H1C 在设置GSA,GSV,VTG,时,buffer(7)=&H1C
  574.    Buffer(8) = &H10
  575.    Buffer(9) = &H3
  576.    IObuffer(0) = &H10
  577.    IObuffer(1) = &HBC
  578.    IObuffer(2) = &H0
  579.    IObuffer(3) = &H7
  580.    IObuffer(4) = &H7
  581.    IObuffer(5) = &H3
  582.    IObuffer(6) = &H0
  583.    IObuffer(7) = &H0
  584.    IObuffer(8) = &H0
  585.    IObuffer(9) = &H2
  586.    IObuffer(10) = &H4
  587.    IObuffer(11) = &H0
  588.    IObuffer(12) = &H10
  589.    IObuffer(13) = &H3
  590.    Savebuffer(0) = &H10
  591.    Savebuffer(1) = &H8E
  592.    Savebuffer(2) = &H26
  593.    Savebuffer(3) = &H10
  594.    Savebuffer(4) = &H3
  595.    ' 使用 COM1。
  596.    MSComm1.CommPort = 1
  597.    ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
  598.    MSComm1.Settings = "9600,O,8,1"
  599.    ' 当输入占用时,
  600.    ' 告诉控件读入整个缓冲区。
  601.    MSComm1.InputLen = 0
  602.    ' 打开端口。
  603.    MSComm1.PortOpen = True
  604.    ' 将 attention 命令送到调制解调器。
  605.    MSComm1.Output = Buffer ' "ATV1Q0" & Chr$(13) ' 确保
  606.    MSComm1.Output = IObuffer
  607.    'MSComm1.Output = Savebuffer
  608.    MSComm1.PortOpen = False
  609.    ''''''''''''''
  610.     MSComm1.CommPort = 1
  611.    ' 9600 波特,无奇偶校验,8 位数据,一个停止位。
  612.    MSComm1.Settings = "9600,N,8,1"
  613.    ' 当输入占用时,
  614.    ' 告诉控件读入整个缓冲区。
  615.    MSComm1.InputLen = 0
  616.    ' 打开端口。
  617.    MSComm1.PortOpen = True
  618.    ' 将 attention 命令送到调制解调器。
  619.    MSComm1.Output = Savebuffer
  620.    MSComm1.PortOpen = False
  621. ********************************************************/