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

GPS编程

开发平台:

Others

  1. /********************************************************
  2. * 文件名:  Do_GSM.C
  3. * 创建时间:2004年12月7日
  4. * 创建人:  
  5. * 版本号:  1.00
  6. * 功能:   针对GSM模块进行的一些操作,包括发送数据和接收数据
  7. * 文件属性:公共文件
  8. * 修改历史:(每条详述)
  9. ********************************************************/
  10. #include <msp430x14x.h>
  11. #include "Other_Define.h"
  12. #include "General.h"
  13. #include "SPI45DB041.h"
  14. #include "Define_Bit.h"
  15. #include "D_Buffer.h"
  16. #include "Uart01.h"
  17. #include "M22_AT.h"
  18. #include "Check_GSM.h"
  19. #include "Sub_C.h"
  20. #include "Do_Reset.h"
  21. #include "W_Protocol.h"
  22. #include "TA_Uart.h"
  23. #include "Handle_Protocol.h"
  24. #include "Do_Handle.h"
  25. #include "Do_SRAM.h"
  26. #include "Do_M22.h"
  27. /*
  28. #include "Do_Record.h"
  29. #include "Record_Protocol.h"
  30. #include "Main_Init.h"
  31. #include "Disp_Protocol.h"
  32. */
  33. #define Debug_GSM_COM1
  34. void Case1_GSM_PHONE(void);
  35. void Case1_PHONE_Out(void);
  36. void Case2_GSM_OTHER(void);
  37. void Case2_OTHER_Out(void);
  38. void Case3_GSM_SMS_IN(void);
  39. void Case3_SMSIN_Out(void);
  40. void Case4_GSM_SMS_OUT(void);
  41. void Case4_SMSOUT_Out(void);
  42. void Case4_OverTime_Out(unsigned char Clear_Flag);
  43. void Case5_LAND_GPRS_OPER(void);
  44. void Case6_GPRS_DATA_OPER(void);
  45. void Send_Type1_GSM_Data_One(unsigned char S_Address);
  46. void Send_Type1_GSM_Data_Two(unsigned char S_Address);
  47. void Send_Circle_GSM_TypeD(void);
  48. void Send_Circle_TCP_TypeD(void);
  49. void Send_Circle_GSM_TypeE(void);
  50. void Send_Circle_TCP_TypeE(void);
  51. void Case_OverTime_Return(void);
  52. //作为音量四个档位(起作用的也就是后面的四个数,前一个数的存在是为了使数组的下标和音量值想对应上)
  53. /********************************************************
  54. * 函数名:Do_G20_Out
  55. 作用域:外部文件调用
  56. * 功能:
  57. * 参数:
  58. * 返回值:
  59. * 创建人:
  60. *
  61. * 修改历史:(每条详述)
  62. A,表示GSM工作方式
  63. B,表示TCP挂起的工作方式
  64. C,表示TCP在线的工作方式
  65. 补充说明:因为根据M22模块的特性:几个CASE的功能
  66. 1,处理与电话相关的业务(AB),
  67. 2,处理与CSQ方面的查询(AB)
  68. 3,SMS的接收(中断方式接收处理)(AB)
  69. 4,SMS的发送操作(A)
  70. 5,处理需要TCP登陆,TCP退出,TCP在线。
  71. 6,TCP在线状态下进行TCP的数据业务
  72. 根据M22的相关特性:则可以分为如下几种操作方式
  73. 正常的工作流程:
  74. 设备启动后:如果根据条件需要进行TCP登陆的话
  75. 1-2-3-4-5(登陆)--6(发送登陆信息)---等待登陆响应----(A)接收到响应(A01)6(循环处理)(A02)CSQ查询时间到(A03)+++挂起(A03)2---(A04)6(循环处理)
  76.     ---
  77.                             ---(A011)判断有电话相关的业务(拨出号码和电话打入)--(A012)+++挂起---1()
  78.    ----(B)未接收到响应(B01)6(发送登陆信息)--等待登陆响应
  79. 具体的的工作方式:
  80. 1,设备上电,启动M22,进入GSM的工作方式:
  81. 2,如果判断设备判断有报警信息(报警信息默认为30秒的周期发送),
  82. 同时IP地址有效,TCP处于开启状态,则需要在启动M22工作后,
  83. 进行TCP登陆操作,此时需要TCP一直在线,进行发送报警信息
  84. 3,如果判断设备有需要发送行车轨迹数据,同时IP地址有效,TCP处于开启状态,
  85. 则也需要在启动M22工作后,进行TCP登陆操作,此时又分两重情况
  86. 如果发送轨迹数据的周期如果小于3分钟,则属于一直在线状态),而如何
  87. 发送行车轨迹数据的周期大于等于3分钟,则在需要发送轨迹数据的时刻
  88. 才进行登陆操作,然后进行发送数据。发送完数据后,则立即退出TCP在线。
  89. 4,如果属于TCP一直在线的状态,则每间隔一定时间将TCP挂起,进行CSQ的查询
  90. 登陆TCP的工作流程:如果登陆上TCP,并且通过TCP发送登陆信息后,等待返回登陆响应
  91. 如果超过一定时间未返回登陆响应,则继续发送登陆信息。如果连续5次均为发送登陆信息后
  92. 仍无登陆响应,则退出TCPZ状态,重新进行TCP登陆
  93. ********************************************************/
  94. void Do_G20_Out(void)
  95. {
  96. switch(gGSM_Oper_Type)
  97. {
  98. /*
  99. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  100. 1,GSM_PHONE:主要是针对电话语音方面的处理,拨号,接听,挂机,DTMF,音量调节。根据M22的特殊性,如果TCP
  101. 在线的状态下,必须要先退出TCP在线,然后才能进行相关电话业务的处理
  102. 只有在GSM的工作方式下执行这个指令
  103. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  104. */
  105. case GSM_PHONE:
  106. {
  107. Case1_GSM_PHONE();
  108. break;
  109. }
  110. /*
  111. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  112. 2,GSM_OTHER:没电话的时候CSQ的查询,根据M22的方式,则可以不通过查询CLCC来确定电话业务的状态
  113.    在GSM和TCP挂起的状态下执行
  114. +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  115. */
  116. case GSM_OTHER:
  117. {
  118. Case2_GSM_OTHER();
  119. break;
  120. }
  121. /*
  122. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  123. 3,GSM_SMS_IN:因为M22的接收SMS的方式采用的是中断方式,则直接在中断处理中处理,则可以不处理这个模块
  124. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  125. */
  126. case GSM_SMS_IN:
  127. {
  128. Case3_GSM_SMS_IN();
  129. break;
  130. }
  131. /*
  132. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  133. 4,GSM_SMS_OUT:主要处理M22通过GSM方式发送数据包,只有在GSM工作方式下
  134. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  135. */
  136. case GSM_SMS_OUT:
  137. {
  138. Case4_GSM_SMS_OUT();
  139. break;
  140. }
  141. /*
  142. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  143. 5,CHECK_GPRS_LINK:专门用于进行退出TCP和登陆TCP的操作流程,或者重新执行进入TCP的操作
  144. 在GSM工作方式和TCP挂起的方式下
  145. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  146. */
  147. case LAND_TCP_OPER:
  148. {
  149. Case5_LAND_GPRS_OPER();
  150. break;
  151. }
  152. /*
  153. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  154. 6,GPRS_DATA_OPER:M22的TCP方式发送和接收数据(),如果需要退出的时候进行AT指令的其他操作的时候,则需要
  155. 先将TCP挂起,可以进行接收SMS,或者发送SMS。如果是电话业务,则需要挂起后,然后退出TCP登陆,才可以进行
  156. 电话方面的相关业务
  157. ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  158. */
  159. case GPRS_DATA_OPER:
  160. {
  161. Case6_GPRS_DATA_OPER();
  162. break;
  163. }
  164. default:
  165. break;
  166. }
  167. }
  168. /********************************************************
  169. * 函数名:Case1_GSM_PHONE
  170. 作用域:本地文件调用
  171. * 功能:Do_G20_Out模块中的一个case执行模块,主要是针对电话语音方面的处理,拨号,接听,挂机,DTMF,音量调节方面的处理。
  172. *
  173. 参数: 只有在满足能进入这个case的条件时候,才能进入执行这个模块,
  174. * 返回值:不同的情形是需要对不同的全局变量进行重新附值
  175. * 创建人:
  176. *
  177. * 修改历史:(每条详述)
  178. 补充说明: 手柄相关的AT指令存储在buffer1中的0x5D----0x7A区域。第一个字节0x5D存储0或者1,为0则表示
  179. 后面的数据已经处理,为1则表示后面的数据未处理。0x5E存储相关的AT指令的类型,如挂机,拨号等
  180. 后面如果还有数据(电话号码等)最后数据结束以0X00作为结束标志处理。
  181. 改为M22模块后,因为其特性,在这个CASE中需要增加一些处理:
  182. 1,如果有手柄或者监听对外拨号的信令,同时如果M22处于TCP在线且被挂起的状态,则需要先执行ATH指令,退出TCP
  183. 状态,然后才能进行拨号处理
  184. ********************************************************/
  185. void Case1_GSM_PHONE(void)
  186. {
  187. unsigned int i=0,j=0,k=0,n=0;
  188. unsigned char Phone_s=0;
  189. unsigned char Phone_e=0;
  190. OperateSPIEnd();
  191. //判断监听完后,是否需要恢复语音通道的处理
  192. if( ( (gGeneral_Flag&TCP_PHONE_F_1)==0)&&(gGeneral_Flag&MONITOR_RESUME_F_1) )
  193. {
  194. gTimer=0;
  195. while(gTimer<200){Check_GSM();}
  196. Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
  197. Send_COM0_Byte('1');Send_COM0_Byte(',');
  198. Send_COM0_Byte('5');Send_COM0_Byte(0x0d);
  199. gInternal_Flag&=~M22_RETURN_OK_1;
  200. Wait_OK();
  201. if( (gInternal_Flag&M22_RETURN_OK_1)==0 );
  202. else
  203. {
  204. //2,固定调节SPEKER的接收增益
  205. gTimer=0;
  206. while(gTimer<200){Check_GSM();}
  207. Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
  208. Send_COM0_Byte('2');Send_COM0_Byte(',');Send_COM0_Byte(Handle_VOL[TWO]);Send_COM0_Byte(0x0d);
  209. gInternal_Flag&=~M22_RETURN_OK_1;
  210. Wait_OK();
  211. if( (gInternal_Flag&M22_RETURN_OK_1)==0 );
  212. else
  213. {
  214. //3,调节AT$AUVOL的接收增益
  215. gTimer=0;
  216. while(gTimer<200){Check_GSM();}
  217. Send_COM0_String((unsigned char *)AT_AUVOL,sizeof(AT_AUVOL));
  218. Send_COM0_Byte('5');Send_COM0_Byte(0x0d);
  219. gInternal_Flag&=~M22_RETURN_OK_1;
  220. Wait_OK();
  221. if( (gInternal_Flag&M22_RETURN_OK_1)==0 );
  222. else
  223. {
  224. gGeneral_Flag&=~MONITOR_RESUME_F_1;
  225. P6OUT&=~SEL_MIC;
  226.       Send_COM3_Load(4,MAIN_HANG_UP,0);
  227.       gSys_Handle=MAIN_HANG_UP;
  228. }
  229. }
  230. }
  231. }
  232. OperateSPIEnd();
  233. //返回退出电话相关业务的CASE结构的满足条件:唯一正常的跳出此
  234. if( (SRAM_Read(PHONE_AT_2)!=VAILD_2)
  235.  &&( (gPhone_Status==ACTIVE_HANDLE)||(gPhone_Status==ACTIVE_MONITOR)||(gPhone_Status==READY) )   )
  236. {
  237. if( (gGeneral_Flag&RING_F_1)==0 )
  238. {
  239. gGSM_Oper_Type=GSM_OTHER;
  240. gGSM_OTHER_Step=0;gPhone_Step=0;
  241. gTimer_GSM_AT=0;
  242. Check_GSM();
  243. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  244. OperateSPIEnd();
  245. return;
  246. }
  247. }
  248. //如果buffer1中有相应的处理数据
  249. if( (gInternal_Flag&GSM_ONEAT_SUCCESS_1)==0 )
  250. {
  251. if( gTimer_GSM_AT>600)
  252. {
  253. gTimer_GSM_AT=0;
  254. SRAM_Init();
  255. j=SRAM_Read(PHONE_AT_2);
  256. if(j==VAILD_2)
  257. {
  258. i=SRAM_Read(PHONE_AT_2+1);
  259. if    (i==H_DIAL)     gPhone_Step=1; //手柄拨号
  260. else if(i==M_DIAL) gPhone_Step=5; //监听拨号
  261. else if(i==H_ANSWER) gPhone_Step=10; //手柄接听
  262. else if(i==H_DTMF) gPhone_Step=11; //手柄DTMF拨号
  263. else if(i==H_VOLADJ) gPhone_Step=12; //手柄调节音量
  264. else if(i==H_HUNGUP) gPhone_Step=13; //手柄挂机
  265. else
  266. {
  267. Check_GSM();
  268. SRAM_Init();
  269. SRAM_Write(PHONE_AT_2,NULL_2);
  270. SRAM_Write(PHONE_AT_2+1,0);
  271. }
  272. }
  273. }
  274. else if(gGeneral_Flag&RING_F_1)
  275. {
  276. //判断是否有来电显示
  277. //+CLIP: "13670155704",129,,,,0
  278. if( Check_GSM()!=0 )
  279. {
  280. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CLIP,sizeof(String_CLIP))!=0)
  281. {
  282. gStatus1_Flag|=PHONE_ONLINE_F_1;
  283. j=SRAM_Read(PHONE_AT_2+0);
  284. i=SRAM_Read(PHONE_AT_2+1);
  285. if((i==H_HUNGUP)&&(j==VAILD_2));
  286. else
  287. {
  288. i=5;
  289. gPublic_Flag&=~ALLOW_PHONE_IN_F_1;
  290. while(1)
  291. {
  292. if(gGeneral_Buffer[i]=='"') break;
  293. i++;if(i>15) return;
  294. }
  295. i++;
  296. Phone_s=i; //第一个号码的位置序号
  297. SRAM_Init();
  298. SRAM_Write(SHANDLE_DATA_VAILD+0,VAILD_2);
  299. SRAM_Write(SHANDLE_DATA_VAILD+1,0x24);
  300. SRAM_Write(SHANDLE_DATA_VAILD+2,0x14);
  301. SRAM_Write(SHANDLE_DATA_VAILD+3,MAIN_PHONE_IN);
  302. j=i+16;
  303. k=0;
  304. while(1)
  305. {
  306. if(gGeneral_Buffer[i]!='"')
  307. {
  308. SRAM_Write(SHANDLE_DATA_VAILD+4+k,gGeneral_Buffer[i]);
  309. i++;k++;
  310. if(i>j)
  311. {
  312. n=0;
  313. break;
  314. }
  315. }
  316. else
  317. {
  318. n=k;
  319. break;
  320. }
  321. }
  322. Phone_e=i-1; //号码最后一个位的序号
  323. for(k=i;k<j;k++)
  324. {
  325. SRAM_Write(SHANDLE_DATA_VAILD+4+n+(k-i),0x20);
  326. }
  327. SRAM_Write(SHANDLE_DATA_VAILD+4+n+j-i,0x0d);
  328. gPhone_Status=INCOMING;
  329. //判断比较是否与Flash中存储的中心服务号码相同
  330. if(   ((gON_OFF_Temp0&PHONE_IN_ON)==0)
  331. &&((gCommon_Flag&CHECK_RINGPHONE_F_1)==0 ) )
  332. {
  333. for(i=0;i<Phone_e-Phone_s;i++)
  334. {
  335. gGeneral_Buffer[i]=gGeneral_Buffer[Phone_s+i];
  336. }
  337. i=1;
  338. i=Check_Allow_Phone(Phone_e-Phone_s);
  339. //与匹配的号码不一样
  340. if(i==1) gPublic_Flag&=~ALLOW_PHONE_IN_F_1;
  341. //与匹配的号码一样
  342. else gPublic_Flag|=ALLOW_PHONE_IN_F_1;
  343. gCommon_Flag|=CHECK_RINGPHONE_F_1;
  344. }
  345. }
  346. gPhone_Status=INCOMING;
  347. }
  348. }
  349. }
  350. }
  351. /********************************************************
  352. ********************************************************/
  353. //1,手柄拨号处理
  354. if(gPhone_Step==1)
  355. {
  356. gPhone_Step=4;gTimer_GSM_AT=0;
  357. }
  358. else if(gPhone_Step==4)
  359. {
  360. if( gTimer_GSM_AT>400 )
  361. {
  362. if(gPhone_Status==READY)
  363. {
  364. Send_COM0_String((unsigned char *)ATD,sizeof(ATD));
  365. //电话号码的长度
  366. k=SRAM_Read(PHONE_AT_2+2);
  367. for(j=0;j<k;j++)
  368. {
  369. Send_COM0_Byte(SRAM_Read(PHONE_AT_2+3+j));
  370. }
  371. OperateSPIEnd();
  372. Send_COM0_Byte(';');
  373. Send_COM0_Byte(0x0d);
  374. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  375. gPhone_Step=14;
  376. gTimer_GSM_AT=0;
  377. gGeneral_Flag|=DAILING_UP_F_1;
  378. gGeneral_Flag|=TCP_PHONE_F_1;
  379. gHangUp_Timer=0;
  380. gPhone_Status=DAILING;
  381. SRAM_Init();
  382. SRAM_Write(PHONE_AT_2+0,NULL_2);
  383. SRAM_Write(PHONE_AT_2+1,0);
  384. for(i=PHONE_AT_2+1;i<ECHO_SMS_2;i++)
  385. {
  386. SRAM_Write(i,0);
  387. }
  388. gStatus1_Flag|=PHONE_ONLINE_F_1;
  389. }
  390. else Case1_PHONE_Out();
  391. }
  392. else Check_GSM();
  393. }
  394. /********************************************************
  395. 2,监听拨号处理()如果属于是监听处理,则先处理将麦克的增益调节最大
  396. 将,然后将SPEAKER的接收增益调节为关闭状态,然后控制模拟开关的通道转换
  397. ********************************************************/
  398. else if(gPhone_Step==5)
  399. {
  400. if( gTimer_GSM_AT>400 )
  401. {
  402. if(gPhone_Status==READY)
  403. {
  404. gTimer=0;
  405. while(gTimer<200){Check_GSM();}
  406. Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
  407. Send_COM0_Byte('1');Send_COM0_Byte(',');
  408. Send_COM0_Byte('9');Send_COM0_Byte(0x0d);
  409. gInternal_Flag&=~M22_RETURN_OK_1;
  410. Wait_OK();
  411. if( (gInternal_Flag&M22_RETURN_OK_1)==0 )
  412. {
  413. gPhone_Step=5;gTimer_GSM_AT=0;
  414. }
  415. else
  416. {
  417. //2,固定调节SPEKER的接收增益为1
  418. gTimer=0;
  419. while(gTimer<200){Check_GSM();}
  420. Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
  421. Send_COM0_Byte('2');Send_COM0_Byte(',');Send_COM0_Byte('1');Send_COM0_Byte(0x0d);
  422. gInternal_Flag&=~M22_RETURN_OK_1;
  423. Wait_OK();
  424. if( (gInternal_Flag&M22_RETURN_OK_1)==0 )
  425. {
  426. gPhone_Step=5;gTimer_GSM_AT=0;
  427. }
  428. else
  429. {
  430. //3,固定调节AUVOL的接收增益为1
  431. gTimer=0;
  432. while(gTimer<200){Check_GSM();}
  433. Send_COM0_String((unsigned char *)AT_AUVOL,sizeof(AT_AUVOL));
  434. Send_COM0_Byte('0');Send_COM0_Byte(0x0d);
  435. gInternal_Flag&=~M22_RETURN_OK_1;
  436. Wait_OK();
  437. if( (gInternal_Flag&M22_RETURN_OK_1)==0 )
  438. {
  439. gPhone_Step=5;gTimer_GSM_AT=0;
  440. }
  441. else
  442. {
  443. gPhone_Step=9;gTimer_GSM_AT=0;
  444. }
  445. }
  446. }
  447. }
  448. else
  449. {
  450. Case1_PHONE_Out();
  451. }
  452. }
  453. else  Check_GSM();
  454. }
  455. else if(gPhone_Step==9)
  456. {
  457. if( gTimer_GSM_AT>400 )
  458. {
  459. if(gPhone_Status==READY)
  460. {
  461. Send_COM0_String((unsigned char *)ATD,sizeof(ATD));
  462. //电话号码的长度
  463. k=SRAM_Read(PHONE_AT_2+2);
  464. for(j=0;j<k;j++)
  465. {
  466. Send_COM0_Byte(SRAM_Read(PHONE_AT_2+3+j));
  467. }
  468. Send_COM0_Byte(';');
  469. Send_COM0_Byte(0x0d);
  470. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  471. gPhone_Step=14;
  472. gGeneral_Flag|=MONITOR_ON_F_1;
  473. gGeneral_Flag|=TCP_PHONE_F_1;
  474. gStatus1_Flag|=PHONE_ONLINE_F_1;
  475. gHangUp_Timer=0;
  476. gPhone_Status=DAILING;
  477. gTimer_GSM_AT=0;
  478. P6OUT|=SEL_MIC;
  479. }
  480. else
  481. {
  482. Case1_PHONE_Out();
  483. }
  484. }
  485. else Check_GSM();
  486. }
  487. /********************************************************
  488. 3,手柄接听处理
  489. ********************************************************/
  490. else if(gPhone_Step==10)
  491. {
  492. if( gTimer_GSM_AT>400  )
  493. {
  494. Send_COM0_String((unsigned char *)ATA,sizeof(ATA));
  495. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  496. gPhone_Step=15;
  497. gTimer_GSM_AT=0;
  498. OperateSPIEnd();
  499. }
  500. else Check_GSM();
  501. }
  502. /********************************************************
  503. 4,手柄DTMF处理
  504. ********************************************************/
  505. else if(gPhone_Step==11)
  506. {
  507. OperateSPIEnd();
  508. if( gTimer_GSM_AT>400  )
  509. {
  510. if(gPhone_Status==ACTIVE_HANDLE)
  511. {
  512. //检测DTMF中的数据
  513. #ifdef Debug_GSM_COM1
  514. Send_COM1_Byte('[');
  515. Send_COM1_Byte(ASCII(gDTMF_SAVE[0]/10));
  516. Send_COM1_Byte(ASCII(gDTMF_SAVE[0]%10));
  517. Send_COM1_Byte(']');
  518. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  519. #endif
  520. ////////////////////////////////////////////
  521. Send_COM0_String((unsigned char *)AT_VTS,sizeof(AT_VTS));
  522. //需要发送的音频数据
  523. k=SRAM_Read(PHONE_AT_2+3);
  524. //直接存储的是数字ASCII形式
  525. Send_COM0_Byte(k);
  526. Send_COM0_Byte(0x0d);
  527. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  528. gPhone_Step=15;
  529. gTimer_GSM_AT=0;
  530. OperateSPIEnd();
  531. }
  532. else Case1_PHONE_Out();
  533. }
  534. else Check_GSM();
  535. }
  536. /********************************************************
  537. 5,手柄音量调节处理
  538. ********************************************************/
  539. else if(gPhone_Step==12)
  540. {
  541. OperateSPIEnd();
  542. if( gTimer_GSM_AT>400  )
  543. {
  544. if( gM22_Status!=TCP_ONLINE_WORK )
  545. {
  546. Send_COM0_String((unsigned char *)AT_AUGAIN,sizeof(AT_AUGAIN));
  547. k=SRAM_Read(PHONE_AT_2+3);
  548. //直接存储的是数字ASCII形式
  549. if( (k<1)||(k>4) ) k=2;
  550. Send_COM0_Byte('2');Send_COM0_Byte(',');
  551. Send_COM0_Byte(Handle_VOL[k]);
  552. Send_COM0_Byte(0x0d);
  553. gVolume=k;
  554. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  555. gPhone_Step=15;
  556. gTimer_GSM_AT=0;
  557. OperateSPIEnd();
  558. }
  559. else Case1_PHONE_Out();
  560. }
  561. else Check_GSM();
  562. }
  563. /********************************************************
  564. 6,手柄挂机处理
  565. ********************************************************/
  566. else if(gPhone_Step==13)
  567. {
  568. if( gTimer_GSM_AT>400)
  569. {
  570. if( gPhone_Status==ACTIVE_MONITOR)
  571. {
  572. Case1_PHONE_Out();
  573. }
  574. else
  575. {
  576. Send_COM0_String((unsigned char *)ATH,sizeof(ATH));
  577. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  578. gPhone_Step=16;
  579. gTimer_GSM_AT=0;
  580. OperateSPIEnd();
  581. }
  582. }
  583. else Check_GSM();
  584. }
  585. /********************************************************
  586. 手柄拨号,监听拨号的返回状态处理
  587. ********************************************************/
  588. else if(gPhone_Step==14)
  589. {
  590. if( Check_GSM()!=0 )
  591. {
  592. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  593. //接通
  594. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_COLP,sizeof(String_COLP)))
  595. {
  596. if(gGeneral_Flag&DAILING_UP_F_1)
  597. {
  598. gGeneral_Flag&=~DAILING_UP_F_1;
  599. gPhone_Status=ACTIVE_HANDLE;
  600.     Send_COM3_Load(4,MAIN_TALKING,0);
  601.     gSys_Handle=MAIN_TALKING;
  602. //返回手柄一个接通命令
  603. }
  604. else if(gGeneral_Flag&MONITOR_ON_F_1)
  605. {
  606. gGeneral_Flag&=~MONITOR_ON_F_1;
  607. gPhone_Status=ACTIVE_MONITOR;
  608. }
  609. Case1_PHONE_Out();
  610. }
  611. //未接通,则自己主动挂断
  612. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  613. {
  614. if(gM22_Status==TCP_HANG_WORK) gGeneral_Flag|=TCP_STATUS_F_1;
  615. if(gGeneral_Flag&DAILING_UP_F_1)
  616. {
  617. gGeneral_Flag&=~DAILING_UP_F_1;
  618. gPhone_Status=READY;
  619. gGeneral_Flag&=~TCP_PHONE_F_1;
  620. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  621. }
  622. else if(gGeneral_Flag&MONITOR_ON_F_1)
  623. {
  624. gGeneral_Flag&=~MONITOR_ON_F_1;
  625. gPhone_Status=READY;
  626. P6OUT&=~SEL_MIC;
  627. }
  628. Case1_PHONE_Out();
  629. }
  630. //未接通,返回手柄挂机
  631. else if( Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)) )
  632. {
  633. if(gM22_Status==TCP_HANG_WORK) gGeneral_Flag|=TCP_STATUS_F_1;
  634. if(gGeneral_Flag&DAILING_UP_F_1)
  635. {
  636. gGeneral_Flag&=~DAILING_UP_F_1;
  637. gPhone_Status=READY;
  638. gGeneral_Flag&=~TCP_PHONE_F_1;
  639. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  640.     Send_COM3_Load(4,MAIN_HANG_UP,0);
  641.     gSys_Handle=MAIN_HANG_UP;
  642. //返回手柄挂机命令
  643. }
  644. else if(gGeneral_Flag&MONITOR_ON_F_1)
  645. {
  646. gGeneral_Flag&=~MONITOR_ON_F_1;
  647. gPhone_Status=READY;
  648. gGeneral_Flag&=~TCP_PHONE_F_1;
  649. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  650. P6OUT&=~SEL_MIC;
  651. }
  652. Case1_PHONE_Out();
  653. }
  654. //未接通,对方主动挂机,返回手柄挂机
  655. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_BUSY,sizeof(String_BUSY)))
  656. {
  657. if(gM22_Status==TCP_HANG_WORK) gGeneral_Flag|=TCP_STATUS_F_1;
  658. if(gGeneral_Flag&DAILING_UP_F_1)
  659. {
  660. gGeneral_Flag&=~DAILING_UP_F_1;
  661. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  662. gPhone_Status=READY;
  663. gGeneral_Flag&=~TCP_PHONE_F_1;
  664.     Send_COM3_Load(4,MAIN_HANG_UP,0);
  665.     gSys_Handle=MAIN_HANG_UP;
  666. //返回主动挂机命令
  667. }
  668. else if(gGeneral_Flag&MONITOR_ON_F_1)
  669. {
  670. gGeneral_Flag&=~MONITOR_ON_F_1;
  671. gPhone_Status=READY;
  672. gGeneral_Flag&=~TCP_PHONE_F_1;
  673. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  674. P6OUT&=~SEL_MIC;
  675. }
  676. Case1_PHONE_Out();
  677. }
  678. //未接通,对方无应答
  679. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOANSWER,sizeof(String_NOANSWER)))
  680. {
  681. if(gM22_Status==TCP_HANG_WORK) gGeneral_Flag|=TCP_STATUS_F_1;
  682. if(gGeneral_Flag&DAILING_UP_F_1)
  683. {
  684. gGeneral_Flag&=~DAILING_UP_F_1;
  685. gPhone_Status=READY;
  686. gGeneral_Flag&=~TCP_PHONE_F_1;
  687. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  688.     Send_COM3_Load(4,MAIN_HANG_UP,0);
  689.     gSys_Handle=MAIN_HANG_UP;
  690. //返回手柄挂机命令
  691. }
  692. else if(gGeneral_Flag&MONITOR_ON_F_1)
  693. {
  694. gGeneral_Flag&=~MONITOR_ON_F_1;
  695. gPhone_Status=READY;
  696. gGeneral_Flag&=~TCP_PHONE_F_1;
  697. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  698. P6OUT&=~SEL_MIC;
  699. }
  700. Case1_PHONE_Out();
  701. }
  702. //未接通,对方占线
  703. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOCARRIER,sizeof(String_NOCARRIER)) )
  704. {
  705. if(gM22_Status==TCP_HANG_WORK) gGeneral_Flag|=TCP_STATUS_F_1;
  706. if(gGeneral_Flag&DAILING_UP_F_1)
  707. {
  708. gGeneral_Flag&=~DAILING_UP_F_1;
  709. gPhone_Status=READY;
  710. gGeneral_Flag&=~TCP_PHONE_F_1;
  711. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  712.     Send_COM3_Load(4,MAIN_BUSY,0);
  713. //返回手柄挂机命令
  714. }
  715. else if(gGeneral_Flag&MONITOR_ON_F_1)
  716. {
  717. gGeneral_Flag&=~MONITOR_ON_F_1;
  718. gPhone_Status=READY;
  719. gGeneral_Flag&=~TCP_PHONE_F_1;
  720. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  721. P6OUT&=~SEL_MIC;
  722. }
  723. Case1_PHONE_Out();
  724. }
  725. }
  726. else
  727. {
  728. if(gGeneral_Flag&DAILING_UP_F_1)
  729. {
  730. //手柄未接通主动挂机命令的操作
  731. SRAM_Init();
  732. i=SRAM_Read(PHONE_AT_2+1);
  733. if( i==H_HUNGUP )
  734. {
  735. Send_COM0_String((unsigned char *)ATH,sizeof(ATH));
  736. gGeneral_Flag&=~MONITOR_ON_F_1;
  737. gPhone_Status=READY;
  738. gGeneral_Flag&=~TCP_PHONE_F_1;
  739. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  740. }
  741. }
  742. if(gTimer_GSM_AT>65000)
  743. {
  744. gGeneral_Flag&=~MONITOR_ON_F_1;
  745. gPhone_Status=READY;
  746. gGeneral_Flag&=~TCP_PHONE_F_1;
  747. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  748. Case1_PHONE_Out();
  749. SRAM_Init();
  750. SRAM_Write(PHONE_AT_2+0,VAILD_2);
  751. SRAM_Write(PHONE_AT_2+1,H_HUNGUP);
  752. SRAM_Write(PHONE_AT_2+2,0);
  753. }
  754. }
  755. }
  756. /********************************************************
  757. 手柄接听,DTMF拨号,音量调节的返回状态处理
  758. ********************************************************/
  759. else if(gPhone_Step==15)
  760. {
  761. if( Check_GSM()!=0 )
  762. {
  763. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  764. {
  765. if(gPhone_Status==INCOMING)
  766. {
  767. gPhone_Status=ACTIVE_HANDLE;
  768. gGeneral_Flag&=~RING_F_1;
  769. gPhone_Step=0;
  770.     Send_COM3_Load(4,MAIN_TALKING,0);
  771.     gSys_Handle=MAIN_TALKING;
  772. Case1_PHONE_Out();
  773. }
  774. else
  775. {
  776. Case1_PHONE_Out();
  777. }
  778. }
  779. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
  780. {
  781. Case1_PHONE_Out();
  782. }
  783. }
  784. else
  785. {
  786. if(gTimer_GSM_AT>10000) Case1_PHONE_Out();
  787. }
  788. }
  789. /********************************************************
  790. 手柄挂机的返回状态处理
  791. ********************************************************/
  792. else if(gPhone_Step==16)
  793. {
  794. if( Check_GSM()!=0 )
  795. {
  796. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  797. {
  798. gGeneral_Flag&=~DAILING_UP_F_1;
  799. gGeneral_Flag&=~MONITOR_ON_F_1;
  800. gPhone_Status=READY;
  801. gGeneral_Flag&=~TCP_PHONE_F_1;
  802. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  803. gGeneral_Flag&=~RING_F_1;
  804. if(gM22_Status==TCP_HANG_WORK) gGeneral_Flag|=TCP_STATUS_F_1;
  805. Case1_PHONE_Out();
  806. }
  807. }
  808. else
  809. {
  810. if(gTimer_GSM_AT>6000) Case_OverTime_Return();
  811. }
  812. }
  813. OperateSPIEnd();
  814. }
  815. /********************************************************
  816. * 函数名:Case1_PHONE_Out
  817. 作用域:本地文件调用
  818. * 功能: 将CASE1中处理的出口,但这这个出口在下一个程序循环中,仍然会进入这个CASE中
  819. * 参数:
  820. * 返回值:
  821. * 创建人:
  822. *
  823. * 修改历史:(每条详述)
  824. ********************************************************/
  825. void Case1_PHONE_Out(void)
  826. {
  827. unsigned int i=0;
  828. gPhone_Step=0;
  829. gTimer_GSM_AT=0;
  830. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  831. SRAM_Init();
  832. SRAM_Write(PHONE_AT_2+0,NULL_2);
  833. for(i=PHONE_AT_2+1;i<ECHO_SMS_2;i++)
  834. {
  835. SRAM_Write(i,0);
  836. }
  837. }
  838. /********************************************************
  839. * 函数名:Case2_GSM_OTHER
  840. 作用域:本地文件调用
  841. * 功能: 主要是处理有电话方面的时候CLCC查询,没电话的时候CSQ的查询,还有如果收到参数设置的话,则
  842. 在需要进行短消息中心号码的设置,GPRS的IP改变,端口改变后的GPRS的重新登陆设置等
  843. * 参数:
  844. * 返回值:
  845. * 创建人:
  846. *
  847. * 修改历史:(每条详述)
  848. 补充说明:因为在这个case中有需要对短消息中心号码的设置,根据通过SMS接收到新的参数设置,需要将
  849. 短消息中心号码存储先存储在buffer1的0x4B----0x5C区域。第一个字节开始就存储短消息中心
  850. 号码的第一个字节,以0x00作为结束符号。在这个case中需要将存储在buffer1中的短消息中心
  851. 号码通过AT+CSCA指令进行SIM设置。
  852. ********************************************************/
  853. void Case2_GSM_OTHER(void)
  854. {
  855. unsigned int i=0,j=0,k=0;
  856. static unsigned char CSQ_Single_Error=0;
  857. if(gGSM_OTHER_Step==0) {gGSM_OTHER_Step=1;gTimer_GSM_AT=0;Check_GSM();}
  858. /********************************************************
  859. 1,gGSM_OTHER_Step=1的时候,判断是否在这个case中进行处理
  860. A:如果无电话方面的业务,满足一定时间间隔查询信号,则进行AT+CSQ的指令操作
  861. B:判断是否有需要进行短消息中心号码的设置,如果判断有gInternal_Flag&SET_CSCA_F_1置位,则进行
  862. AT+CSCA的指令操作
  863. C:如果满足需要恢复语音方面的设置(监听后的的模块语音方面的参数设置)
  864. ********************************************************/
  865. else if(gGSM_OTHER_Step==1)
  866. {
  867. if(  (gTimer_CSQ>5)
  868.   &&((gPhone_Status==ACTIVE_HANDLE)||(gPhone_Status==ACTIVE_MONITOR)) )
  869. {
  870. if( gTimer_GSM_AT>200 )
  871. {
  872. Send_COM0_String((unsigned char *)AT_CLCC,sizeof(AT_CLCC));
  873. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  874. gTimer_GSM_AT=0;
  875. gTimer_CSQ=0;
  876. gGSM_OTHER_Step=5;
  877. }
  878. else Check_GSM();
  879. }
  880. /********************************************************
  881. A,1,无电话业务,2,处于GSM工作方式下。3。GSM信号查询时间到
  882. ********************************************************/
  883.     else if((gPhone_Status==READY)&&(gM22_Status==GSM_WORK)&&(gTimer_CSQ>GSM_CHECKCSQ_TIME) )
  884. {
  885. if( gTimer_GSM_AT>200 )
  886. {
  887. Send_COM0_String((unsigned char *)AT_CSQ,sizeof(AT_CSQ));
  888. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  889. gTimer_GSM_AT=0;
  890. gTimer_CSQ=0;
  891. gGSM_OTHER_Step=2;
  892. }
  893. else Check_GSM();
  894. }
  895. /********************************************************
  896. B,1,无电话业务,2,处于TCP挂起的工作方式下。4,GSM信号查询时间到
  897. ********************************************************/
  898. else if((gPhone_Status==READY)&&(gM22_Status==TCP_HANG_WORK)&&(gTimer_CSQ>TCP_CHECKCSQ_TIME))
  899. {
  900. if( gTimer_GSM_AT>200 )
  901. {
  902. Send_COM0_String((unsigned char *)AT_CSQ,sizeof(AT_CSQ));
  903. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  904. gTimer_GSM_AT=0;
  905. gTimer_CSQ=0;
  906. gGSM_OTHER_Step=2;
  907. }
  908. else Check_GSM();
  909. }
  910. else Case2_OTHER_Out();
  911. }
  912. /********************************************************
  913. AB-1:查询信号的模块返回
  914. ********************************************************/
  915. else if(gGSM_OTHER_Step==2)
  916. {
  917. if(Check_GSM()!=0)
  918. {
  919. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  920. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CSQ,sizeof(String_CSQ)))
  921. {
  922. if(gGeneral_Buffer[9]==',')
  923. {
  924. gSignal=(gGeneral_Buffer[7]-0x30)*10+(gGeneral_Buffer[8]-0x30);
  925. }
  926. else if(gGeneral_Buffer[7]==',')
  927. {
  928. gSignal=gGeneral_Buffer[6]-0x30;
  929. }
  930. else if(gGeneral_Buffer[8]==',')
  931. {
  932. gSignal=(gGeneral_Buffer[6]-0x30)*10+(gGeneral_Buffer[7]-0x30);
  933. }
  934. if(gSignal>31)
  935. {
  936. gSignal=0;
  937. CSQ_Single_Error++;
  938. if(CSQ_Single_Error>20)
  939. {
  940. CSQ_Single_Error=0;
  941. gGeneral_Flag|=OFF_M22_F_1;
  942. gOFF_Power_S=1;
  943. gPhone_Status=READY;
  944. gM22_ReturnER_SIM_Count=0;
  945. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  946. return;
  947. }
  948. }
  949. else
  950. {
  951. CSQ_Single_Error=0;
  952. }
  953. gGSM_OTHER_Step=3;
  954. gTimer_GSM_AT=0;
  955. gTimer_CSQ=0;
  956. }
  957. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
  958. {
  959. gGSM_OTHER_Step=3;
  960. gTimer_GSM_AT=0;
  961. gTimer_CSQ=0;
  962. }
  963. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  964. {
  965. gGSM_OTHER_Step=3;
  966. gTimer_GSM_AT=0;
  967. gTimer_CSQ=0;
  968. }
  969. }
  970. else
  971. {
  972. if(gTimer_GSM_AT>10000)
  973. {
  974. Case_OverTime_Return();
  975. }
  976. }
  977. }
  978. //查询SIM卡的状态是否正常
  979. else if(gGSM_OTHER_Step==3)
  980. {
  981. if(gTimer_GSM_AT>200)
  982. {
  983. Send_COM0_String((unsigned char *)AT_CSCA_C,sizeof(AT_CSCA_C));
  984. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  985. gTimer_GSM_AT=0;
  986. gGSM_OTHER_Step=4;
  987. }
  988. else Check_GSM();
  989. }
  990. else if(gGSM_OTHER_Step==4)
  991. {
  992. if(Check_GSM()!=0)
  993. {
  994. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;gTimer_CSQ=0;
  995.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CSCA,sizeof(String_CSCA))!=0)
  996.     {
  997.      if(  ((gInternal_Flag&CENTER_NUM_VAILD_F_1)==0)
  998. &&(gInternal_Flag&SET_CSCA_F_1) )
  999.      {
  1000.      if(gGeneral_Buffer[7]=='"')
  1001.      {
  1002.      i=8;
  1003. while(1)
  1004. {
  1005. if(gGeneral_Buffer[i]=='"') break;
  1006. i++;if(i>8+18) {gReset_M22_On_Setp=1;return;} //非法长度,则退出
  1007. }
  1008. if(i>8+1)
  1009. {
  1010. Load_SMS_CenterNum(i);
  1011. Send_COM1_String( (unsigned char *)CENTER_RELOAD,sizeof(CENTER_RELOAD) );
  1012. gInternal_Flag|=CENTER_NUM_VAILD_F_1;
  1013. gInternal_Flag&=~SET_CSCA_F_1;
  1014. }
  1015. else
  1016. {
  1017. gInternal_Flag&=~CENTER_NUM_VAILD_F_1;
  1018. gInternal_Flag|=SET_CSCA_F_1;
  1019. }
  1020. }
  1021.      }
  1022.      //表示已经找到SIM卡的网络
  1023.      gM22_ReturnER_SIM_Count=0;
  1024. if(gM22_Status==TCP_HANG_WORK)
  1025. {
  1026. //进入TCP的在线状态
  1027. gGSM_OTHER_Step=0;
  1028. gGSM_Oper_Type=LAND_TCP_OPER;
  1029. gLand_GPRS_Step=0;
  1030. gGeneral_Flag|=TCP_STATUS_F_1;
  1031. }
  1032. else
  1033. {
  1034. Case2_OTHER_Out();
  1035. }
  1036. SRAM_Init();
  1037. SRAM_Write(SHANDLE_DATA_VAILD+0,VAILD_2);
  1038. SRAM_Write(SHANDLE_DATA_VAILD+1,0x24);
  1039. SRAM_Write(SHANDLE_DATA_VAILD+2,0x06);
  1040. SRAM_Write(SHANDLE_DATA_VAILD+3,MAIN_SEND_STATUS);
  1041. SRAM_Write(SHANDLE_DATA_VAILD+4,gStatus1_Flag);
  1042. SRAM_Write(SHANDLE_DATA_VAILD+5,gStatus2_Flag);
  1043. SRAM_Write(SHANDLE_DATA_VAILD+6,0x0d);
  1044. }
  1045. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  1046. {
  1047. //表示还没有找到SIM卡的网络
  1048.      gM22_ReturnER_SIM_Count++;
  1049.      if(gM22_ReturnER_SIM_Count>20)
  1050.      {
  1051. gGeneral_Flag|=OFF_M22_F_1;
  1052. gOFF_Power_S=1;
  1053. gPhone_Status=READY;
  1054. gM22_ReturnER_SIM_Count=0;
  1055. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  1056. return;
  1057.      }
  1058.      else
  1059.      {
  1060. if(gM22_Status==TCP_HANG_WORK)
  1061. {
  1062. //进入TCP的在线状态
  1063. gGSM_OTHER_Step=0;
  1064. gGSM_Oper_Type=LAND_TCP_OPER;
  1065. gLand_GPRS_Step=0;
  1066. gGeneral_Flag|=TCP_STATUS_F_1;
  1067. }
  1068. else
  1069. {
  1070. Case2_OTHER_Out();
  1071. }
  1072. gTimer_CSQ=0;
  1073.      }
  1074. }
  1075. }
  1076. else
  1077. {
  1078. if(gTimer_GSM_AT>10000)
  1079. {
  1080. Case_OverTime_Return();
  1081. }
  1082. }
  1083. }
  1084. /********************************************************
  1085. CLCC查询返回
  1086. ********************************************************/
  1087. else if(gGSM_OTHER_Step==5)
  1088. {
  1089. if(Check_GSM()!=0)
  1090. {
  1091. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;gTimer_CSQ=0;
  1092.     if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CLCC,sizeof(String_CLCC))!=0)
  1093.     {
  1094.      Case2_OTHER_Out();
  1095.     }
  1096. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  1097. {
  1098. SRAM_Init();
  1099. SRAM_Write(PHONE_AT_2+0,VAILD_2);
  1100. SRAM_Write(PHONE_AT_2+1,H_HUNGUP);
  1101. SRAM_Write(PHONE_AT_2+2,0);
  1102. Send_COM3_Load(4,MAIN_HANG_UP,0);
  1103. gSys_Handle=MAIN_HANG_UP;
  1104. Case2_OTHER_Out();
  1105. }
  1106.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  1107.     {
  1108.      Case2_OTHER_Out();
  1109.     }
  1110. }
  1111. else
  1112. {
  1113. if(gTimer_GSM_AT>10000)
  1114. {
  1115. Case2_OTHER_Out();
  1116. }
  1117. }
  1118. }
  1119. }
  1120. /********************************************************
  1121. * 函数名:Case2_OTHER_Out
  1122. 作用域:本地文件调用
  1123. * 功能: 将CASE2中处理的出口
  1124. * 参数:
  1125. * 返回值:
  1126. * 创建人:
  1127. *
  1128. * 修改历史:(每条详述)
  1129. ********************************************************/
  1130. void Case2_OTHER_Out(void)
  1131. {
  1132. gGSM_Oper_Type=GSM_SMS_IN;
  1133. gGSM_OTHER_Step=0;gPhone_Step=0;
  1134. gTimer_GSM_AT=0;
  1135. Check_GSM();
  1136. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1137. OperateSPIEnd();
  1138. }
  1139. /********************************************************
  1140. * 函数名:Case3_GSM_SMS_IN
  1141. 作用域:本地文件调用
  1142. * 功能:
  1143. * 参数:
  1144. * 返回值:
  1145. * 创建人:
  1146. *
  1147. * 修改历史:(每条详述)
  1148. 补充说明:
  1149. ********************************************************/
  1150. void Case3_GSM_SMS_IN(void)
  1151. {
  1152. Check_GSM();
  1153. Case3_SMSIN_Out();
  1154. }
  1155. /********************************************************
  1156. * 函数名:Case3_SMSIN_Out
  1157. 作用域:本地文件调用
  1158. * 功能: 将CASE3中处理的出口
  1159. * 参数:
  1160. * 返回值:
  1161. * 创建人:
  1162. *
  1163. * 修改历史:(每条详述)
  1164. ********************************************************/
  1165. void Case3_SMSIN_Out(void)
  1166. {
  1167. gGSM_Oper_Type=GSM_SMS_OUT;
  1168. gSMS_OUT_Step=0;
  1169. gTimer_GSM_AT=0;
  1170. Check_GSM();
  1171. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1172. OperateSPIEnd();
  1173. }
  1174. /********************************************************
  1175. * 函数名:Case4_GSM_SMS_OUT
  1176. 作用域:本地文件调用
  1177. * 功能:
  1178. * 参数:
  1179. * 返回值:
  1180. * 创建人:
  1181. *
  1182. * 修改历史:(每条详述)
  1183. 2004年12月15日
  1184. 补充说明:
  1185. ********************************************************/
  1186. void Case4_GSM_SMS_OUT(void)
  1187. {
  1188. unsigned int i=0,j=0,k=0,x=0,y=0;
  1189. unsigned char nTemp_Length=0;
  1190. unsigned int  iLength=0;
  1191. //1,手柄正在拨号,2,监听正在拨号,3有电话打入
  1192. if( (gGeneral_Flag&RING_F_1)||(gGeneral_Flag&DAILING_UP_F_1)||(gGeneral_Flag&MONITOR_ON_F_1) )
  1193. {
  1194. Case4_SMSOUT_Out();
  1195. return;
  1196. }
  1197. //2,如果目标号码无效,则不能进行SMS的发送操作
  1198. if( (gGeneral_Flag&NUM1_VAILD_F_1)==0 )
  1199. {
  1200. Case4_SMSOUT_Out();
  1201. return;
  1202. }
  1203. //3,如果短消息中心号码无效,则不能 SMS的发送操作
  1204. if( (gInternal_Flag&CENTER_NUM_VAILD_F_1)==0)
  1205. {
  1206. Case4_SMSOUT_Out();
  1207. return;
  1208. }
  1209. //4,否则的可以进行下面的操作
  1210. if(gSMS_OUT_Step==0)  gSMS_OUT_Step=1;
  1211. else if(gSMS_OUT_Step==1)
  1212. {
  1213. gSend_Type1=0;
  1214. SRAM_Init();
  1215. i=SRAM_Read(ECHO_SMS_2);
  1216. j=SRAM_Read(OTHER_SMS_2);
  1217. //第一类的数据发送
  1218. if( (i!=NULL_2)&&(gInternal_Flag&ALLOW_DATA_F_1) )
  1219. {
  1220. gSMS_OUT_Step=7;gTimer_GSM_AT=0;
  1221. #ifdef Debug_GSM_COM1
  1222.            Send_COM1_Byte('2');
  1223. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1224. #endif
  1225. gSend_Type1=1;
  1226. }
  1227. else if( (j!=NULL_2)&&(gInternal_Flag&ALLOW_DATA_F_1) )
  1228. {
  1229. gSMS_OUT_Step=7;gTimer_GSM_AT=0;
  1230. #ifdef Debug_GSM_COM1
  1231.            Send_COM1_Byte('3');
  1232. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1233. #endif
  1234. gSend_Type1=2;
  1235. }
  1236. //第二类数据的发送
  1237. else if( (gInternal_Flag&SEND_CIRCLE_F_1)&&(gInternal_Flag&ALLOW_DATA_F_1) )
  1238. {
  1239. gInternal_Flag&=~SEND_CIRCLE_F_1;
  1240. gInternal_Flag&=~ALLOW_DATA_F_1;
  1241. gGSM_Work_Count=0;gCheck_Data=0;
  1242. gSMS_OUT_Step=17;
  1243. gTimer_GSM_AT=0;
  1244. #ifdef Debug_GSM_COM1
  1245.            Send_COM1_Byte('4');
  1246. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  1247. #endif
  1248. if(gCycle_Send_Status==WATCH_DATA)
  1249. {
  1250. if(gWatch_Count>0) gWatch_Count--;
  1251. }
  1252. }
  1253. /**************************************************************************************
  1254. 第三类数据的TCP发送(外接部件的大量数据-存储在外部SRAM中)
  1255. **************************************************************************************/
  1256. else if( (gOther_Flag&ALLOW_SEND_RECORD_F_1)&&(gInternal_Flag&ALLOW_DATA_F_1) )
  1257. {
  1258. SRAM_Init();
  1259. if( SRAM_Read(SRAM_SEND_VAILD)==VAILD_2 )
  1260. {
  1261. //判断长度
  1262. j = SRAM_Read(SRAM_SEND_LENGTH_H);
  1263. j <<= 8;
  1264. j += SRAM_Read(SRAM_SEND_LENGTH_L);
  1265. if(j>120)
  1266. {
  1267. gOther_Flag&=~RECORD_DATA_F_1;
  1268. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  1269. SRAM_Init();
  1270. SRAM_Write(SRAM_SEND_VAILD,NULL_2);
  1271. SRAM_Write(SRAM_SEND_LENGTH_H,0);
  1272. SRAM_Write(SRAM_SEND_LENGTH_L,0);
  1273. }
  1274. else
  1275. {
  1276. gSMS_OUT_Step=22;
  1277. gTimer_GSM_AT=0;
  1278. #ifdef Debug_GSM_COM1
  1279. Send_COM1_Byte('F');Send_COM1_String((unsigned char *)TYPE,sizeof(TYPE));
  1280. #endif
  1281. }
  1282. }
  1283. else
  1284. {
  1285. gOther_Flag&=~RECORD_DATA_F_1;
  1286. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  1287. SRAM_Init();
  1288. SRAM_Write(SRAM_SEND_VAILD,NULL_2);
  1289. SRAM_Write(SRAM_SEND_LENGTH_H,0);
  1290. SRAM_Write(SRAM_SEND_LENGTH_L,0);
  1291. Case4_SMSOUT_Out();
  1292. }
  1293. }
  1294. else
  1295. {
  1296. Case4_SMSOUT_Out();
  1297. }
  1298. }
  1299. /********************************************************
  1300. 第一类GSM数据的发送:
  1301. 1-1:
  1302. 0x7B 存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,为0则表示已经处理完了SMS
  1303. 0x7C 存储数据包的命令字在这里则为nCommand
  1304. 0x7D 存储数据包的ACK的值ACK
  1305. 0x7E 存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
  1306. 0x7F   从这开始存储数据包
  1307. 1-2:
  1308. 0xB1 存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,为0则表示已经处理完了SMS
  1309. 0xB2 存储数据包的命令字在这里则为nCommand
  1310. 0xB3 存储数据包的ACK的值ACK
  1311. 0xB4 存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
  1312. 0xB5   从这开始存储数据包
  1313. ********************************************************/
  1314. else if(gSMS_OUT_Step==7)
  1315. {
  1316. if(gTimer_GSM_AT>300)
  1317. {
  1318. if(gSend_Type1==1) Send_Type1_GSM_Data_One(ECHO_SMS_2);
  1319. else if(gSend_Type1==2) Send_Type1_GSM_Data_One(OTHER_SMS_2);
  1320. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  1321. gSMS_OUT_Step=8;
  1322. gTimer_GSM_AT=0;
  1323. }
  1324. else Check_GSM();
  1325. }
  1326. else if(gSMS_OUT_Step==8)
  1327. {
  1328. if(Check_GSM()!=0)
  1329. {
  1330. gTimer_GSM_AT=0;
  1331. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_Input_Label,sizeof(String_Input_Label)))
  1332. {
  1333. gSMS_OUT_Step=9;
  1334. }
  1335.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  1336.     {
  1337.      Case4_OverTime_Out(gSend_Type1);
  1338. Case4_SMSOUT_Out();
  1339.     }
  1340. }
  1341. else
  1342. {
  1343. if(gTimer_GSM_AT>10000) Case_OverTime_Return();
  1344. }
  1345. }
  1346. else if(gSMS_OUT_Step==9)
  1347. {
  1348. if(gTimer_GSM_AT>200)
  1349. {
  1350. if(gSend_Type1==1) Send_Type1_GSM_Data_Two(ECHO_SMS_2);
  1351. else if(gSend_Type1==2) Send_Type1_GSM_Data_Two(OTHER_SMS_2);
  1352. gSMS_OUT_Step=10;
  1353. gTimer_GSM_AT=0;
  1354. }
  1355. else Check_GSM();
  1356. }
  1357. else if(gSMS_OUT_Step==10)
  1358. {
  1359. if(Check_GSM()!=0)
  1360. {
  1361. gTimer_GSM_AT=0;
  1362.      Case4_OverTime_Out(gSend_Type1);
  1363. Case4_SMSOUT_Out();
  1364. }
  1365. else
  1366. {
  1367. if(gTimer_GSM_AT>60000)
  1368. {
  1369. Case4_OverTime_Out(gSend_Type1);
  1370. Case4_SMSOUT_Out();
  1371. }
  1372. }
  1373. }
  1374.   /********************************************************
  1375. 二,第二类GSM数据的发送
  1376. 存储在区域的数据Circle_Buffer[]
  1377. 1,行车轨迹数据 ;3,报警数据;4,监控数据,5,历史轨迹数据
  1378. 这类周期发送的数据因为不能同时存在发送的情形,则可以均用Circle_Buffer[]作为
  1379. 存储周期数据发送。
  1380. gCycle_Send_Status=0 表示无任何周期性的数据发送
  1381. gCycle_Send_Status=1 表示属于行车轨迹的周期数据正在发送
  1382. gCycle_Send_Status=2 表示报警的周期数据正在发送
  1383. gCycle_Send_Status=3 表示监控数据正在发送(另外还有标志位表示属于那一类型的监控数据)
  1384. gCycle_Send_Status=4 表示历史轨迹数据正在发送(另外还有标志位表示属于那一类型的历史轨迹数据)
  1385. gCycle_Send_Status=5 表示是盲区点补偿发送的数据
  1386. AT+CMGS=27
  1387. >
  1388. 0891683108705505F011000D91683167108230F70004000CFF4FB008000101000102090D
  1389. 27的长度为11000D91683167108230F70004000CFF4FB008000101000102090D
  1390. ********************************************************/
  1391. else if(gSMS_OUT_Step==17)
  1392. {
  1393. if( gTimer_GSM_AT>200)
  1394. {
  1395. nTemp_Length=SRAM_Read(TARGET_NUMBER1_2); //目标电话号码的长度
  1396. nTemp_Length=(nTemp_Length+1)/2+7+1+gCircle_Buffer_Point; //要发送的数据长度
  1397. Ask_SMS_Send(nTemp_Length); //发送AT指令AT+CMGS=(SMS长度)
  1398. gInternal_Flag|=GSM_ONEAT_SUCCESS_1; //发送AT指令的标志置1
  1399. gSMS_OUT_Step=18;
  1400. gTimer_GSM_AT=0;
  1401. }
  1402. else Check_GSM();
  1403. }
  1404. else if(gSMS_OUT_Step==18)
  1405. {
  1406. if(Check_GSM()!=0)
  1407. {
  1408. gTimer_GSM_AT=0;
  1409. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_Input_Label,sizeof(String_Input_Label)))
  1410. {
  1411. gSMS_OUT_Step=19;
  1412. }
  1413.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  1414.     {
  1415. OperateSPIEnd();
  1416. for(i=0;i<sizeof(gCircle_Buffer);i++) gCircle_Buffer[i]=0;
  1417. gCircle_Buffer_Point=0;
  1418. Case4_SMSOUT_Out();
  1419.     }
  1420. }
  1421. else
  1422. {
  1423. if(gTimer_GSM_AT>10000) Case_OverTime_Return();
  1424. }
  1425. }
  1426. else if(gSMS_OUT_Step==19)
  1427. {
  1428. if(gTimer_GSM_AT>200)
  1429. {
  1430. //这个操作发送完000400
  1431. Send_SMS_Head();
  1432. OperateSPIEnd();
  1433. //发送gCircle_Buffer[]周期数据中的数据
  1434. Send_Circle_GSM_TypeD();
  1435. Send_COM0_Byte(0x1A);
  1436. gSMS_OUT_Step=20;
  1437. gTimer_GSM_AT=0;
  1438. }
  1439. }
  1440. else if(gSMS_OUT_Step==20)
  1441. {
  1442. if(Check_GSM()!=0)
  1443. {
  1444. gTimer_GSM_AT=0;
  1445. OperateSPIEnd();
  1446. for(i=0;i<sizeof(gCircle_Buffer);i++) gCircle_Buffer[i]=0;
  1447. gCircle_Buffer_Point=0;
  1448. Case4_SMSOUT_Out();
  1449. }
  1450. else
  1451. {
  1452. if(gTimer_GSM_AT>60000)
  1453. {
  1454. gTimer_GSM_AT=0;
  1455. for(i=0;i<sizeof(gCircle_Buffer);i++) gCircle_Buffer[i]=0;
  1456. gCircle_Buffer_Point=0;
  1457. Case4_SMSOUT_Out();
  1458. }
  1459. }
  1460. }
  1461. /********************************************************
  1462. 四,第四类GSM数据的发送,外部记录仪的数据发送。注意只能发送
  1463. 外部数据的长度有限制
  1464. ********************************************************/
  1465. else if( gSMS_OUT_Step==22 )
  1466. {
  1467. if( gTimer_GSM_AT>200)
  1468. {
  1469. SRAM_Init();
  1470. iLength = SRAM_Read(SRAM_SEND_LENGTH_H);
  1471. iLength <<= 8;
  1472. iLength += SRAM_Read(SRAM_SEND_LENGTH_L);
  1473. nTemp_Length=SRAM_Read(TARGET_NUMBER1_2); //目标电话号码的长度
  1474. nTemp_Length=(nTemp_Length+1)/2+7+1+(char)iLength+13; //要发送的数据长度
  1475. Ask_SMS_Send(nTemp_Length); //发送AT指令AT+CMGS=(SMS长度)
  1476. gInternal_Flag|=GSM_ONEAT_SUCCESS_1; //发送AT指令的标志置1
  1477. gSMS_OUT_Step=23;
  1478. gTimer_GSM_AT=0;
  1479. }
  1480. else Check_GSM();
  1481. }
  1482. else if( gSMS_OUT_Step==23 )
  1483. {
  1484. if(Check_GSM()!=0)
  1485. {
  1486. gTimer_GSM_AT=0;
  1487. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_Input_Label,sizeof(String_Input_Label)))
  1488. {
  1489. gSMS_OUT_Step=24;
  1490. }
  1491.     else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER))!=0)
  1492.     {
  1493. gOther_Flag&=~RECORD_DATA_F_1;
  1494. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  1495. SRAM_Init();
  1496. SRAM_Write(SRAM_SEND_VAILD,NULL_2);
  1497. SRAM_Write(SRAM_SEND_LENGTH_H,0);
  1498. SRAM_Write(SRAM_SEND_LENGTH_L,0);
  1499. Case4_SMSOUT_Out();
  1500.     }
  1501. }
  1502. else
  1503. {
  1504. if(gTimer_GSM_AT>10000) Case_OverTime_Return();
  1505. }
  1506. }
  1507. else if( gSMS_OUT_Step==24 )
  1508. {
  1509. if(gTimer_GSM_AT>200)
  1510. {
  1511. //这个操作发送完000400
  1512. Send_SMS_Head();
  1513. OperateSPIEnd();
  1514. Send_Circle_GSM_TypeE();
  1515. Send_COM0_Byte(0x1A);
  1516. gSMS_OUT_Step=25;
  1517. gTimer_GSM_AT=0;
  1518. }
  1519. }
  1520. else if(gSMS_OUT_Step==25)
  1521. {
  1522. if(Check_GSM()!=0)
  1523. {
  1524. gOther_Flag&=~RECORD_DATA_F_1;
  1525. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  1526. SRAM_Init();
  1527. SRAM_Write(SRAM_SEND_VAILD,NULL_2);
  1528. SRAM_Write(SRAM_SEND_LENGTH_H,0);
  1529. SRAM_Write(SRAM_SEND_LENGTH_L,0);
  1530. Case4_SMSOUT_Out();
  1531. }
  1532. else
  1533. {
  1534. if(gTimer_GSM_AT>60000)
  1535. {
  1536. gTimer_GSM_AT=0;
  1537. gOther_Flag&=~RECORD_DATA_F_1;
  1538. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  1539. SRAM_Init();
  1540. SRAM_Write(SRAM_SEND_VAILD,NULL_2);
  1541. SRAM_Write(SRAM_SEND_LENGTH_H,0);
  1542. SRAM_Write(SRAM_SEND_LENGTH_L,0);
  1543. Case4_SMSOUT_Out();
  1544. }
  1545. }
  1546. }
  1547. }
  1548. /********************************************************
  1549. * 函数名:Case4_SMSOUT_Out
  1550. 作用域:本地文件调用
  1551. * 功能: 将CASE3中处理的出口
  1552. * 参数:
  1553. * 返回值:
  1554. * 创建人:
  1555. *
  1556. * 修改历史:(每条详述)
  1557. ********************************************************/
  1558. void Case4_SMSOUT_Out(void)
  1559. {
  1560. gGSM_Oper_Type=LAND_TCP_OPER;
  1561. gLand_GPRS_Step=0;
  1562. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1563. gSMS_OUT_Step=0;gTimer_GSM_AT=0;
  1564. OperateSPIEnd();
  1565. }
  1566. /********************************************************
  1567. * 函数名:Case4_OverTime_Out
  1568. 作用域:本地文件调用
  1569. * 功能:
  1570. * 参数:
  1571. * 返回值:
  1572. * 创建人:
  1573. *
  1574. * 修改历史:(每条详述)
  1575. ********************************************************/
  1576. void Case4_OverTime_Out(unsigned char Clear_Flag)
  1577. {
  1578. unsigned int i=0;
  1579. OperateSPIEnd();
  1580. SRAM_Init();
  1581. if(Clear_Flag==1)
  1582. {
  1583. SRAM_Write(ECHO_SMS_2+0,NULL_2);
  1584. for(i=ECHO_SMS_2+1;i<OTHER_SMS_2;i++)
  1585. {
  1586. SRAM_Write(i,0);
  1587. }
  1588. }
  1589. else if(Clear_Flag==2)
  1590. {
  1591. SRAM_Write(OTHER_SMS_2+0,NULL_2);
  1592. for(i=OTHER_SMS_2+1;i<END_SRAM_2;i++)
  1593. {
  1594. SRAM_Write(i,0);
  1595. }
  1596. }
  1597. gSend_Type1=0;
  1598. }
  1599. /********************************************************
  1600. * 函数名:Case5_CHECK_GPRS_LINK
  1601. 作用域:本地文件调用
  1602. * 功能:1,进行TCP登陆 2,退出TCP
  1603. * 参数:
  1604. * 返回值:
  1605. * 创建人:
  1606. *
  1607. * 修改历史:(每条详述)
  1608. ********************************************************/
  1609. void Case5_LAND_GPRS_OPER(void)
  1610. {
  1611. unsigned int i=0,j=0,k=0;
  1612. if(gLand_GPRS_Step==0) {gLand_GPRS_Step=1;gTimer_GSM_AT=0;Check_GSM();}
  1613. else if(gLand_GPRS_Step==1)
  1614. {
  1615. /********************************************************
  1616. A 1,如果处于GSM的工作方式下,2,有需要进行TCP登陆的标志
  1617. 首先执行一个ATH指令
  1618. ********************************************************/
  1619. if( (gM22_Status==GSM_WORK)&&(gGeneral_Flag&LAND_TCP_F_1)
  1620. &&((gGeneral_Flag&LAND_TCP_ERROR_F_1)==0)
  1621. &&((gGeneral_Flag&TCP_PHONE_F_1)==0) )
  1622. {
  1623. if( gTimer_GSM_AT>500 )
  1624. {
  1625. Send_COM0_String((unsigned char *)ATH,sizeof(ATH));
  1626. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  1627. gTimer_GSM_AT=0;
  1628. gLand_GPRS_Step=2;
  1629. }
  1630. else Check_GSM();
  1631. }
  1632. /********************************************************
  1633. B 1,如果处于TCP在线挂起状态下,2,有需要进行TCP准备好退出登陆的标志||
  1634. ********************************************************/
  1635. else if( (gM22_Status==TCP_HANG_WORK)&&(gOther_Flag&QUIT_TCP_F_1) )
  1636. {
  1637. if( gTimer_GSM_AT>500 )
  1638. {
  1639. Send_COM0_String((unsigned char *)ATH,sizeof(ATH));
  1640. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  1641. gTimer_GSM_AT=0;
  1642. gLand_GPRS_Step=12;
  1643. }
  1644. else Check_GSM();
  1645. }
  1646. /********************************************************
  1647. C 1,TCP在线挂起状态 ,2,判断有需要需要发送ATO操作的标志
  1648. ********************************************************/
  1649. else if( (gM22_Status==TCP_HANG_WORK)
  1650. &&(gGeneral_Flag&TCP_STATUS_F_1)
  1651. &&((gGeneral_Flag&TCP_PHONE_F_1)==0)  )
  1652. {
  1653. if( gTimer_GSM_AT>500 )
  1654. {
  1655. Send_COM0_String((unsigned char *)ATO,sizeof(ATO));
  1656. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  1657. gTimer_GSM_AT=0;
  1658. gLand_GPRS_Step=14;
  1659. }
  1660. else Check_GSM();
  1661. }
  1662. /********************************************************
  1663. 如果上面条件均不满足,则退出这个CASE
  1664. ********************************************************/
  1665. else
  1666. {
  1667. if(gM22_Status==GSM_WORK) gOther_Flag&=~QUIT_TCP_F_1;
  1668. /********************************************************
  1669. 判断在GSM的状态下是否需要进行TCP登陆的操作
  1670. 1,IP地址有效,2,TCP开关量开启状态,3,GSM的工作方式,4,允许进行TCP登陆的操作
  1671. ********************************************************/
  1672. if(   (gGeneral_Flag&TCP_IP_VALID_1)
  1673. &&((gON_OFF_Temp0&TCP_LAND_ON_OFF_1)==0)
  1674. &&(gM22_Status==GSM_WORK)
  1675. &&((gGeneral_Flag&LAND_TCP_ERROR_F_1)==0) )
  1676. {
  1677. //1,如果有报警信息
  1678. if(   (gCycle_Send_Status==ALARM_DATA)
  1679. &&(gCycle_Alarm>0) )
  1680. {
  1681. gGeneral_Flag|=LAND_TCP_F_1;
  1682. gGSM_Oper_Type=LAND_TCP_OPER;
  1683. gLand_GPRS_Step=0;
  1684. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1685. }
  1686. //2,如果有行车轨迹,且行车轨迹的周期小于20分钟,则允许长期在线,则进行登陆TCP的操作
  1687. else if(   (gCycle_Send_Status==TRACK_DATA_TIME)
  1688.  &&(gCycle_TCP<TCP_TRACK_MINTIME)
  1689.  &&(gCycle_TCP>0) )
  1690. {
  1691. gGeneral_Flag|=LAND_TCP_F_1;
  1692. gGSM_Oper_Type=LAND_TCP_OPER;
  1693. gLand_GPRS_Step=0;
  1694. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1695. }
  1696. //3,如果是行车轨迹周期大于20分钟,且已经到有需要发送的数据包,则需要进行登陆
  1697. else if(  (gCycle_Send_Status==TRACK_DATA_TIME)
  1698. &&(gCycle_TCP>=TCP_TRACK_MINTIME)
  1699. &&(gInternal_Flag&SEND_CIRCLE_F_1) )
  1700. {
  1701. gGeneral_Flag|=LAND_TCP_F_1;
  1702. gGSM_Oper_Type=LAND_TCP_OPER;
  1703. gLand_GPRS_Step=0;
  1704. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1705. }
  1706. //4,如果属于历史轨迹查询或者重点监控状态
  1707. else if(   (gCycle_Send_Status==PASS_DATA)
  1708.  ||(gCycle_Send_Status==WATCH_DATA)  )
  1709. {
  1710. gGeneral_Flag|=LAND_TCP_F_1;
  1711. gGSM_Oper_Type=LAND_TCP_OPER;
  1712. gLand_GPRS_Step=0;
  1713. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1714. }
  1715. //5,如果属于间隔距离传输数据点,并且TCP属于常开状态,则需要登陆TCP
  1716. else if(   (gCycle_Send_Status==TRACK_DATA_DISTANCE)
  1717.  &&((gON_OFF_Temp1&DISTANCE_TCP_ON_1)==0) )
  1718. {
  1719. gGeneral_Flag|=LAND_TCP_F_1;
  1720. gGSM_Oper_Type=LAND_TCP_OPER;
  1721. gLand_GPRS_Step=0;
  1722. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1723. }
  1724. //6,如果属于间隔距离传输数据点,并且TCP属于不常在线状态,但有数据点需要发送,则需要进行登陆
  1725. else if(   (gCycle_Send_Status==TRACK_DATA_DISTANCE)
  1726.  &&(gON_OFF_Temp1&DISTANCE_TCP_ON_1)
  1727.  &&(gInternal_Flag&SEND_CIRCLE_F_1) )
  1728. {
  1729. gGeneral_Flag|=LAND_TCP_F_1;
  1730. gGSM_Oper_Type=LAND_TCP_OPER;
  1731. gLand_GPRS_Step=0;
  1732. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1733. }
  1734. //7, 如果有记录仪的数据需要上行给数据中心的,则先进行登陆TCP的操作
  1735. else if( gOther_Flag&RECORD_DATA_F_1)
  1736. {
  1737. gGeneral_Flag|=LAND_TCP_F_1;
  1738. gGSM_Oper_Type=LAND_TCP_OPER;
  1739. gLand_GPRS_Step=0;
  1740. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1741. }
  1742. //8,如果其他要发送的数据,则需要先登陆TCP
  1743. else if( gOther_Flag&NEED_LADN_TCP_F_1 )
  1744. {
  1745. gOther_Flag&=~NEED_LADN_TCP_F_1;
  1746. gGeneral_Flag|=LAND_TCP_F_1;
  1747. gGSM_Oper_Type=LAND_TCP_OPER;
  1748. gLand_GPRS_Step=0;
  1749. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1750. }
  1751. //如果其他
  1752. else
  1753. {
  1754. gGSM_Oper_Type=GSM_PHONE;gPhone_Step=0;
  1755. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1756. gLand_GPRS_Step=0;
  1757. }
  1758. }
  1759. else
  1760. {
  1761. gGSM_Oper_Type=GSM_PHONE;gPhone_Step=0;
  1762. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  1763. gLand_GPRS_Step=0;
  1764. }
  1765. gTimer_GSM_AT=0;
  1766. OperateSPIEnd();
  1767. }
  1768. }
  1769. else if(gLand_GPRS_Step==2)
  1770. {
  1771. if( Check_GSM()!=0 )
  1772. {
  1773. gLand_GPRS_Step=3;
  1774. }
  1775. else
  1776. {
  1777. if(gTimer_GSM_AT>10000) Case_OverTime_Return();
  1778. }
  1779. }
  1780. else if(gLand_GPRS_Step==3)
  1781. {
  1782. if( gTimer_GSM_AT>500 )
  1783. {
  1784. Send_COM0_String((unsigned char *)AT_CGDCONT,sizeof(AT_CGDCONT));
  1785. j=SRAM_Read(GPRS_APN_ADDRESS2_2);
  1786. for(i=0;i<j;i++)
  1787. {
  1788. Send_COM0_Byte(SRAM_Read(GPRS_APN_ADDRESS2_2+1+i));
  1789. }
  1790. Send_COM0_Byte(0x0d);
  1791. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  1792. gTimer_GSM_AT=0;
  1793. gLand_GPRS_Step=4;
  1794. }
  1795. else Check_GSM();
  1796. }
  1797. //A-1
  1798. else if(gLand_GPRS_Step==4)
  1799. {
  1800. if( Check_GSM()!=0 )
  1801. {
  1802. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  1803. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  1804. {
  1805. gLand_GPRS_Step=5;
  1806. }
  1807. }
  1808. else
  1809. {
  1810. if(gTimer_GSM_AT>10000)
  1811. {
  1812. TCP_Land_Error_Return();
  1813. }
  1814. }
  1815. }
  1816. //A-2
  1817. else if(gLand_GPRS_Step==5)
  1818. {
  1819. if( gTimer_GSM_AT>500 )
  1820. {
  1821. Send_COM0_String((unsigned char *)AT_CGPCO,sizeof(AT_CGPCO));
  1822. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  1823. gTimer_GSM_AT=0;
  1824. gLand_GPRS_Step=6;
  1825. }
  1826. else Check_GSM();
  1827. }
  1828. //A-3
  1829. else if(gLand_GPRS_Step==6)
  1830. {
  1831. if( Check_GSM()!=0 )
  1832. {
  1833. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  1834. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  1835. {
  1836. gLand_GPRS_Step=7;
  1837. }
  1838. }
  1839. else
  1840. {
  1841. if(gTimer_GSM_AT>10000)
  1842. {
  1843. //表示登陆TCP失败的处理
  1844. TCP_Land_Error_Return();
  1845. }
  1846. }
  1847. }
  1848. //A-4
  1849. else if(gLand_GPRS_Step==7)
  1850. {
  1851. if( gTimer_GSM_AT>500 )
  1852. {
  1853. Send_COM0_String((unsigned char *)AT_DESTINFO,sizeof(AT_DESTINFO));
  1854. //1,从buffer1中取出IP地址
  1855. Send_COM0_Byte('"');
  1856. j=SRAM_Read(GPRS_IP_ADDRESS1_2);
  1857. for(i=0;i<j;i++)
  1858. {
  1859. Send_COM0_Byte(SRAM_Read(GPRS_IP_ADDRESS1_2+1+i));
  1860. }
  1861. Send_COM0_Byte('"');
  1862. Send_COM0_Byte(',');
  1863. Send_COM0_Byte('1');
  1864. Send_COM0_Byte(',');
  1865. //2,从buffer中取出端口号,在buffer1中端口号是以5位ASCII形式存储的,如果实际有效数据不够5位,则以前面填0
  1866. //例如:端口号为9988,在buffer1中相应的区域存储为30 39 39 38 38
  1867. gGeneral_Buffer[0]=SRAM_Read(GPRS_SOCKET1_2);
  1868. gGeneral_Buffer[1]=SRAM_Read(GPRS_SOCKET1_2+1);
  1869. gGeneral_Buffer[2]=SRAM_Read(GPRS_SOCKET1_2+2);
  1870. gGeneral_Buffer[3]=SRAM_Read(GPRS_SOCKET1_2+3);
  1871. gGeneral_Buffer[4]=SRAM_Read(GPRS_SOCKET1_2+4);
  1872. OperateSPIEnd();
  1873. i=0;
  1874. while(1)
  1875. {
  1876. //从最高位开始判断,如果不为0,则后面的均为有效数据
  1877. if(gGeneral_Buffer[i]!=0x30) break;
  1878. i++;
  1879. if(i==5) break;
  1880. }
  1881. if(i<5)
  1882. {
  1883. for(j=i;j<5;j++)
  1884. {
  1885. Send_COM0_Byte(gGeneral_Buffer[j]);
  1886. }
  1887. }
  1888. else
  1889. {
  1890. gLand_GPRS_Step=0;
  1891. return;
  1892. }
  1893. Send_COM0_Byte(0x0d);
  1894. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  1895. gLand_GPRS_Step=8;
  1896. gTimer_GSM_AT=0;
  1897. }
  1898. else  Check_GSM();
  1899. }
  1900. //A-5
  1901. else if(gLand_GPRS_Step==8)
  1902. {
  1903. if( Check_GSM()!=0 )
  1904. {
  1905. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  1906. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_DESTINFO,sizeof(String_DESTINFO)))
  1907. {
  1908. gLand_GPRS_Step=9;
  1909. }
  1910. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
  1911. {
  1912. TCP_Land_Error_Return();
  1913. }
  1914. }
  1915. else
  1916. {
  1917. if(gTimer_GSM_AT>10000)
  1918. {
  1919. //表示登陆TCP失败的处理
  1920. TCP_Land_Error_Return();
  1921. }
  1922. }
  1923. }
  1924. //A-6
  1925. else if(gLand_GPRS_Step==9)
  1926. {
  1927. if(gTimer_GSM_AT>1500)
  1928. {
  1929. Send_COM0_String((unsigned char *)ATD_97,sizeof(ATD_97));
  1930. gInternal_Flag|=GSM_ONEAT_SUCCESS_1;
  1931. gLand_GPRS_Step=10;
  1932. gTimer_GSM_AT=0;
  1933. }
  1934. else Check_GSM();
  1935. }
  1936. //A-7
  1937. else if(gLand_GPRS_Step==10)
  1938. {
  1939. if( Check_GSM()!=0 )
  1940. {
  1941. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  1942. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_L_TCP,sizeof(String_L_TCP)))
  1943. {
  1944. gLand_GPRS_Step=11;
  1945. }
  1946. //返回ERROR,说明SIM卡不支持TCP的工作方式或者说任何场强信号很弱的时候
  1947. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
  1948. {
  1949. TCP_Land_Error_Return();
  1950. }
  1951. }
  1952. else
  1953. {
  1954. if(gTimer_GSM_AT>65000)
  1955. {
  1956. TCP_Land_Error_Return();
  1957. }
  1958. }
  1959. }
  1960. //A-8
  1961. else if(gLand_GPRS_Step==11)
  1962. {
  1963. if( Check_GSM()!=0 )
  1964. {
  1965. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  1966. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  1967. {
  1968. //说明登陆成功,此时不能进行AT指令的任何操作,直接进入CASE6中
  1969. gGeneral_Flag&=~LAND_TCP_F_1;
  1970. gLand_TCP_ERROR_Count=0;
  1971. gGSM_Oper_Type=GPRS_DATA_OPER;
  1972. gM22_Status=TCP_ONLINE_WORK;
  1973. gLand_GPRS_Step=0;
  1974. gTimer_CSQ=0;
  1975. for(i=0;i<sizeof(gReceive0_GSM_Buffer);i++) gReceive0_GSM_Buffer[i]=0;
  1976. gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  1977. gReceive0_GSM_Buffer_Point=0;
  1978. gReceive0_GSM_Buffer_Move=0;
  1979. gGSM_Work_Count=0;gCheck_Data=0;
  1980. gInternal_Flag&=~ALLOW_DATA_F_1;
  1981. //发送登陆TCP的数据
  1982. gOther_Flag|=ALLOW_SENDLAND_F_1;
  1983. gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
  1984. }
  1985. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
  1986. {
  1987. gLand_GPRS_Step=111;
  1988. }
  1989. }
  1990. else
  1991. {
  1992. if(gTimer_GSM_AT>65000)
  1993. {
  1994. TCP_Land_Error_Return();
  1995. }
  1996. }
  1997. }
  1998. else if(gLand_GPRS_Step==111)
  1999. {
  2000. if( Check_GSM()!=0 )
  2001. {
  2002. TCP_Land_Error_Return();
  2003. }
  2004. else
  2005. {
  2006. if(gTimer_GSM_AT>40000)
  2007. {
  2008. TCP_Land_Error_Return();
  2009. }
  2010. }
  2011. }
  2012. //B-1
  2013. else if(gLand_GPRS_Step==12)
  2014. {
  2015. if( Check_GSM()!=0 )
  2016. {
  2017. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  2018. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  2019. {
  2020. gLand_GPRS_Step=13;
  2021. gOther_Flag&=~QUIT_TCP_F_1;
  2022. }
  2023. }
  2024. else
  2025. {
  2026. if(gTimer_GSM_AT>20000)
  2027. {
  2028. Case_OverTime_Return();
  2029. }
  2030. }
  2031. }
  2032. //B-2
  2033. else if(gLand_GPRS_Step==13)
  2034. {
  2035. if( Check_GSM()!=0 )
  2036. {
  2037. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  2038. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_NOCARRIER,sizeof(String_NOCARRIER)))
  2039. {
  2040. gM22_Status=GSM_WORK;
  2041. gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
  2042. gGSM_Oper_Type=GSM_PHONE;
  2043. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  2044. gPhone_Step=0;gTimer_GSM_AT=0;
  2045. gOther_Flag&=~QUIT_TCP_F_1;
  2046. }
  2047. }
  2048. else
  2049. {
  2050. if(gTimer_GSM_AT>20000)
  2051. {
  2052. Case_OverTime_Return();
  2053. }
  2054. }
  2055. }
  2056. //C-1
  2057. else if(gLand_GPRS_Step==14)
  2058. {
  2059. if( Check_GSM()!=0 )
  2060. {
  2061. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;gTimer_GSM_AT=0;
  2062. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_CONNECT,sizeof(String_CONNECT)))
  2063. {
  2064. //进入TCP在线状态
  2065. gM22_Status=TCP_ONLINE_WORK;
  2066. gLand_GPRS_Step=0;
  2067. gGeneral_Flag&=~TCP_STATUS_F_1;
  2068. gReceive0_GSM_Buffer_Move=gReceive0_GSM_Buffer_Point;
  2069. if(gReceive0_GSM_Buffer_Point==0)  gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  2070. else      gReceive0_GSM_Buffer_End=gReceive0_GSM_Buffer_Point-1;
  2071. gGSM_Oper_Type=GPRS_DATA_OPER;
  2072. gGPRS_Data_Step=0;
  2073. gTimer_CSQ=0;
  2074. //登陆成功,如果有报警,
  2075. if(gCycle_Send_Status==ALARM_DATA)
  2076. {
  2077. gCycle_Alarm=ALARM_CIRCLE_TIME;
  2078. gAlarm_Count=0;
  2079. }
  2080. }
  2081. else if(Compare_String(gGeneral_Buffer,(unsigned char *)String_ER,sizeof(String_ER)))
  2082. {
  2083. //进入GSM的工作方式下
  2084. gReset_M22_On_Setp=0;
  2085. gGeneral_Flag&=~RESET_GSM_ON_F_1;
  2086. gM22_Status=GSM_WORK;
  2087. gGeneral_Flag&=~LAND_TCP_SUCCESS_F_1;
  2088. gGSM_Oper_Type=GSM_PHONE;
  2089. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  2090. gPhone_Step=0;gTimer_GSM_AT=0;
  2091. }
  2092. }
  2093. else
  2094. {
  2095. if(gTimer_GSM_AT>65000) Case_OverTime_Return();
  2096. }
  2097. }
  2098. }
  2099. /********************************************************
  2100. * 函数名:TCP_Land_Error_Return
  2101. 作用域:本地文件调用
  2102. * 功能:
  2103. * 参数:
  2104. * 返回值:
  2105. * 创建人:
  2106. *
  2107. * 修改历史:(每条详述)
  2108. 现在如果TCP登陆失败,则重新初始化M22模块,不采用掉电的方式,,如果连续登陆失败5次,则需要进行
  2109. 模块掉电处理。
  2110. ********************************************************/
  2111. void TCP_Land_Error_Return(void)
  2112. {
  2113. Send_COM1_String((unsigned char *)TCP_LAND_ERROR,sizeof(TCP_LAND_ERROR));
  2114. gGeneral_Flag|=RESET_GSM_ON_F_1;
  2115. gReset_M22_On_Setp=1;
  2116. gM22_Status=GSM_WORK;
  2117. gM22_GSM_ECHO_Timer=0;
  2118. gLand_Interval_Timer=0;
  2119. gTCP_FF0D_Send_Timer=0;
  2120. gGPS_No_Output_Timer=0;
  2121. gTimer_GSM_AT=0;
  2122. gTimer_CSQ=0;
  2123. gGPS_Receive_Over=0;
  2124.     gPhone_Status=READY;
  2125. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  2126. gGeneral_Flag&=~DAILING_UP_F_1;
  2127. gGeneral_Flag&=~MONITOR_ON_F_1;
  2128. gGeneral_Flag&=~TCP_PHONE_F_1;
  2129. gGeneral_Flag&=~RING_F_1;
  2130. gGSM_Oper_Type=0;
  2131. gSMS_IN_Step=0;
  2132. gSMS_OUT_Step=0;
  2133. gLand_GPRS_Step=0;
  2134. gGPRS_Data_Step=0;
  2135. gGSM_OTHER_Step=0;
  2136. gGeneral_Flag|=LAND_TCP_ERROR_F_1;
  2137. gLand_TCP_ERROR_Count++;
  2138. if(gLand_TCP_ERROR_Count>5)
  2139. {
  2140. gLand_TCP_ERROR_Count=0;
  2141. gGeneral_Flag|=OFF_M22_F_1;
  2142. gOFF_Power_S=1;
  2143. gPhone_Status=READY;
  2144. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  2145. }
  2146. //如果属于周期数据的发送
  2147. if(gInternal_Flag&SEND_CIRCLE_F_1)
  2148. {
  2149. //1,按时间间隔上报数据,且间隔大于分界值
  2150. if( (gCycle_Send_Status==TRACK_DATA_TIME)&&(gCycle_TCP>TCP_TRACK_MINTIME) )
  2151. {
  2152. gInternal_Flag|=ALLOW_DATA_F_1;
  2153. }
  2154. else
  2155. {
  2156. gInternal_Flag&=~ALLOW_DATA_F_1;
  2157. gInternal_Flag&=~SEND_CIRCLE_F_1;
  2158. }
  2159. }
  2160. //如果属于外部行使记录仪数据的发送,
  2161. else if(gOther_Flag&RECORD_DATA_F_1)
  2162. {
  2163. gOther_Flag&=~RECORD_DATA_F_1;
  2164. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  2165. SRAM_Init();
  2166. SRAM_Write(SRAM_SEND_VAILD,NULL_2);
  2167. SRAM_Write(SRAM_SEND_LENGTH_H,0);
  2168. SRAM_Write(SRAM_SEND_LENGTH_L,0);
  2169. gInternal_Flag&=~ALLOW_DATA_F_1;
  2170. }
  2171. else
  2172. {
  2173. gInternal_Flag|=ALLOW_DATA_F_1;
  2174. }
  2175. }
  2176. /********************************************************
  2177. * 函数名:Case6_GPRS_DATA_OPER
  2178. 作用域:本地文件调用
  2179. * 功能: 进行与GPRS相关的数据操作,以发送为主,接收数据则在Check_GSM()中直接处理
  2180. * 参数:
  2181. * 返回值:
  2182. * 创建人:
  2183. *
  2184. * 修改历史:(每条详述)
  2185. 2004年12月15日
  2186. 补充说明:
  2187. 1,如果在这个CASE外判断有数据要发送,同时TCP处于被挂起状态,则首先执行ATO指令后,然后进入这个
  2188. CASE中进行通过TCP方式发送数据:一旦数据发送完成,则执行+++,将TCP的状态挂起,但如果发送的数据
  2189. 属于握手信号FF 0D,则需要发送完数据后,执行一个等待的时间,判断是否接收到下行的握手数据
  2190. 不管是否接收到下行的握手数据,在等待时间过后,则执行+++,将TCP挂起!但会将这次握手失败的记数增加一
  2191. ********************************************************/
  2192. void Case6_GPRS_DATA_OPER(void)
  2193. {
  2194.   unsigned int i=0,j=0,k=0,x=0,y=0;
  2195. unsigned char nTemp_Length=0;
  2196. static unsigned char Hang_Error=0;
  2197. if(gM22_TCP_ECHO_Timer>200) gInternal_Flag|=TCPSEND_ALLOW_F_1;
  2198. else if(gM22_TCP_ECHO_Timer==0) gInternal_Flag&=~TCPSEND_ALLOW_F_1;
  2199.     if(gM22_Status!=TCP_ONLINE_WORK)
  2200.     {
  2201. gGSM_Oper_Type=GSM_PHONE;
  2202. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  2203. gPhone_Step=0;gTimer_GSM_AT=0;
  2204.      return;
  2205.     }
  2206. if(gGPRS_Data_Step==0)   gGPRS_Data_Step=1;
  2207. else if(gGPRS_Data_Step==1)
  2208. {
  2209. Check_TCP();
  2210. gSend_Type1=0;
  2211. SRAM_Init();
  2212. i=SRAM_Read(ECHO_SMS_2); //存储是否有第二类发送数据的标志
  2213. j=SRAM_Read(OTHER_SMS_2); //存储是否有第三类发送数据的标志
  2214. //发送登陆信息数据
  2215. if(gOther_Flag&ALLOW_SENDLAND_F_1)
  2216. {
  2217. gOther_Flag&=~ALLOW_SENDLAND_F_1;
  2218. gGPRS_Data_Step=12;gTimer_GSM_AT=0;
  2219. Send_COM1_String((unsigned char *)CONNCET_TCP,sizeof(CONNCET_TCP));
  2220. }
  2221. //第一类数据的TCP发送(存储在buffer1中的数据)
  2222. else if( (i!=NULL_2)&&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1) )
  2223. {
  2224. gGPRS_Data_Step=2;gTimer_GSM_AT=0;
  2225. gSend_Type1=1;
  2226. #ifdef Debug_GSM_COM1
  2227. Send_COM1_Byte('B');Send_COM1_String((unsigned char *)TYPE,sizeof(TYPE));
  2228. #endif
  2229. }
  2230. else if( (j!=NULL_2)&&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1)  )
  2231. {
  2232. gGPRS_Data_Step=2;gTimer_GSM_AT=0;
  2233. gSend_Type1=2;
  2234. #ifdef Debug_GSM_COM1
  2235. Send_COM1_Byte('C');Send_COM1_String((unsigned char *)TYPE,sizeof(TYPE));
  2236. #endif
  2237. }
  2238. //第二类数据的TCP发送(周期数据)
  2239. else if( (gInternal_Flag&SEND_CIRCLE_F_1)&&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1) )
  2240. {
  2241. gInternal_Flag&=~SEND_CIRCLE_F_1;
  2242. gGPRS_Data_Step=3;gTimer_GSM_AT=0;
  2243. if(gCycle_Send_Status==TRACK_DATA_TIME) Send_COM1_String((unsigned char *)TRACK,sizeof(TRACK));
  2244. else if(gCycle_Send_Status==ALARM_DATA) Send_COM1_String((unsigned char *)ALARM,sizeof(ALARM));
  2245. else if(gCycle_Send_Status==TRACK_DATA_DISTANCE) Send_COM1_String((unsigned char *)DISTANCE,sizeof(DISTANCE));
  2246. else if(gCycle_Send_Status==WATCH_DATA)
  2247. {
  2248. Send_COM1_String((unsigned char *)WATCH,sizeof(WATCH));
  2249. if(gWatch_Count>0) gWatch_Count--;
  2250. }
  2251. Send_COM1_String((unsigned char *)TYPE,sizeof(TYPE));
  2252. }
  2253. //第三类数据的TCP发送(FF 0D )
  2254. else if ( (gTCP_FF0D_Send_Timer>TCP_TEST_TIME) )
  2255. {
  2256. gTCP_FF0D_Send_Timer=0;
  2257. gGPRS_Data_Step=4;gTimer_GSM_AT=0;
  2258. #ifdef Debug_GSM_COM1
  2259. Send_COM1_Byte('E');Send_COM1_String((unsigned char *)TYPE,sizeof(TYPE));
  2260. #endif
  2261. gTimer_CSQ=0;
  2262. }
  2263. //第四类数据的发送(外部记录仪数据)
  2264. else if ( (gOther_Flag&ALLOW_SEND_RECORD_F_1)&&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1) )
  2265. {
  2266. SRAM_Init();
  2267. if( SRAM_Read(SRAM_SEND_VAILD)==VAILD_2 )
  2268. {
  2269. gGPRS_Data_Step=5;gTimer_GSM_AT=0;
  2270. #ifdef Debug_GSM_COM1
  2271. Send_COM1_Byte('F');Send_COM1_String((unsigned char *)TYPE,sizeof(TYPE));
  2272. #endif
  2273. //显示可以发送的数据的长度
  2274. i=0;
  2275. i=SRAM_Read(SRAM_SEND_LENGTH_H);
  2276. i<<=8;
  2277. i=i+SRAM_Read(SRAM_SEND_LENGTH_L);
  2278. Send_COM1_Byte('[');
  2279.             Send_COM1_Byte(ASCII(i/0x100));
  2280.             Send_COM1_Byte(ASCII((i%0x100)/0x10));
  2281.             Send_COM1_Byte(ASCII(i%0x10));
  2282.             Send_COM1_Byte(']');
  2283.             gTCP_FF0D_Send_Timer=0;
  2284.             //////////////////////////
  2285.             /*
  2286.             #ifdef Debug_GSM_COM1
  2287. for(j=0;j<i;j++)
  2288. {
  2289. k=SRAM_Read(SRAM_SEND_S+j);
  2290. Send_COM1_Byte(ASCII(k/0x10));
  2291. Send_COM1_Byte(ASCII(k%0x10));
  2292. Clear_Exter_WatchDog();
  2293. }
  2294.             //////////////////////////
  2295.             Send_COM1_Byte(0x0d);Send_COM1_Byte(0xa);
  2296.             #endif
  2297.             */
  2298. }
  2299. else
  2300. {
  2301. gOther_Flag&=~RECORD_DATA_F_1;
  2302. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  2303. SRAM_Init();
  2304. SRAM_Write(SRAM_SEND_VAILD,NULL_2);
  2305. SRAM_Write(SRAM_SEND_LENGTH_H,0);
  2306. SRAM_Write(SRAM_SEND_LENGTH_L,0);
  2307. gGPRS_Data_Step=0;
  2308. }
  2309. }
  2310. //8,如果没有判断到有发送的数据,如果到了需要查询CSQ的时间到,则发送挂起操作
  2311. else if(   (gTimer_CSQ>TCP_CHECKCSQ_TIME)
  2312.  &&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1)
  2313.  &&((gOther_Flag&RECORD_DATA_F_1)==0) )
  2314. {
  2315. gGPRS_Data_Step=9;gTimer_GSM_AT=0;
  2316. }
  2317. //9,判断是否需要退出TCP在线
  2318. else if(gOther_Flag&QUIT_TCP_F_1)
  2319. {
  2320. gOther_Flag&=~NEED_LADN_TCP_F_1;
  2321. gGPRS_Data_Step=9;gTimer_GSM_AT=0;
  2322. }
  2323. //10,如果有电话相关的业务,则需要先挂起TCP
  2324. else if(gGeneral_Flag&TCP_PHONE_F_1)
  2325. {
  2326. gGPRS_Data_Step=9;gTimer_GSM_AT=0;
  2327. }
  2328. //11,如果没有上面的数据,则执行接收TCP数据的处理
  2329. else
  2330. {
  2331. Check_TCP();
  2332. gGPRS_Data_Step=0;gTimer_GSM_AT=0;
  2333. i=SRAM_Read(ECHO_SMS_2); //存储是否有第二类发送数据的标志
  2334. j=SRAM_Read(OTHER_SMS_2); //存储是否有第三类发送数据的标志
  2335. /********************************************************
  2336. 判断在TCP在线的状态下是否需要进行TCP退出的操作
  2337. ********************************************************/
  2338. //1,判断如果是属于行车轨迹状态,同时周期数据大于10分钟,并且无周期数据发送
  2339. if(     (gCycle_Send_Status==TRACK_DATA_TIME)
  2340. &&(gCycle_TCP>=TCP_TRACK_MINTIME)
  2341. &&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1)
  2342. &&((gInternal_Flag&SEND_CIRCLE_F_1)==0)
  2343. &&((gOther_Flag&RECORD_DATA_F_1)==0)  )
  2344. {
  2345. gOther_Flag|=QUIT_TCP_F_1;
  2346. }
  2347. //2,    判断如果属于报警状态,同时发送的周期数据大于10分钟秒,并且无周期数据发送
  2348. else if(  (gCycle_Send_Status==ALARM_DATA)
  2349. &&(gCycle_Alarm>=TCP_TRACK_MINTIME)
  2350. &&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1)
  2351. &&((gInternal_Flag&SEND_CIRCLE_F_1)==0)
  2352. &&((gOther_Flag&RECORD_DATA_F_1)==0)  )
  2353. {
  2354. gOther_Flag|=QUIT_TCP_F_1;
  2355. }
  2356. //3,如果属于按间隔发送,且不属于常在线方式,并且无周期数据发送
  2357. else if(  (gCycle_Send_Status==TRACK_DATA_DISTANCE)
  2358. &&(gON_OFF_Temp1&DISTANCE_TCP_ON_1)
  2359. &&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1)
  2360. &&((gInternal_Flag&SEND_CIRCLE_F_1)==0)
  2361. &&((gOther_Flag&RECORD_DATA_F_1)==0)  )
  2362. {
  2363. gOther_Flag|=QUIT_TCP_F_1;
  2364. }
  2365. //3,无任何需要发送的数据,则需要退出TCP
  2366. else if(  (gCycle_Send_Status==NOP_DATA)
  2367. &&(gGeneral_Flag&LAND_TCP_SUCCESS_F_1)
  2368. &&(i==NULL_2)
  2369. &&(j==NULL_2)
  2370. &&( (gOther_Flag&RECORD_DATA_F_1)==0)  )
  2371. {
  2372. gOther_Flag|=QUIT_TCP_F_1;
  2373. }
  2374. else
  2375. {
  2376. j=SRAM_Read(PHONE_AT_2);
  2377. if(j==VAILD_2)
  2378. {
  2379. i=SRAM_Read(PHONE_AT_2+1);
  2380. if(i==H_DIAL) //手柄主动拨号
  2381. {
  2382. gGeneral_Flag|=TCP_PHONE_F_1;
  2383. gStatus1_Flag|=PHONE_ONLINE_F_1;
  2384. gGeneral_Flag|=DAILING_UP_F_1;
  2385. }
  2386. else if(i==M_DIAL) //监听主动拨号
  2387. {
  2388. gGeneral_Flag|=MONITOR_ON_F_1;
  2389. gGeneral_Flag|=TCP_PHONE_F_1;
  2390. gStatus1_Flag|=PHONE_ONLINE_F_1;
  2391. }
  2392. else if(i==H_HUNGUP)
  2393. {
  2394. SRAM_Init();
  2395. SRAM_Write(PHONE_AT_2,NULL_2);
  2396. }
  2397. }
  2398. }
  2399. }
  2400. }
  2401. /********************************************************
  2402. 一,第一类数据的发送
  2403. 1-1,
  2404. 0x7B 存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,为0则表示已经处理完了SMS
  2405. 0x7C 存储数据包的命令字在这里则为nCommand
  2406. 0x7D 存储数据包的ACK的值ACK
  2407. 0x7E 存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
  2408. 0x7F   从这开始存储数据包
  2409. 1-2
  2410. 0xB1 存储表示这个区域的SMS是否处理,为1则表示后面还有未处理的SMS,为0则表示已经处理完了SMS
  2411. 0xB2 存储数据包的命令字在这里则为nCommand
  2412. 0xB3 存储数据包的ACK的值ACK
  2413. 0xB4 存储后面数据包的长度(但注意没有存储CHK(MSB),CHK(LSB),EOT,这三个字节)
  2414. 0xB5   从这开始存储数据包
  2415. ********************************************************/
  2416. else if(gGPRS_Data_Step==2)
  2417. {
  2418. if( (gTimer_GSM_AT>200)&&(gInternal_Flag&TCPSEND_ALLOW_F_1) )
  2419. {
  2420. OperateSPIEnd();
  2421. if(gSend_Type1==1)
  2422. {
  2423. i=SRAM_Read(ECHO_SMS_2+1);
  2424. j=SRAM_Read(ECHO_SMS_2+2); //ACK
  2425. k=SRAM_Read(ECHO_SMS_2+3); //长度
  2426. }
  2427. else if(gSend_Type1==2)
  2428. {
  2429. i=SRAM_Read(OTHER_SMS_2+1);
  2430. j=SRAM_Read(OTHER_SMS_2+2); //ACK
  2431. k=SRAM_Read(OTHER_SMS_2+3); //长度
  2432. }
  2433. OperateSPIEnd();
  2434. //一直发送到VID
  2435. x=Send_Echo_TCP_Head( (char)(k+12),(char)i,(char)j,(char)(k+12-4) );
  2436. //发送数据区ECHO_SMS_2为buffer1的起始地址,k为数据长度
  2437. if(gSend_Type1==1) y=Send_Buffer1_TCP_Data(x,ECHO_SMS_2+4,k);
  2438. else if(gSend_Type1==2) y=Send_Buffer1_TCP_Data(x,OTHER_SMS_2+4,k);
  2439. //发送校验核和结束符
  2440. Send_Echo_TCP_End(y);
  2441. Case4_OverTime_Out(gSend_Type1);
  2442. gGPRS_Data_Step=10;
  2443. }
  2444. else Check_TCP();
  2445. }
  2446.   /********************************************************
  2447. 二,
  2448. 存储在区域的数据Circle_Buffer[]
  2449. 1,行车轨迹数据 ;2,报警数据
  2450. 这5类周期发送的数据因为不能同时存在发送的情形,则可以均用Circle_Buffer[]作为
  2451. 存储周期数据发送。
  2452. gCycle_Send_Status=1 表示属于行车轨迹的周期数据正在发送
  2453. gCycle_Send_Status=2 表示报警的周期数据正在发送
  2454. gCycle_Send_Status=3 表示监控数据正在发送(另外还有标志位表示属于那一类型的监控数据)
  2455. ********************************************************/
  2456. else if(gGPRS_Data_Step==3)
  2457. {
  2458. if( (gTimer_GSM_AT>200)&&(gInternal_Flag&TCPSEND_ALLOW_F_1) )
  2459. {
  2460. Send_Circle_TCP_TypeD();
  2461. for(i=0;i<sizeof(gCircle_Buffer);i++) gCircle_Buffer[i]=0;
  2462. gCircle_Buffer_Point=0;
  2463. gGPRS_Data_Step=10;
  2464. }
  2465. else Check_TCP();
  2466. }
  2467.   /********************************************************
  2468. 三,发送TCP数据FF 0D
  2469. ********************************************************/
  2470. else if(gGPRS_Data_Step==4)
  2471. {
  2472. if( (gTimer_GSM_AT>500)&&(gInternal_Flag&TCPSEND_ALLOW_F_1) )
  2473. {
  2474. Send_COM1_String((unsigned char *)String_TestGPRS,sizeof(String_TestGPRS));
  2475. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  2476. Send_COM0_Byte(0xFF);
  2477. Send_COM0_Byte(0x0D);
  2478. gTimer_GSM_AT=0;
  2479. gGPRS_Data_Step=10;
  2480. }
  2481. else Check_TCP();
  2482. }
  2483. /********************************************************
  2484. 四,外接部件的TCP数据发送
  2485. ********************************************************/
  2486. else if(gGPRS_Data_Step==5)
  2487. {
  2488. if( (gTimer_GSM_AT>500)&&(gInternal_Flag&TCPSEND_ALLOW_F_1) )
  2489. {
  2490. Send_Circle_TCP_TypeE();
  2491. gTimer_GSM_AT=0;
  2492. gGPRS_Data_Step=10;
  2493. }
  2494. else Check_TCP();
  2495. }
  2496. /********************************************************
  2497. 五,TCP挂起的操作
  2498. ********************************************************/
  2499. else  if(gGPRS_Data_Step==9)
  2500. {
  2501. if( (gTimer_GSM_AT>500)&&(gInternal_Flag&TCPSEND_ALLOW_F_1) )
  2502. {
  2503. gReceive0_GSM_Buffer_Move=gReceive0_GSM_Buffer_Point;
  2504. if(gReceive0_GSM_Buffer_Point==0)  gReceive0_GSM_Buffer_End=sizeof(gReceive0_GSM_Buffer)-1;
  2505. else      gReceive0_GSM_Buffer_End=gReceive0_GSM_Buffer_Point-1;
  2506. Send_COM1_String((unsigned char *)HANG_TCP,sizeof(HANG_TCP));
  2507. Send_COM1_Byte(0x0d);Send_COM1_Byte(0x0a);
  2508. Send_COM0_String((unsigned char *)HANG_TCP,sizeof(HANG_TCP));
  2509. gTimer_GSM_AT=0;
  2510. gGPRS_Data_Step=11;
  2511. }
  2512. else Check_TCP();
  2513. }
  2514. /********************************************************
  2515. 六,数据已经送给M22,则等待延迟时间后发送
  2516. ********************************************************/
  2517. else if(gGPRS_Data_Step==10)
  2518. {
  2519. if(gTimer_GSM_AT>1500)
  2520. {
  2521. gTimer_GSM_AT=0;
  2522. gGPRS_Data_Step=0;
  2523. }
  2524. else Check_TCP();
  2525. }
  2526. /********************************************************
  2527. 十,发送+++后,等待模块响应的部分
  2528. ********************************************************/
  2529. else if(gGPRS_Data_Step==11)
  2530. {
  2531. if(Check_GSM()!=0)
  2532. {
  2533. if(Compare_String(gGeneral_Buffer,(unsigned char *)String_OK,sizeof(String_OK)))
  2534. {
  2535. //表示TCP已经挂起,则可以进行AT指令的操作
  2536. Hang_Error=0;
  2537. gGPRS_Data_Step=0;
  2538. gM22_Status=TCP_HANG_WORK;
  2539. gGeneral_Flag&=~HANG_M22_TCP_F_1;
  2540. gGSM_Oper_Type=GSM_PHONE;
  2541. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  2542. gPhone_Step=0;gTimer_GSM_AT=0;
  2543. }
  2544. }
  2545. else
  2546. {
  2547. if(gTimer_GSM_AT>10000)
  2548. {
  2549. gTimer_GSM_AT=0;
  2550. Hang_Error++;
  2551. if(Hang_Error>4)
  2552. {
  2553. //直接掉电处理
  2554. Hang_Error=0;
  2555. gGeneral_Flag|=OFF_M22_F_1;
  2556. gOFF_Power_S=1;
  2557. gPhone_Status=READY;
  2558. gGSM_Oper_Type=GSM_PHONE;
  2559. gGPRS_Data_Step=0;
  2560. gInternal_Flag&=~GSM_ONEAT_SUCCESS_1;
  2561. gPhone_Step=0;
  2562. gStatus1_Flag&=~PHONE_ONLINE_F_1;
  2563. return;
  2564. }
  2565. else
  2566. {
  2567. gGPRS_Data_Step=9;
  2568. }
  2569. }
  2570. }
  2571. }
  2572. /********************************************************
  2573. 十一,发送登陆信息后,等待登陆响应
  2574. ********************************************************/
  2575. else if(gGPRS_Data_Step==12)
  2576. {
  2577. if( (gTimer_GSM_AT>500)&&(gInternal_Flag&TCPSEND_ALLOW_F_1) )
  2578. {
  2579. i=Send_Echo_TCP_Head(12,(char)VEHICLE_ENTRY_UP,0,12-4);
  2580. Send_Echo_TCP_End(i);
  2581. gGPRS_Data_Step=10;
  2582. }
  2583. else Check_TCP();
  2584. }
  2585. }
  2586. /********************************************************
  2587. * 函数名:Case_OverTime_Return
  2588. 作用域:本地文件调用
  2589. * 功能:
  2590. * 参数:
  2591. * 返回值:
  2592. * 创建人:
  2593. *
  2594. * 修改历史:(每条详述)
  2595. ********************************************************/
  2596. void Case_OverTime_Return(void)
  2597. {
  2598. Reset_Variable();
  2599. }
  2600. /********************************************************
  2601. * 函数名:Send_Circle_GSM_TypeD
  2602. 作用域:本地文件调用
  2603. * 功能:  在GSM方式下D类发送信息数据部分的打包(定时发送的行驶数据包)
  2604. 具体是发送存储在gCircle_Buffer[]缓冲中的数据
  2605. * 参数:
  2606. * 返回值:
  2607. * 创建人:
  2608. *
  2609. * 修改历史:(每条详述)
  2610. ********************************************************/
  2611. void Send_Circle_GSM_TypeD(void)
  2612. {
  2613. unsigned int i=0;
  2614. Send_COM0_Byte(ASCII( gCircle_Buffer_Point/0x10) );
  2615. Send_COM0_Byte(ASCII( gCircle_Buffer_Point%0x10) );
  2616. for(i=0;i<gCircle_Buffer_Point;i++)
  2617. {
  2618. Send_COM0_Byte(ASCII( (gCircle_Buffer[i])/0x10) );
  2619. Send_COM0_Byte(ASCII( (gCircle_Buffer[i])%0x10) );
  2620. }
  2621. }
  2622. /********************************************************
  2623. * 函数名:Send_Circle_TCP_TypeD
  2624. 作用域:本地文件调用
  2625. * 功能:  在TCP方式下D类发送信息数据部分的打包(定时发送的行驶数据包)
  2626. 具体是发送存储在gCircle_Buffer[]缓冲中的数据
  2627. * 参数:
  2628. * 返回值:
  2629. * 创建人:
  2630. *
  2631. * 修改历史:(每条详述)
  2632. ********************************************************/
  2633. void Send_Circle_TCP_TypeD(void)
  2634. {
  2635. unsigned int i=0;
  2636. for(i=0;i<gCircle_Buffer_Point;i++)
  2637. {
  2638. Send_COM0_Byte(gCircle_Buffer[i]);
  2639. }
  2640. }
  2641. /********************************************************
  2642. * 函数名:Send_Circle_GSM_TypeE
  2643. 作用域:本地文件调用
  2644. * 功能:  在GSM方式下E类发送信息数据部分的打包(发送接收到的外接部件的数据)
  2645. 具体是发送存储在gCom4_Buffer[]缓冲中的数据
  2646. * 参数:
  2647. * 返回值:
  2648. * 创建人:
  2649. *
  2650. * 修改历史:(每条详述)
  2651. ********************************************************/
  2652. void Send_Circle_GSM_TypeE(void)
  2653. {
  2654. unsigned int i=0;
  2655. unsigned int iLength=0;
  2656. unsigned char nData=0;
  2657. SRAM_Init();
  2658. iLength = SRAM_Read(SRAM_SEND_LENGTH_H);
  2659. iLength <<= 8;
  2660. iLength += SRAM_Read(SRAM_SEND_LENGTH_L);
  2661. Send_COM0_Byte(ASCII( (iLength+13)/0x10) );
  2662. Send_COM0_Byte(ASCII( (iLength+13)%0x10) );
  2663. Send_COM0_Byte(ASCII( SOH/0x10) );
  2664. Send_COM0_Byte(ASCII( SOH%0x10) );
  2665. Send_COM0_Byte(ASCII( EXTER_EQUIPMENT_UP/0x10) );
  2666. Send_COM0_Byte(ASCII( EXTER_EQUIPMENT_UP%0x10) );
  2667. Send_COM0_Byte(ASCII( (char)(~EXTER_EQUIPMENT_UP)/0x10) );
  2668. Send_COM0_Byte(ASCII( (char)(~EXTER_EQUIPMENT_UP)%0x10) );
  2669. Send_COM0_Byte(ASCII( (iLength+13-4)/0x10) );
  2670. Send_COM0_Byte(ASCII( (iLength+13-4)%0x10) );
  2671. Send_COM0_Byte(ASCII( gSMS_ACK[RECORD_EQUIPMENT_ACK]/0x10) );
  2672. Send_COM0_Byte(ASCII( gSMS_ACK[RECORD_EQUIPMENT_ACK]%0x10) );
  2673. Send_COM0_Byte(ASCII( gKind/0x10) );
  2674. Send_COM0_Byte(ASCII( gKind%0x10) );
  2675. Send_COM0_Byte(ASCII( gGroup/0x10) );
  2676. Send_COM0_Byte(ASCII( gGroup%0x10) );
  2677. Send_COM0_Byte(ASCII( (gVID/0x100)/0x10) );
  2678. Send_COM0_Byte(ASCII( (gVID/0x100)%0x10) );
  2679. Send_COM0_Byte(ASCII( (gVID%0x100)/0x10) );
  2680. Send_COM0_Byte(ASCII( (gVID%0x100)%0x10) );
  2681. //================================
  2682. //外接部件的类型
  2683. Send_COM0_Byte(ASCII( 1/0x10) );
  2684. Send_COM0_Byte(ASCII( 1%0x10) );
  2685. //外接部件的数据内容
  2686. if( (iLength>0)&&(iLength<144) )
  2687. {
  2688. for(i=0;i<iLength;i++)
  2689. {
  2690. nData=SRAM_Read(SRAM_SEND_S+i);
  2691. Send_COM0_Byte(ASCII( nData/0x10 ) );
  2692. Send_COM0_Byte(ASCII( nData%0x10 ) );
  2693. }
  2694. }
  2695. Send_COM0_Byte(ASCII( 0/0x10) );
  2696. Send_COM0_Byte(ASCII( 0%0x10) ); //校验核H
  2697. Send_COM0_Byte(ASCII( 0/0x10) );
  2698. Send_COM0_Byte(ASCII( 0%0x10) ); //校验核L
  2699. Send_COM0_Byte(ASCII( EOT/0x10) );
  2700. Send_COM0_Byte(ASCII( EOT%0x10) );
  2701. }
  2702. /********************************************************
  2703. * 函数名:Send_Circle_TCP_TypeE
  2704. 作用域:本地文件调用
  2705. * 功能:  在TCP方式下E类发送信息数据部分的打包(发送接收到的外接部件的数据)
  2706. 具体是发送存储在gCom4_Buffer[]缓冲中的数据
  2707. * 参数:
  2708. * 返回值:
  2709. * 创建人:
  2710. *
  2711. * 修改历史:(每条详述)
  2712. ********************************************************/
  2713. void Send_Circle_TCP_TypeE(void)
  2714. {
  2715.    unsigned int i=0,j=0;
  2716.    unsigned int iLength=0;
  2717.    unsigned int Length_Temp=0;
  2718.    unsigned char nData_Temp=0;
  2719. j=0;
  2720. //读数据区的长度
  2721. SRAM_Init();
  2722. iLength = SRAM_Read(SRAM_SEND_LENGTH_H);
  2723. iLength <<= 8;
  2724. iLength += SRAM_Read(SRAM_SEND_LENGTH_L);
  2725. //如果发送数据的长度超过M22一次TCP发送的长度,则需要多次组包发送
  2726. if(iLength>=MAX_TCP_DATA_LENGHT)
  2727. {
  2728. Length_Temp=iLength-MAX_TCP_DATA_LENGHT;
  2729. iLength=MAX_TCP_DATA_LENGHT;
  2730. if(Length_Temp>0) j=1;
  2731. //j=1,说明存储的数据长度超过M22能一次发送的数据长度
  2732. }
  2733. Send_COM0_Byte( SOH );
  2734. Send_COM0_Byte( EXTER_EQUIPMENT_UP );
  2735. Send_COM0_Byte( (char)(~EXTER_EQUIPMENT_UP) );
  2736. Send_COM0_Byte( iLength+9 );
  2737. Send_COM0_Byte( gSMS_ACK[RECORD_EQUIPMENT_ACK] );
  2738. Send_COM0_Byte( gKind );
  2739. Send_COM0_Byte( gGroup );
  2740. Send_COM0_Byte( gVID/0x100 );
  2741. Send_COM0_Byte( gVID%0x100 );
  2742. Send_COM0_Byte( 1 );
  2743. //================================
  2744. for( i=0;i<iLength;i++ )
  2745. {
  2746. Send_COM0_Byte( SRAM_Read(SRAM_SEND_S+i) );
  2747. }
  2748. Send_COM0_Byte( 0 );
  2749. Send_COM0_Byte( 0 );
  2750. Send_COM0_Byte( EOT );
  2751. if(j==1)
  2752. {
  2753. SRAM_Init();
  2754. SRAM_Write(SRAM_SEND_VAILD,VAILD_2);
  2755. SRAM_Write(SRAM_SEND_LENGTH_H,Length_Temp/0x100);
  2756. SRAM_Write(SRAM_SEND_LENGTH_L,Length_Temp%0x100);
  2757. for(i=0;i<Length_Temp;i++)
  2758. {
  2759. nData_Temp=SRAM_Read(SRAM_SEND_S+iLength+i);
  2760. SRAM_Write((SRAM_SEND_S+i),nData_Temp);
  2761. }
  2762. gSend_RecordData_Timer=0;
  2763. gOther_Flag|=RECORD_DATA_F_1;
  2764. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  2765. }
  2766. else
  2767. {
  2768. gOther_Flag&=~RECORD_DATA_F_1;
  2769. gOther_Flag&=~ALLOW_SEND_RECORD_F_1;
  2770. SRAM_Init();
  2771. SRAM_Write(SRAM_SEND_VAILD,NULL_2);
  2772. SRAM_Write(SRAM_SEND_LENGTH_H,0);
  2773. SRAM_Write(SRAM_SEND_LENGTH_L,0);
  2774. }
  2775. }
  2776. /********************************************************
  2777. * 函数名:Send_Type1_GSM_Data_One
  2778. 作用域:本地文件调用
  2779. * 功能:
  2780. * 参数:
  2781. * 返回值:
  2782. * 创建人:
  2783. *
  2784. * 修改历史:(每条详述)
  2785. ********************************************************/
  2786. void Send_Type1_GSM_Data_One(unsigned char S_Address)
  2787. {
  2788. unsigned char nLength=0;
  2789. SRAM_Init();
  2790. nLength=SRAM_Read(TARGET_NUMBER1_2); //目标电话号码的长度
  2791. nLength=(nLength+1)/2+8+12+SRAM_Read(S_Address+3); //整个数据区的长度
  2792. Ask_SMS_Send(nLength); //发送AT指令AT+CMGS=(SMS长度)
  2793. }
  2794. /********************************************************
  2795. * 函数名:Send_Type1_GSM_Data_Two
  2796. 作用域:本地文件调用
  2797. * 功能:
  2798. * 参数:
  2799. * 返回值:
  2800. * 创建人:
  2801. *
  2802. * 修改历史:(每条详述)
  2803. ********************************************************/
  2804. void Send_Type1_GSM_Data_Two(unsigned char S_Address)
  2805. {
  2806. unsigned int i,j,k,x,y;
  2807. SRAM_Init();
  2808. Send_SMS_Head(); //这个操作发送完000400
  2809. i=SRAM_Read(S_Address+1); //nCommand,命令字
  2810. j=SRAM_Read(S_Address+2); //ACK
  2811. k=SRAM_Read(S_Address+3); //长度
  2812. OperateSPIEnd();
  2813. x=Send_Echo_GSM_Head( (char)(k+12),(char)i,(char)j,(char)(k+12-4) );//同时计算校验核
  2814. y=Send_Buffer1_GSM_Data(x,S_Address+4,k);
  2815. Send_Echo_GSM_End(y); //这个操作完成校验核和结束符号的发送
  2816. Send_COM0_Byte(0x1A);
  2817. OperateSPIEnd();
  2818. }