car_sim300.c
上传用户:sdbljx
上传日期:2016-10-27
资源大小:26k
文件大小:140k
源码类别:

GPS编程

开发平台:

C/C++

  1. /**************************************************************
  2. Copyright (C), 2002-2030, HuerXun Tech. Co., Ltd.
  3. 文件名  :  AnyData.c
  4. 作  者  : 华 猛       版本:V1.00.00       完成日期:2007-01-27
  5. 描  述  : 
  6. 函数列表: 
  7. 修改记录1:
  8. 日  期  :
  9. 修改人  :
  10. 修改说明:
  11. 修改记录2:
  12. 日  期  :
  13. 修改人  :
  14. 修改说明:
  15. ***************************************************************/
  16. #include <stm32f10x_lib.h>              /* STM32F10x Library Definitions      */             
  17. #include<string.h>
  18. #include <stdio.h>
  19. #ifndef NULL
  20.  #define NULL ((void *) 0L)
  21. #endif
  22. #ifndef           OK
  23.     #define       OK        1
  24. #endif
  25. #ifndef           NOT_OK
  26.     #define       NOT_OK    0
  27. #endif
  28. #define        DELAY_TIME_START_VALUE    1
  29. #define        WDT_TIME                  0x00
  30. #define        CHECK_WORD1               'm'
  31. #define        CHECK_WORD2               'h' 
  32. #define        PASSWORD_STAR_ADDR         0x0000
  33. #define        MONT_PHONE_STAR_ADDR       0x0010
  34. #define        SEVER_IP_STAR_ADDR         0x0050
  35. #define        CHECK_WORD_STAR_ADDR       0x0070
  36. #define        LCT_TIME_IN_STAR_ADDR      0x0080
  37. #define        DEVICE_PHONE_STAR_ADDR     0x0090
  38. #define        SIM_CCID_STAR_ADDR         0x00a0
  39. #define        CENTER_MODEM_STAR_ADDR     0x00b0
  40. #define        LCT_TIME_INTV_ADDR         0x00c0
  41. #define        OVER_SPEED_IN_STAR_ADDR    0x00d0
  42. #define        OVER_SPEED_INTV_ADDR       0x00e0
  43. #define        PHONE_LOCATION_MODE        0x00f0
  44. #define        GPRS_APN_STAR_ADDR         0x0500//保存gprs接入点首地址
  45. /*--------------------标准数据类型重定义-----------------------*/
  46. typedef  unsigned char  BYTE;    //无符号字符型(或者字节型)
  47. typedef    signed char  SBYTE;   //有符号字节型(或者字节型)
  48. typedef  unsigned short WORD;    //无符号整型(或者字型)
  49. typedef    signed short SWORD;   //有无符号整型(或者字型)
  50. typedef  unsigned long  DWORDS;   //无符号长整型(或者双字型)
  51. typedef    signed long  SDWORD;  //有符号长整型(或者双字型)
  52. /*---------------------------------------------------------------*/
  53. /***************************time***************************************/
  54. #define    AT_CMD_WAITING_TIMER      0//等待AT命令发送超时定时器
  55. #define    LED_FLASHING_TIMER        1//LED灯闪定时器
  56. #define    GPS_CHECK_WAITING_TIMER   2//GPS数据检测定时器
  57. #define    SWAP_GPS_LCT_TIMER        3//定时请求交换数据到用户手机
  58. #define    TCP_CCNT_START_TIMER      4//TCP已经连接,等待数据交换超时定时器
  59. #define    MAX_LED_FLASH_TIME        20//<256
  60. #define    MAX_LED_FLASH_TIME1       20//<256
  61. #define    MAX_CHECK_SPEED_CNT       10
  62. #define    MAX_CHECK_OVER_SPEED_CNT  5
  63. typedef struct{
  64.   BYTE  bStartFb;                      //1-启动定时器 ,0-关闭定时器
  65.   WORD  wOverValue;                    //定时器溢出值
  66.   void (*pfTimerFunction)(void);       //定时器溢出时间函数指针
  67. }recTIMER_A;//A型定时器结构:单定时触发
  68. #define    MAX_A_SOFT_TIMERS     5    //系统最大A类软定时器数目
  69. #define    MIN_TIME_PERIOD       100   //最小定时周期单位1s
  70. recTIMER_A        REC_A_SoftTimers[MAX_A_SOFT_TIMERS];//A类软件定时器组
  71. WORD  volatile   W_TimeCount=0;//定时器基数循环变量//volatile
  72. BYTE              B_CheckKeyTimer[4];
  73. WORD              W_CheckConts[4];
  74. BYTE               FB_Led=0,FB_Led1=0;
  75. BYTE   volatile   B_LedTimer=0,B_LedTimer1=0;//LED灯闪定时器
  76. BYTE       GPS_V_F=0,GPS_CCNT_F=0;
  77. BYTE   volatile   B_GpsVFTimer = 0;
  78. /**********************************************************************/
  79. /****************************serial*******************************************/
  80. #define  MAX_SERIAL_LEN         280  //定义最大串口1接收缓冲数
  81. #define  MAX_SERIAL_LEN2        140   //100定义最大串口2接收缓冲数
  82. #define  MAX_TCP_SERIAL_LEN     210  //定义最大tcp数据接收缓冲数
  83. BYTE     B_SerialQueue[MAX_SERIAL_LEN];//串口接收队列
  84. WORD     W_InSerial=0,W_OutSerial=0;//读写B_SerialQueue时进/出队列位置
  85. BYTE     B_SerialQueue2[MAX_SERIAL_LEN2];//串口接收队列
  86. WORD     W_InSerial2=0,W_OutSerial2=0;//读写B_SerialQueue时进/出队列位置
  87. BYTE     B_TcpSerialQueue[MAX_TCP_SERIAL_LEN];//串口接收队列
  88. WORD     W_TcpInSerial=0,W_TcpOutSerial=0;//读写B_TcpSerialQueue时进/出队列位置
  89. /*****************************************************************************/
  90. #define  MAX_RECV_SMS_NUM    76
  91. BYTE     B_SMSExist[MAX_RECV_SMS_NUM];//SIM卡上可存储76条SMS  =0表示没有对应的短消息,=1表示有短消息要读,=2表示此条短消息已读
  92. BYTE       FB_NextGsmMsg=0;//指示短消息已经读出来了
  93. BYTE       FB_NextCCID=0;//指示SIM卡的标示号读出来了
  94. BYTE       FB_CSCASet=0;//指示是查询还是设置短消息中心号码
  95. BYTE       IpdFlag=0;
  96. BYTE       FB_AtdReg=0;
  97. BYTE       FB_AtdDelayStart=0;
  98. BYTE     B_AtdDelayTimer=0;
  99. BYTE       Call_Rdy=0;//模块允许呼叫标志
  100. BYTE       Call_Modem=0;//呼叫中心MODEM标志
  101. BYTE       FB_RestPro=0;//重启程序标志
  102. BYTE     B_EnCodeSms[140];//PDU BIT7位编码数据内容
  103. BYTE     B_EnCodeLen;     //PDU BIT7位编码长度
  104. BYTE     B_OnOff_FLAG=0;//开关机标志
  105. WORD     W_PowerSwitchTimer=0;//sim508重启计时
  106. BYTE     B_NoCsqTimer=0;//无信号强度计时
  107. BYTE     B_NetValue_1_Cnt=0;//网络标志值为'1'的时长
  108. /*********************************************AT Commands**************************************************/
  109. /***********************************************************************************************************
  110. CIPSTATUS CIPHEAD CIPSPRT CNMI SIDET ECHO CLVL CMIC CHFA CSCA CSTA CSCS CMGF CLIP CREG ATE0
  111.    15       14      13     12    11   10   09   08   07   06   05   04   03   02   01   00
  112.     0        1       0      1  ,  1    1    1    1  , 1    0    0    0  , 0    1    1    1 
  113. ************************************************************************************************************
  114. ************************************************************************************************************
  115. CMGS  CLCC    CONT  CSTT  CIPSEND CIPSTART ATH  CSQ  VTS  ATD  ATA  CIPSHUT CIPCLOSE  CMGL   CMGD CMGR
  116.  31    30      29    28     27      26      25   24   23   22   21    20      19       18     17   16
  117.   0     0       0     0  ,   0       0       0    1  , 0    0    0     0  ,    0        0      0    0
  118. *************************************************************************************************************/
  119. #define     MAC_ATE0_ITEM          0
  120. #define     MAC_CREG_ITEM          1
  121. #define     MAC_CLIP_ITEM          2
  122. #define     MAC_CMGF_ITEM          3
  123. #define     MAC_CSCS_ITEM          4
  124. #define     MAC_CSTA_ITEM          5
  125. #define     MAC_CSCA_ITEM          6
  126. #define     MAC_CHFA_ITEM          7
  127. #define     MAC_CMIC_ITEM          8
  128. #define     MAC_CLVL_ITEM          9
  129. #define     MAC_ECHO_ITE M         10
  130. #define     MAC_SIDET_ITEM         11
  131. #define     MAC_CNMI_ITEM          12
  132. #define     MAC_CIPSPRT_ITEM       13
  133. #define     MAC_CIPHEAD_ITEM       14
  134. #define     MAC_CIPSTATUS_ITEM     15
  135. #define     MAC_CMGR_ITEM          16
  136. #define     MAC_CMGD_ITEM          17
  137. #define     MAC_CMGL_ITEM          18
  138. #define     MAC_CIPCLOSE_ITEM      19
  139. #define     MAC_CIPSHUT_ITEM       20
  140. #define     MAC_ATA_ITEM           21
  141. #define     MAC_ATD_ITEM           22
  142. #define     MAC_VTS_ITEM           23
  143. #define     MAC_CSQ_ITEM           24
  144. #define     MAC_ATH_ITEM           25
  145. #define     MAC_CIPSTART_ITEM      26
  146. #define     MAC_CIPSEND_ITEM       27
  147. #define     MAC_CSTT_ITEM          28
  148. #define     MAC_CONT_ITEM         29
  149. #define     MAC_CLCC_ITEM          30
  150. #define     MAC_CMGS_ITEM          31
  151. #define    MAC_SET_AT_CMD    0x01007fa7
  152. typedef enum  {
  153.   NO_COMMAND_WAIT,
  154.   WAIT_ATE0,WAIT_CREG,WAIT_CLIP,WAIT_CMGF,
  155.   WAIT_CSCS,WAIT_CSTA,WAIT_CSCA,WAIT_CHFA,
  156.   WAIT_CMIC,WAIT_CLVL,WAIT_ECHO,WAIT_SIDET,
  157.   WAIT_CNMI,WAIT_CIPSPRT,WAIT_CIPHEAD,WAIT_CIPSTATUS,
  158.   WAIT_CMGR,WAIT_CMGD,WAIT_CMGL,WAIT_CIPCLOSE,
  159.   WAIT_CIPSHUT,WAIT_ATA,WAIT_ATD ,WAIT_VTS,
  160.   WAIT_CSQ,WAIT_ATH,WAIT_CIPSTART,WAIT_CIPSEND,
  161.   WAIT_CSTT,WAIT_CONT,WAIT_CLCC, WAIT_CMGS,
  162.   WAIT_SEND_MSG
  163. }  enEchoWait;
  164. typedef struct  {
  165.   enEchoWait    eAtCmdStatus;//AT命令标签
  166.   BYTE          bAtCommand[45];//AT命令字符串
  167. }recAtCmd;  
  168. /**********定义收到的字符串及响应的确认函数结构**************/
  169. struct FunctionTable
  170. {
  171.   BYTE   *pbCmdStr;
  172.   void  (*pfCmdFun)(void);
  173. };
  174. enEchoWait    EN_CommandStatus=NO_COMMAND_WAIT;  //发送AT命令后的等待状态
  175. BYTE          B_AtCommandItem=0xff;                 //当前已发送的AT命令的索引
  176. BYTE          B_AtCmdTimes=0;                       //同一个AT命令重复发送的次数
  177. WORD          W_InternalLctTimer;                 //定时定位时间间隔,单位分钟
  178. WORD          W_OverSpeedValue;                   //超速速度,单位km/h
  179. DWORDS  DW_MapTbl[ ]={ 0x00000001, 0x00000002, 0x00000004, 0x00000008, 0x00000010, 0x00000020, 0x00000040, 0x00000080,
  180.                0x00000100, 0x00000200, 0x00000400, 0x00000800, 0x00001000, 0x00002000, 0x00004000, 0x00008000,
  181.    0x00010000, 0x00020000, 0x00040000, 0x00080000, 0x00100000, 0x00200000, 0x00400000, 0x00800000,
  182.    0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000, 0x20000000, 0x40000000, 0x80000000,
  183.    0x00000000
  184.                           };//定义检测需发送AT命令的参考标量
  185. DWORDS     DW_SetAtCmdFlag = MAC_SET_AT_CMD;//0x01007fa7//是否发该AT命令的标志,1-发送,0-不发送0x01447fe7
  186. /***********************************************************************************************************
  187. CIPSTATUS CIPHEAD CIPSPRT CNMI SIDET ECHO CLVL CMIC CHFA CSCA CSTA CSCS CMGF CLIP CREG ATE0
  188.    15       14      13     12    11   10   09   08   07   06   05   04   03   02   01   00
  189.     0        1       1      1  ,  1    1    1    1  , 1    0    1    0  , 0    1    1    1 
  190. ************************************************************************************************************
  191. ************************************************************************************************************
  192. CMGS  CLCC    CONT  CSTT  CIPSEND CIPSTART ATH  CSQ  VTS  ATD  ATA  CIPSHUT CIPCLOSE  CMGL   CMGD CMGR
  193.  31    30      29    28     27      26      25   24   23   22   21    20      19       18     17   16
  194.   0     0       0     0  ,   0       0       0    1  , 0    0    0     0  ,    0        0      0    0
  195. *************************************************************************************************************/
  196. //AT+CSTA=145
  197. recAtCmd    REC_AtCommands[32]={
  198. WAIT_ATE0,"ATE1", WAIT_CREG,"AT+CREG=1", WAIT_CLIP,"AT+CLIP=1", WAIT_CMGF,"AT+CMGF=0",
  199. WAIT_CSCS,"AT+CSCS="GSM"", WAIT_CSTA,"AT+CCID", WAIT_CSCA,"AT+CSCA", WAIT_CHFA,"AT+CHFA=1",
  200. WAIT_CMIC,"AT+CMIC=1,6", WAIT_CLVL,"AT+CLVL=73", WAIT_ECHO,"AT+ECHO=0,0,0,1", WAIT_SIDET,"AT+SIDET=4096",
  201. WAIT_CNMI,"AT+CNMI?", WAIT_CIPSPRT,"AT+CIPSPRT=0", WAIT_CIPHEAD,"AT+CIPHEAD=1", WAIT_CIPSTATUS,"AT+CIPSTATUS",
  202. WAIT_CMGR,"AT+CMGR=", WAIT_CMGD,"AT+CMGD=", WAIT_CMGL,"AT+CMGL=4", WAIT_CIPCLOSE,"AT+CIPCLOSE",
  203. WAIT_CIPSHUT,"AT+CIPSHUT", WAIT_ATA, "ATA", WAIT_ATD, "ATD", WAIT_VTS, "AT+VTS=",
  204. WAIT_CSQ, "AT+CSQ", WAIT_ATH, "ATH", WAIT_CIPSTART,"AT+CIPSTART="TCP",",WAIT_CIPSEND,"AT+CIPSEND=", 
  205. WAIT_CSTT,"AT+CSTT=", WAIT_CONT,"AT+CIPSCONT", WAIT_CLCC,"AT+CLCC", WAIT_CMGS,"AT+CMGS="
  206. };//220.194.62.247:1238//202.96.155.118//220.205.139.106
  207. /********************************CDMA 数据处理*************************************/
  208. #define    IDILE                0     //空闲
  209. #define    DIALING              1     //拨号
  210. #define    RING                 2     //来电
  211. #define    CCNT                 3     //接通
  212. #define       MAX_CDMA_FRM_LEN      255     //CDMA输出一帧数据最大字符数
  213. #define       MAX_GPS_FRM_LEN       100     //GPS输出一帧数据最大字符数
  214. #define       MAX_TCP_CDMA_FRM_LEN  255     //CDMA_TCP输出一帧数据最大字符数
  215. #define       MAX_SEND_SMS_LEN      140      //发送一条短消息的最大字符数
  216. #define       MAX_PHONE_NUM         16       //电话号码的最大长度
  217. #define       MAX_AT_CMD_ERRORS     3        //AT命令最大出错次数
  218. BYTE     B_CdmaFrmBuf[MAX_CDMA_FRM_LEN];//用来存放被正确读取的一帧CDMA数据:AT+CSQ....0x0d,0x0a
  219. WORD     W_CdmaFrmBufLen=0;//CDMA帧数据长度
  220. BYTE     B_GpsFrmBuf[MAX_GPS_FRM_LEN];//用来存放被正确读取的一帧GPS数据:$GPRMC,....0x0d,0x0a
  221. WORD     W_GpsFrmBufLen=0;//GPS帧数据长度
  222. BYTE     B_TcpCdmaFrmBuf[MAX_TCP_CDMA_FRM_LEN];//用来存放被正确读取的一帧CDMA TCP数据
  223. BYTE     B_SmsSendItem[MAX_SEND_SMS_LEN];//一条短消息的内容
  224. BYTE     B_SmsSendLen=0;//需要发送短消息内容的长度
  225. BYTE     B_TalkStatus=IDILE;//电话状态
  226. BYTE     B_NetStatus=0;//网络状态
  227. BYTE     B_AlarmFlag[4];
  228. BYTE     B_UserNum[MAX_PHONE_NUM]; //用户电话号码
  229. BYTE     B_DeviceNum[MAX_PHONE_NUM];//设备标识号码
  230. BYTE     B_ScaPhone[MAX_PHONE_NUM];//短消息中心号码
  231. BYTE    FB_RelayStart=0;
  232. BYTE     B_RelayTime=0,B_DelayTimeValue=0;
  233. BYTE     B_Screen=0;
  234. BYTE B_SpeedEnableCnt=0,B_SpeedOverCnt=0,B_StarORStop=0,B_OverORNormal=0;
  235. BYTE    B_OverBeepStart=0;
  236. BYTE  volatile  B_OverBeepTimer=0;//超速报警执行
  237. BYTE      B_PwdSetRet1[14] = {0x5b,0xc6,0x78,0x01,0x66,0xf4,0x65,0xb0,0x62,0x10,0x52,0x9f,0x00,0x21};   //密码更新成功!
  238. BYTE      B_PwdSetRet0[14] = {0x5b,0xc6,0x78,0x01,0x66,0xf4,0x65,0xb0,0x59,0x31,0x8d,0x25,0x00,0x21};   //密码更新失败!
  239. BYTE      B_PhoneSetRet1[18]={0x76,0xd1,0x63,0xa7,0x53,0xf7,0x78,0x01,0x8b,0xbe,0x7f,0x6e,0x62,0x10,0x52,0x9f,0x00,0x21};   //监控号码设置成功!
  240. BYTE      B_PhoneSetRet0[28]={0x76,0xd1,0x63,0xa7,0x53,0xf7,0x78,0x01,0x8b,0xbe,0x7f,0x6e,0x59,0x31,0x8d,0x25,0x00,0x2c,0x5b,0xc6,0x78,0x01,0x67,0x09,0x8b,0xef,0x00,0x21};   //监控号码设置失败,密码有误!
  241. //BYTE      B_LcntFailRet[26]= {0x8b,0xf7,0x6c,0x42,0x5b,0x9a,0x4f,0x4d,0x59,0x31,0x8d,0x25,0x00,0x2c,0x8b,0xf7,0x7a,0x0d,0x54,0x0e,0x51,0x8d,0x8b,0xd5,0x00,0x21};             //请求定位失败,请稍后再试!
  242. //BYTE      B_TcpFailRet[22]=  {0x7f,0x51,0x7e,0xdc,0x7E,0x41,0x5F,0xD9,0x00,0x2c,0x8b,0xf7,0x7a,0x0d,0x54,0x0e,0x51,0x8d,0x8b,0xd5,0x00,0x21}; //网络繁忙,请稍后再试!
  243. BYTE      B_TcpFailRet[94] = { 0x79,0xFB,0x52,0xA8,0x51,0x6C,0x53,0xF8,0x00,0x47,
  244.    0x00,0x50,0x00,0x52,0x00,0x53,0x7F,0x51,0x7E,0xDC,
  245.    0x4E,0x0D,0x7A,0x33,0x5B,0x9A,0xFF,0x0C,0x89,0xE3,
  246.    0x67,0x90,0x4E,0x0D,0x62,0x10,0x52,0x9F,0x67,0x1B,
  247.    0x8C,0x05,0x89,0xE3,0xFF,0x01,0x4E,0xBA,0x5D,0xE5,
  248.    0x67,0xE5,0x8B,0xE2,0x75,0x35,0x8B,0xDD,0x00,0x30,
  249.    0x00,0x37,0x00,0x35,0x00,0x35,0x00,0x2D,0x00,0x32,
  250.    0x00,0x35,0x00,0x39,0x00,0x32,0x00,0x33,0x00,0x38,
  251.    0x00,0x34,0x00,0x35,0xFF,0x0C,0x7E,0xCF,0x7E,0xAC,
  252.    0x5E,0xA6,0xFF,0x1A};//移动公司GPRS网络不稳定,解析不成功望谅解!人工查询电话0755-25923845,经纬度:
  253. BYTE      B_AlarmRet[4][98]= {  0x7D, 0x27, 0x60, 0x25, 0x62, 0xA5, 0x8B, 0x66, 0x62, 0x16, 
  254. 0x6C, 0x42, 0x52, 0xA9, 0xFF, 0x01, 0x56, 0xDE, 0x59, 0x0D, 
  255. 0x00, 0x47, 0x52, 0xa0, 0x5b, 0xc6, 0x78, 0x01, 0x53, 0xEF, 
  256. 0x53, 0xD1, 0x8D, 0x77, 0x5B, 0x9A, 0x4F, 0x4D, 0xFF, 0x0C, 
  257. 0x56, 0xDE, 0x62, 0xE8, 0x75, 0x35, 0x8B, 0xDD, 0x53, 0xEF, 
  258. 0x76, 0xD1, 0x54, 0x2C, 0x8F, 0x66, 0x51, 0x85, 0x60, 0xC5, 
  259. 0x51, 0xB5, 0xFF, 0x01, 0x55, 0x2E, 0x54, 0x0E, 0x70, 0xED, 
  260. 0x7E, 0xBF, 0x00, 0x30, 0x00, 0x37, 0x00, 0x35, 0x00, 0x35, 
  261. 0x00, 0x2D, 0x00, 0x32, 0x00, 0x35, 0x00, 0x39, 0x00, 0x32, 
  262. 0x00, 0x33, 0x00, 0x38, 0x00, 0x34, 0x00, 0x35,
  263. 0x59, 0x82, 0x67, 0x65, 0x4E, 0x4B, 0x66, 0x1F, 0x63, 0xD0,
  264. 0x91, 0x92, 0xFF, 0x1A, 0x8B, 0xBE, 0x59, 0x07, 0x4E, 0x3B,
  265. 0x75, 0x35, 0x6E, 0x90, 0x67, 0x09, 0x65, 0x45, 0x96, 0x9C,
  266. 0xFF, 0x0C, 0x8B, 0xF7, 0x53, 0xCA, 0x65, 0xF6, 0x59, 0x04,
  267. 0x74, 0x06, 0xFF, 0x01, 0x00, 0x20, 0x00, 0x20, 0x20, 0x00,
  268. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  269. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  270. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  271. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  272. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,  
  273. 0x59, 0x82, 0x67, 0x65, 0x4E, 0x4B, 0x66, 0x1F, 0x63, 0xD0, 
  274. 0x91, 0x92, 0xFF, 0x1A, 0x8F, 0x66, 0x8F, 0x86, 0x67, 0x09, 
  275. 0x63, 0x2F, 0x52, 0xA8, 0xFF, 0x0C, 0x8B, 0xF7, 0x6C, 0xE8, 
  276. 0x61, 0x0F, 0x8F, 0x66, 0x8F, 0x86, 0x5B, 0x89, 0x51, 0x68, 
  277. 0xFF, 0x01, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  278. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  279. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  280. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  281. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  282. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20,
  283. 0x59, 0x82, 0x67, 0x65, 0x4E, 0x4B, 0x66, 0x1F, 0x63, 0xD0, 
  284. 0x91, 0x92, 0xFF, 0x1A, 0x8F, 0x66, 0x8F, 0x86, 0x67, 0x09, 
  285. 0x63, 0x2F, 0x52, 0xA8, 0xFF, 0x0C, 0x8B, 0xF7, 0x6C, 0xE8, 
  286. 0x61, 0x0F, 0x8F, 0x66, 0x8F, 0x86, 0x5B, 0x89, 0x51, 0x68, 
  287. 0xFF, 0x01, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  288. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  289. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  290. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  291. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 
  292. 0x00, 0x20, 0x00, 0x20, 0x00, 0x20, 0x00, 0x20};
  293. BYTE      B_DeviceNumRet1[18] = {0x62, 0x4B, 0x67, 0x3A, 0x53, 0xf7, 0x78, 0x01, 0x8B, 0xBE, 0x7F, 0x6E, 0x62, 0x10, 0x52, 0x9F, 0x00, 0x21};
  294. BYTE      B_DeviceNumRet0[18] = {0x62, 0x4B, 0x67, 0x3A, 0x53, 0xf7, 0x78, 0x01, 0x8B, 0xBE, 0x7F, 0x6E, 0x59, 0x31, 0x8d, 0x25, 0x00, 0x21};
  295. BYTE      B_ModemNumRet1[20] =  {0x4E, 0x2D, 0x5F, 0xC3, 0x73, 0x2B, 0x53, 0xf7, 0x78, 0x01, 0x8B, 0xBE, 0x7F, 0x6E, 0x62, 0x10, 0x52, 0x9F, 0x00, 0x21};
  296. BYTE      B_ModemNumRet0[20] =  {0x4E, 0x2D, 0x5F, 0xC3, 0x73, 0x2B, 0x53, 0xf7, 0x78, 0x01, 0x8B, 0xBE, 0x7F, 0x6E, 0x59, 0x31, 0x8d, 0x25, 0x00, 0x21};
  297. BYTE      B_GPSLctRet[20]= {0x5B, 0xC6, 0x78, 0x01, 0x95, 0x19, 0x8B, 0xEF, 0x00, 0x2C, 
  298. 0x65, 0xE0, 0x67, 0x43, 0x5B, 0x9A, 0x4F, 0x4D, 0x00, 0x21};
  299. //BYTE      B_LctInTimeNotice[26] = {0x52,0x06,0x94,0x9F,0x95,0xF4,0x96,0x94,0x76,0x84,0x5B,0x9A,0x65,0xF6,0x8F,0xFD,0x8E,0x2A,0x5D,0xF2,0x54,0x2F,0x52,0xA8,0x00,0x21};
  300. BYTE      B_LctInTimeNotice[24] = {0x79,0xd2,0x95,0xF4,0x96,0x94,0x76,0x84,0x5B,0x9A,0x65,0xF6,0x8F,0xFD,0x8E,0x2A,0x5D,0xF2,0x54,0x2F,0x52,0xA8,0x00,0x21};
  301. BYTE      B_OverSpeedSetNotice[30] = {0x00,0x4b, 0x00,0x6d, 0x00,0x2f, 0x00,0x68, 0x8D,0x85, 0x90,0x1F, 0x62,0xA5, 0x8B,0x66, 0x90,0x1F, 0x5E,0xA6, 0x8B,0xBE, 0x7F,0x6E, 0x62,0x10, 0x52,0x9F, 0x00,0x21,};//超速报警速度设置成功
  302. //BYTE      B_N1234Notice[8] = {0x00,0x23,0x00,0x24,0x00,0x25,0x00,0x26};
  303. BYTE      B_X_Ret[58]={ 0x5B,0xC6,0x78,0x01,0x95,0x01,0x8F,0x66,0x5D,0xF2,
  304.   0x54,0x2F,0x52,0xA8,0xFF,0x0C,0x56,0xDE,0x59,0x0D,
  305.   0x00,0x4B,0x52,0xA0,0x5B,0xC6,0x78,0x01,0x89,0xE3,
  306.   0x96,0x64,0x30,0x02,0x8B,0x66,0x54,0x4A,0xFF,0x0C,
  307.   0x8B,0xE5,0x52,0x9F,0x80,0xFD,0x88,0x4C,0x9A,0x76,
  308.   0x4E,0x2D,0x52,0xFF,0x75,0x28,0xFF,0x01};
  309.   
  310. BYTE     B_K_Ret[16]={  0x5B,0xC6,0x78,0x01,0x95,0x01,0x8F,0x66,0x5D,0xF2,
  311.     0x89,0xE3,0x96,0x64,0xFF,0x01};
  312.     
  313. BYTE     B_Phone_Lct_Mode[22] = {0x75,0x35,0x8B,0xDD,0x5B,0x9A,0x4F,0x4D,
  314.                                  0x6A,0x21,0x5F,0x0F,0x8B,0xBE,0x7F,0x6E,0x62,0x10,0x52,0x9F,0x00,0x21};
  315. /********************************定义GPS初始化值************************************************/
  316. /*
  317. BYTE  bGPSIinitTable[32] = {0xA0,0xA2,0x00,0x18, //----------------------//head
  318.    0x81,0x02, //message id
  319.    0x00,0x01, // GGA output interval , has CheckSum?(1/0) (6,7)
  320.    0x00,0x01, // GLL (8,9)
  321. 0x00,0x01, //GSA (10,11)
  322. 0x00,0x01, //GSV
  323. 0x01,0x01, //RMC
  324. 0x00,0x01, //VTG
  325. 0x00,0x01, //MSS
  326. 0x00,0x01, //not defined
  327. 0x00,0x01, //ZDA
  328. 0x00,0x01, //not defined
  329. 0x12,0xC0, // bitrate ----------- //payload
  330. 0x01,0x60, //checksum 
  331. 0xB0,0xB3 // end sequence
  332.  };
  333. */  
  334. BYTE bGpsSet[6][25]={"$PSRF103,00,00,00,01*24","$PSRF103,01,00,00,01*25","$PSRF103,02,00,00,01*26",
  335.      "$PSRF103,03,00,00,01*27","$PSRF103,04,00,01,01*21","$PSRF103,05,00,00,01*21"};
  336. BYTE      B_SuperPassWord[]="159753";//超级密码
  337. BYTE      B_DefaultPassWord[]="1234";//默认密码
  338. //BYTE      B_DefaultMont[]="13392836733";
  339. BYTE      B_DefaultMont[]="13924662814";
  340. BYTE      B_DefaultModem[]="13925296854";
  341. //BYTE      B_DefaultIP[]="202.96.155.118";//默认IP地址
  342. BYTE      B_DefaultIP[]="58.61.160.72";//默认IP地址
  343. typedef struct  {
  344.   BYTE    bLatitude[12];//纬度
  345.   BYTE    bLongitude[12];//经度
  346.   BYTE    bCurDate[12];//当前日期
  347.   BYTE    bCurTime[12];//当前时间
  348.   BYTE    bSpeed[12];//速度
  349.   BYTE    bDirection[12];//方向
  350. }recGpsLct;
  351. recGpsLct  REC_GPSLCTINFO;
  352. BYTE    B_SwapDataCount=0;//重复连接交换数据次数
  353. BYTE    B_SmsSendCnt=0;//短消息重复发送次数
  354. static unsigned char led = 0x00;
  355. static unsigned char relay = 0x00,beep = 0x00;
  356. BYTE B_DisCnctRelayTime;
  357. //BYTE KEY;
  358. //BYTE RELAY;
  359. /**********************************************************************************/
  360.            
  361. /**************************定义函数列表*************************/
  362. void vSmsPutInBuf(BYTE bSmsLen,BYTE  bSmsBuf[]);
  363. void vRelayOut(void),vKeyCheck(void),vLedFlashing(void),vAtCmdOverTime(void);
  364. void vSendSmsData(void);
  365. void vSMSSendSucc(void);
  366. void vGpsCheckOver(void);
  367. void vIinitGps(void);
  368. void vStartAtCommand(BYTE bCommandItem);
  369. void vStopSoftTimer_A(WORD wIndex);
  370. void vSwapGpsLctTime(void);
  371. void vConfirmOK(void),vConfirmERROR(void),vConfirmRING(void),vConfirmCLIP(void),vConfirmCSQ(void),
  372.      vConfirmNOCARIR(void),vConfirmCMGS(void),vConfirmCMS_ERROR(void),vConfirmCCNT_OK(void),
  373.      vConfirmCLOSED(void),vConfirmCMGL(void),vConfirmCMTI(void),vConfirmCMGR(void),vConfirmCCID(void),
  374.      vConfirmCSCA(void),vConfirmIPD(void),vConfirmCallRdy(void),vConfirmCCNTFAIL(void),vSwapGpsStart(BYTE *bPhone,BYTE fbDataMode);
  375.      
  376. #define     MAX_CONFIRM_FUNC_NUM                        26
  377. struct FunctionTable    REC_ConfirmFunTable[ MAX_CONFIRM_FUNC_NUM ] = 
  378. {
  379. {
  380. "OK",
  381. vConfirmOK//1
  382. },
  383. {
  384. "SHUT OK",
  385. vConfirmOK//2
  386. },
  387. {
  388. "SEND OK",
  389. vConfirmOK//3
  390. },
  391. {
  392. "ERROR",
  393. vConfirmERROR//4
  394. },
  395. {
  396. "+CME ERROR:",
  397. vConfirmERROR//5
  398. },
  399. {
  400. "+CMS ERROR:",
  401. vConfirmCMS_ERROR//6
  402. },
  403. {
  404. "SEND FAIL:",
  405. vConfirmERROR//7
  406. },
  407. {
  408. "RING",
  409. vConfirmRING//8
  410. },
  411. {
  412. "+CLIP:",
  413. vConfirmCLIP//9
  414. },
  415. {
  416. "+CMGS:",
  417. vConfirmCMGS//10
  418. },
  419. {
  420. "CONNECT OK",
  421. vConfirmCCNT_OK//11
  422. },
  423. {
  424. "CLOSED",
  425. vConfirmCLOSED//12
  426. },
  427. {
  428. "NO CARRIER",
  429. vConfirmNOCARIR//13
  430. },
  431. {
  432. "NO ANSWER",
  433. vConfirmNOCARIR//14
  434. },
  435. {
  436. "BUSY",
  437. vConfirmNOCARIR//15
  438. },
  439. {
  440. "+CMGL:",
  441. vConfirmCMGL//16
  442. },
  443. {
  444. "+CMTI:",
  445. vConfirmCMTI//17
  446. },
  447. {
  448. "+CMGR:",
  449. vConfirmCMGR//18
  450. },
  451. {
  452. "+CSCA:",
  453. vConfirmCSCA//19
  454. },
  455. {
  456. "+IPD",
  457. vConfirmIPD//20
  458. },
  459. {
  460. "Call Ready",
  461. vConfirmCallRdy//21
  462. },
  463. {
  464. "CONNECT FAIL",
  465. vConfirmCCNTFAIL//22
  466. },
  467. {
  468. "AT+CCID",
  469. vConfirmCCID//23
  470. },
  471. {
  472. "NO DIALTONE",
  473. vConfirmNOCARIR//24//NO DIALTONE 
  474. },
  475. {
  476. "+CSQ:",
  477. vConfirmCSQ//25
  478. }
  479. };
  480.  /*setupclock function*/
  481. void SetupClock(void)
  482. {
  483.   RCC_DeInit ();                        /* RCC system reset(for debug purpose)*/
  484.   RCC_HSEConfig (RCC_HSE_ON);           /* Enable HSE                         */
  485.   /* Wait till HSE is ready                                                   */
  486.   while (RCC_GetFlagStatus(RCC_FLAG_HSERDY) == RESET);
  487.   RCC_HCLKConfig   (RCC_SYSCLK_Div1);   /* HCLK   = SYSCLK                    */
  488.   RCC_PCLK2Config  (RCC_HCLK_Div1);     /* PCLK2  = HCLK                      */
  489.   RCC_PCLK1Config  (RCC_HCLK_Div2);     /* PCLK1  = HCLK/2                    */
  490.   RCC_ADCCLKConfig (RCC_PCLK2_Div4);    /* ADCCLK = PCLK2/4                   */
  491.   *(vu32 *)0x40022000 = 0x01;           /* Flash 2 wait state                 */
  492.   /* PLLCLK = 8MHz * 9 = 72 MHz                                               */
  493.   RCC_PLLConfig (RCC_PLLSource_HSE_Div1, RCC_PLLMul_9);
  494.   RCC_PLLCmd (ENABLE);                  /* Enable PLL                         */
  495.   /* Wait till PLL is ready                                                   */
  496.   while (RCC_GetFlagStatus(RCC_FLAG_PLLRDY) == RESET);
  497.   /* Select PLL as system clock source                                        */
  498.   RCC_SYSCLKConfig (RCC_SYSCLKSource_PLLCLK);
  499.   /* Wait till PLL is used as system clock source                             */
  500.   while (RCC_GetSYSCLKSource() != 0x08);
  501.   /* Enable USART1 and GPIOA clock                                            */
  502.   RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);
  503.   /* Enable GPIOB clock */
  504.   RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
  505.   /* Enable USART2 */
  506.   RCC_APB1PeriphClockCmd (RCC_APB1Periph_USART2, ENABLE);
  507.   /* I2C1 Periph clock enable */
  508.   //RCC_APB1PeriphClockCmd(RCC_APB1Periph_I2C1, ENABLE);
  509.   /* Check if the system has resumed from IWDG reset -------------------------*/
  510.   if(RCC_GetFlagStatus(RCC_FLAG_IWDGRST) != RESET)
  511.   { /* IWDGRST flag set */
  512. /* Clear reset flags */
  513.     RCC_ClearFlag();
  514.   }
  515.   /* Enable LSI */
  516.   RCC_LSICmd(ENABLE);
  517.  
  518.   /* Enable write access to IWDG_PR and IWDG_RLR registers */
  519.   IWDG_WriteAccessCmd(IWDG_WriteAccess_Enable);
  520.   /* IWDG counter clock: 32KHz(LSI) / 32 = 1KHz */
  521.   IWDG_SetPrescaler(IWDG_Prescaler_32);
  522.   /* Set counter reload value to 349 */
  523.   IWDG_SetReload(349);
  524.   /* Reload IWDG counter */
  525.   IWDG_ReloadCounter();
  526.   /* SysTick event each 10 ms with input clock equal to 9MHz (HCLK/8)         */
  527.   SysTick_SetReload(90000);
  528.   SysTick_ITConfig(ENABLE);             /* Enable SysTick interrupt           */
  529. }
  530. /*******************************************************************************
  531. * Function Name  : NVIC_Configuration
  532. * Description    : Configures the nested vectored interrupt controller.
  533. * Input          : None
  534. * Output         : None
  535. * Return         : None
  536. *******************************************************************************/
  537. void NVIC_Configuration(void)
  538. {
  539.   NVIC_InitTypeDef NVIC_InitStructure;
  540. #ifdef  VECT_TAB_RAM  
  541.   /* Set the Vector Table base location at 0x20000000 */ 
  542.   NVIC_SetVectorTable(NVIC_VectTab_RAM, 0x0); 
  543. #else  /* VECT_TAB_FLASH  */
  544.   /* Set the Vector Table base location at 0x08000000 */ 
  545.   NVIC_SetVectorTable(NVIC_VectTab_FLASH, 0x0);   
  546. #endif
  547.   /* Enable the USART1 Interrupt */
  548.   NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQChannel;
  549.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  550.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  551.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  552.   NVIC_Init(&NVIC_InitStructure);
  553.  /* Enable the USART2 Interrupt */
  554.   NVIC_InitStructure.NVIC_IRQChannel = USART2_IRQChannel;
  555.   NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0;
  556.   NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0;
  557.   NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
  558.   NVIC_Init(&NVIC_InitStructure);
  559. }
  560.  void SetupUART (void)  {
  561.   GPIO_InitTypeDef  GPIO_InitStructure;
  562.   USART_InitTypeDef USART_InitStructure;
  563.   
  564.   /* Configure USART1 Rx (PA10) as input floating                             */
  565.   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_10;
  566.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
  567.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  568.   /* Configure USART1 Tx (PA9) as alternate function push-pull                */
  569.   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_9;
  570.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  571.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  572.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  573.   
  574.   /* Configure USART2 Rx (PA3) as input floating                             */
  575.   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_3;
  576.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING;
  577.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  578.   /* Configure USART2 Tx (PA2) as alternate function push-pull                */
  579.   GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_2;
  580.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  581.   GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_AF_PP;
  582.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  583.   /* USART1,2 configured as follow:
  584.         - BaudRate = 115200 baud  
  585.         - Word Length = 8 Bits
  586.         - One Stop Bit
  587.         - No parity
  588.         - Hardware flow control disabled (RTS and CTS signals)
  589.         - Receive and transmit enabled
  590.         - USART Clock disabled
  591.         - USART CPOL: Clock is active low
  592.         - USART CPHA: Data is captured on the middle 
  593.         - USART LastBit: The clock pulse of the last data bit is not output to 
  594.                          the SCLK pin
  595.   */
  596.   USART_InitStructure.USART_BaudRate            = 4800;
  597.   USART_InitStructure.USART_WordLength          = USART_WordLength_8b;
  598.   USART_InitStructure.USART_StopBits            = USART_StopBits_1;
  599.   USART_InitStructure.USART_Parity              = USART_Parity_No ;
  600.   USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
  601.   USART_InitStructure.USART_Mode                = USART_Mode_Rx | USART_Mode_Tx;
  602.   USART_InitStructure.USART_Clock               = USART_Clock_Disable;
  603.   USART_InitStructure.USART_CPOL                = USART_CPOL_Low;
  604.   USART_InitStructure.USART_CPHA                = USART_CPHA_2Edge;
  605.   USART_InitStructure.USART_LastBit             = USART_LastBit_Disable;
  606.   
  607.   USART_Init(USART2, &USART_InitStructure);
  608.   USART_InitStructure.USART_BaudRate            = 4800;
  609.   USART_Init(USART1, &USART_InitStructure);
  610.   
  611.   /* Enable the USART Transmoit interrupt: this interrupt is generated when the 
  612.    USART1 transmit data register is empty */  
  613. //  USART_ITConfig(USART1, USART_IT_TXE, ENABLE);
  614. /* Enable the USART Receive interrupt: this interrupt is generated when the 
  615.    USART1 receive data register is not empty */
  616.   USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);
  617. /* Enable the USART Transmoit interrupt: this interrupt is generated when the 
  618.    USART2 transmit data register is empty */  
  619. //  USART_ITConfig(USART2, USART_IT_TXE, ENABLE);
  620. /* Enable the USART Receive interrupt: this interrupt is generated when the 
  621.    USART1 receive data register is not empty */
  622.   USART_ITConfig(USART2, USART_IT_RXNE, ENABLE);
  623.   
  624.   USART_Cmd(USART1, ENABLE); 
  625.   USART_Cmd(USART2, ENABLE); 
  626. }
  627. void SetRELAYOut(void) {
  628.   GPIO_InitTypeDef  GPIO_InitStructure;
  629.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_13;
  630.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  631.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  632.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  633.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_11;
  634.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  635.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  636.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  637. }
  638. void SetSCLOut (void) {
  639.   GPIO_InitTypeDef  GPIO_InitStructure;
  640.   /* Configure I2C1 pins: SCL */
  641.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_6;
  642.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  643.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  644.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  645. }
  646. void SetSDAOut(void) {
  647.   GPIO_InitTypeDef  GPIO_InitStructure;
  648.   /* Configure I2C1 pins: SDA */
  649.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  650.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  651.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  652.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  653. }
  654. void SetSDAIn(void) {
  655.   GPIO_InitTypeDef  GPIO_InitStructure;
  656.   /* Configure I2C1 pins: SDA */
  657.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  658.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  659.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  660.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  661. }
  662. void SetKEYIn(void) {
  663.   GPIO_InitTypeDef  GPIO_InitStructure;
  664.   /* Configure P15 pins: KEY */
  665.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_15;
  666.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  667.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  668.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  669. }
  670. void SetACCIn(void) {
  671.   GPIO_InitTypeDef  GPIO_InitStructure;
  672.   /* Configure P4 pins: ACC */
  673.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_4;
  674.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  675.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  676.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  677. }
  678. void SetZHDIn(void) {
  679.   GPIO_InitTypeDef  GPIO_InitStructure;
  680.   /* Configure P9 pins: ZHD */
  681.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_9;
  682.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  683.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  684.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  685. }
  686. void SetPWRCHKIn(void) {
  687.   GPIO_InitTypeDef  GPIO_InitStructure;
  688.   /* Configure P14 pins: PWRCHK */
  689.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_14;
  690.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  691.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
  692.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  693. }
  694. void SetupLED (void) {
  695.   GPIO_InitTypeDef  GPIO_InitStructure;
  696.   
  697.   /* Configure PA7 as outputs push-pull, max speed 50 MHz               */
  698.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_7;
  699.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  700.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  701.   GPIO_Init(GPIOA, &GPIO_InitStructure);
  702.   /* Configure PB0 as outputs push-pull, max speed 50 MHz               */
  703.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_0;
  704.   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  705.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  706.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  707.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  708.   /* Configure PB1 as outputs push-pull, max speed 50 MHz               */
  709.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_1;
  710.   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  711.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  712.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  713.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  714. /* Configure PB12 as outputs push-pull, max speed 50 MHz               */
  715.   GPIO_InitStructure.GPIO_Pin =  GPIO_Pin_12;
  716.   GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  717.   //GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
  718.   GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  719.   GPIO_Init(GPIOB, &GPIO_InitStructure);
  720.   /* Enable the SysTick Counter                                               */
  721.   SysTick_CounterCmd(SysTick_Counter_Enable);
  722. }
  723. /* Implementation of putchar (also used by printf function to output data)    */
  724. int SendChar1 (int ch)  {                /* Write character to Serial Port     */
  725.   USART_SendData(USART1, (unsigned char) ch);
  726.   while (!(USART1->SR & USART_FLAG_TXE));
  727.   return (ch);
  728. }
  729. /* Implementation of putchar (also used by printf function to output data)    */
  730. int SendChar2 (int ch)  {                /* Write character to Serial Port     */
  731.   USART_SendData(USART2, (unsigned char) ch);
  732.   while (!(USART2->SR & USART_FLAG_TXE));
  733.   return (ch);
  734. }
  735. void ClrRELAY()
  736. {
  737. // RELAY=0;//.13
  738. GPIOB->ODR  &= 0xFFFFDFFF;
  739. relay = 0x00;
  740. }
  741. void SetRELAY()
  742. {
  743. // RELAY=1;//.13
  744. GPIOB->ODR  |= 0x00002000;
  745. relay = 0xff;
  746. }
  747. void ClrBeep()
  748. {
  749. // BEEP=0;//.11
  750. GPIOA->ODR  &= 0xFFFFF7FF;
  751. beep = 0x00;
  752. }
  753. void SetBeep()
  754. {
  755. // BEEP=1;//.11
  756. GPIOA->ODR  |= 0x00000800;
  757. beep = 0xff;
  758. }
  759. void ClrLED()
  760. {
  761. // LED=0;//.7
  762. GPIOA->ODR  &= 0xFFFFFF7F;
  763. led = 0x00;
  764. }
  765. void SetLED()
  766. {
  767. // LED=1;//.7
  768. GPIOA->ODR  |= 0x00000080;
  769. led = 0xff;
  770. }
  771. void ClrSCL(void)
  772. {
  773. // SCL=0;//.6
  774. GPIOB->ODR  &= 0xFFFFFFBF;
  775. }
  776. void SetSCL(void)
  777. {
  778. // SCL=1;//.6
  779. GPIOB->ODR  |= 0x00000040;
  780. }
  781. void ClrSDA(void)
  782. {
  783. // SDA=0;//.7
  784. GPIOB->ODR  &= 0xFFFFFF7F;
  785. }
  786. void SetSDA(void)
  787. {
  788. // SDA=1;//.7
  789. GPIOB->ODR  |= 0x00000080;
  790. }
  791. u16 GetSDA(void)
  792. {
  793. return (GPIOB->IDR);
  794. }
  795. u16 GetAcc(void)
  796. {
  797. return (GPIOA->IDR);
  798. }
  799. void SomeNOP()
  800. {
  801.   u16 dly_time;
  802.   for(dly_time=0;dly_time<60;dly_time++);
  803. }
  804. void Delay_lms(void)
  805. {
  806.   u16 dly_time;
  807.   for(dly_time=0;dly_time<600;dly_time++);
  808. }
  809. void Delay_l0ms(void)
  810. {
  811.   u8 dly_time;
  812.   for(dly_time=0;dly_time<50;dly_time++)Delay_lms();
  813.   IWDG_ReloadCounter();//喂狗
  814. }
  815. /**--------------------------------------------------------------------------------
  816. 调用方式:void I2CStart(void) 
  817. 函数说明:私有函数,I2C专用
  818. ---------------------------------------------------------------------------------*/
  819. //发启始条件:时钟线为高时数据线发生下降沿跳变
  820. void I2CStart(void)
  821. {
  822. //// EA=0;
  823. // SCL=0;//.6
  824. ClrSCL();
  825. SomeNOP();
  826. // SDA=1;//.7
  827. SetSDA();
  828. SomeNOP();
  829. // SCL=1;
  830. SetSCL();
  831. SomeNOP();
  832. // SDA=0;
  833. ClrSDA();
  834. SomeNOP();
  835. }
  836. /**--------------------------------------------------------------------------------
  837. 调用方式:void I2CStop(void) 
  838. 函数说明:私有函数,I2C专用
  839. ---------------------------------------------------------------------------------*/
  840. // 发结束条件:时钟线为高时数据线发生上升沿跳变
  841. void I2CStop(void)
  842. {
  843. // SCL=0;
  844. ClrSCL();
  845. SomeNOP();
  846. // SDA=0;
  847. ClrSDA();
  848. SomeNOP();
  849. // SCL=1;
  850. SetSCL();
  851. SomeNOP();
  852. // SDA=1;
  853. SetSDA();
  854. SomeNOP();
  855. //// EA=1;
  856. }
  857. /**--------------------------------------------------------------------------------
  858. 调用方式:void I2CSend(BYTE ch) 
  859. 函数说明:私有函数,I2C专用
  860. ---------------------------------------------------------------------------------*/
  861. void I2CSendByte(u8 ch)
  862. {
  863.   u8 i=8;
  864. //  u8 time_1=255;
  865. while (i--)
  866. {
  867. // SCL=0;
  868. ClrSCL();
  869. SomeNOP();
  870. if((ch&0x80)==0x00)ClrSDA();
  871. else               SetSDA();
  872. ch<<=1; 
  873. SomeNOP();
  874. // SCL=1; 
  875. SetSCL();
  876. SomeNOP();
  877. }
  878. // SCL=0;  //SCL的下降沿发送最后一位
  879. ClrSCL();
  880. SomeNOP();
  881. // SDA=1;
  882. SetSDA();
  883. SomeNOP();
  884. // SCL=1;
  885. SetSCL();
  886. SomeNOP();
  887. SetSDAIn();
  888. //while(SDA)
  889. while( ((GetSDA())& 0x0080) == 0x0080)
  890. {
  891. // if(--time_1==0)
  892. // break;
  893. }
  894. SetSDAOut();
  895. }
  896. /**--------------------------------------------------------------------------------
  897. 调用方式:BYTE I2CReceive_ACK(void)
  898. 函数说明:私有函数,I2C专用
  899.  ---------------------------------------------------------------------------------*/
  900. u8 I2CReceiveByte_ACK(void)//读取中间一个字节
  901. {
  902.   u8 i=8;
  903.   u8 ddata=0;
  904. SetSDAIn();
  905. while (i--)
  906. {
  907. ddata<<=1;
  908. // SCL=0;
  909. ClrSCL();
  910. SomeNOP();
  911. // SCL=1;
  912. SetSCL();
  913. SomeNOP();
  914. // ddata|=SDA;
  915. if( ((GetSDA())& 0x0080) == 0x0080)ddata|=0x01;
  916. else                               ddata&=0xfe; 
  917. }
  918. SetSDAOut();
  919. // SCL=0;
  920.     ClrSCL();
  921. SomeNOP();
  922. // SDA=0; 
  923. ClrSDA();
  924. SomeNOP();
  925. // SCL=1; 
  926. SetSCL();
  927. SomeNOP();
  928. return ddata;
  929. }
  930. /**--------------------------------------------------------------------------------
  931. 调用方式:BYTE I2CReceive(void)
  932. 函数说明:私有函数,I2C专用
  933.  ---------------------------------------------------------------------------------*/
  934. u8 I2CReceiveByte(void)//读取最后一个字节
  935. {
  936.   u8 i=8;
  937.   u8 ddata=0;
  938. SetSDAIn();
  939. while (i--)
  940. {
  941. ddata<<=1;
  942. // SCL=0;
  943. ClrSCL();
  944. SomeNOP();
  945. // SCL=1;
  946. SetSCL();
  947. SomeNOP();
  948. // ddata|=SDA;//SCL上升沿锁定一个数据
  949. if( ((GetSDA())& 0x0080) == 0x0080)ddata|=0x01;
  950. else                               ddata&=0xfe; 
  951. }
  952. SetSDAOut();
  953. // SCL=0;
  954. ClrSCL();
  955. SomeNOP();
  956. // SDA=1; 
  957. SetSDA();
  958. SomeNOP();
  959. // SCL=1; 
  960. SetSCL();
  961. SomeNOP();
  962. return ddata;
  963. }
  964. u8 bISP_IAP_ByteRead(u16 wAddr)
  965. {
  966.   u8 bTemp;
  967.   u16 wTemp;
  968. wTemp = wAddr;
  969. wTemp >>= 8;
  970. I2CStart();
  971. I2CSendByte(0xa0);
  972. I2CSendByte((u8)wTemp);
  973. I2CSendByte((u8)wAddr);
  974. SomeNOP();
  975. I2CStart();
  976. I2CSendByte(0xa1);
  977. bTemp = I2CReceiveByte();
  978. I2CStop();
  979. return bTemp;
  980. }
  981. void vISP_IAP_ByteProgram(u8 bTemp,u16 wAddr)
  982. {
  983.   u16 wTemp;
  984.   
  985. wTemp = wAddr;
  986. wTemp >>= 8;
  987. I2CStart();
  988. I2CSendByte(0xa0);
  989. I2CSendByte((u8)wTemp);
  990. I2CSendByte((u8)wAddr);
  991. I2CSendByte(bTemp);
  992. I2CStop();
  993. Delay_l0ms();
  994. }
  995. //==============================================================================
  996. u16 wTimer0Ccount(void)
  997. {
  998.   u16  wT;
  999. wT = W_TimeCount;
  1000. return(wT);
  1001. }
  1002. void vDelayTime(u16 wCount)
  1003. {
  1004.   u16  wStartCount;
  1005. wStartCount = wTimer0Ccount(); /* get the start count */
  1006. while ((wTimer0Ccount() - wStartCount) <= wCount)   /* wait for count "ticks" */
  1007. {
  1008.     IWDG_ReloadCounter();//喂狗
  1009.    }
  1010. }
  1011. /********************************************************************************************
  1012. **函数名:      vTurnOnGsm
  1013. **功能简介:    硬件控制SIM508开机
  1014. **参数说明:    无
  1015. **调用函数:    无
  1016. **全局变量:    无
  1017. **函数返回:    无
  1018. **最后修改时间:2007-02-09
  1019. **********************************************************************************************/
  1020. void vTurnOnGsm(void)
  1021. {
  1022. GPIOB->ODR &= 0xfffffffd;
  1023. vDelayTime(250);
  1024. GPIOB->ODR |= 0x00000002;
  1025. vDelayTime(300);
  1026. }
  1027. void vRestGPS(void)
  1028. {
  1029. GPIOB->ODR &= 0xfffffffe;//低电平
  1030. vDelayTime(50);
  1031. GPIOB->ODR |= 0x00000001;//高电平
  1032. vDelayTime(50);
  1033. GPIOB->ODR &= 0xfffffffe;//低电平
  1034. vDelayTime(300);
  1035. vIinitGps();
  1036. vIinitGps();
  1037. }
  1038. /********************************************************************************************
  1039. **函数名:      vTurnOffGsm
  1040. **功能简介:    硬件控制SIM508关机
  1041. **参数说明:    无
  1042. **调用函数:    无
  1043. **全局变量:    无
  1044. **函数返回:    无
  1045. **最后修改时间:2007-02-09
  1046. **********************************************************************************************/
  1047. void vTurnOffGsm(void)
  1048. {
  1049. GPIOB->ODR &= 0xfffffffd;
  1050. vDelayTime(70);
  1051. GPIOB->ODR |= 0x00000002;
  1052. }
  1053. /******************************************************************************
  1054. **函 数 名  :     vMcuTimer0Intr
  1055. **功能简介  :     定时器0中断服务函数
  1056. **参数说明  :     无
  1057. **调用函数  :     无
  1058. **被调用函数:     无
  1059. **全局变量  :     W_TimeCount
  1060. **返 回 值  :     无
  1061. **函数版本  :     V1.00.00
  1062. **修改时间  :     2007-01-27
  1063. ******************************************************************************/
  1064. /* SysTick interrupt happens every 10 ms                                      */
  1065. void SysTick_Handler (void) 
  1066. {
  1067. W_TimeCount++;
  1068. if(GPS_V_F)B_GpsVFTimer++;
  1069. if(B_OverBeepStart)B_OverBeepTimer++;
  1070.    
  1071. }
  1072. /*******************************************************************************
  1073. * Function Name  : USART1_IRQHandler
  1074. * Description    : This function handles USART1 global interrupt request.
  1075. * Input          : None
  1076. * Output         : None
  1077. * Return         : None
  1078. *******************************************************************************/
  1079. void USART1_IRQHandler(void)
  1080. {
  1081.   BYTE bTByte2;
  1082.   WORD wTPsn2;
  1083.   if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)
  1084.   {
  1085.     /* Read one byte from the receive data register */
  1086. bTByte2 = (USART_ReceiveData(USART1));
  1087. wTPsn2  =  W_InSerial2;
  1088. if(++wTPsn2 ==  MAX_SERIAL_LEN2) wTPsn2  =  0;//修改指针边界
  1089.     if(wTPsn2  !=  W_OutSerial2)//队列没有满的情况下
  1090.     {
  1091.         B_SerialQueue2[W_InSerial2]  =  bTByte2;
  1092.         W_InSerial2  =  wTPsn2;
  1093.     }    
  1094.     /* Clear the USART1 Receive interrupt */
  1095.     USART_ClearITPendingBit(USART1, USART_IT_RXNE);
  1096.   }
  1097. }
  1098. /*******************************************************************************
  1099. * Function Name  : USART2_IRQHandler
  1100. * Description    : This function handles USART2 global interrupt request.
  1101. * Input          : None
  1102. * Output         : None
  1103. * Return         : None
  1104. *******************************************************************************/
  1105. void USART2_IRQHandler(void)
  1106. {
  1107.   BYTE bTByte;
  1108.   WORD wTPsn;
  1109.   if(USART_GetITStatus(USART2, USART_IT_RXNE) != RESET)
  1110.   {
  1111.     /* Read one byte from the receive data register */
  1112. bTByte = (USART_ReceiveData(USART2));
  1113. wTPsn  =  W_InSerial;
  1114. if(++wTPsn ==  MAX_SERIAL_LEN) wTPsn  =  0;//修改指针边界
  1115.     if(wTPsn  !=  W_OutSerial)//队列没有满的情况下
  1116.     {
  1117.         B_SerialQueue[W_InSerial]  =  bTByte;
  1118.         W_InSerial  =  wTPsn;
  1119.     }    
  1120.     /* Clear the USART1 Receive interrupt */
  1121.     USART_ClearITPendingBit(USART2, USART_IT_RXNE);
  1122.   }
  1123. }
  1124. /******************************************************************************
  1125. **函 数 名  :     vInitSoftTimer
  1126. **功能简介  :     软定时器初始化
  1127. **参数说明  :     无
  1128. **调用函数  :     无
  1129. **被调用函数:     main
  1130. **全局变量  :     REC_A_SoftTimers
  1131. **返 回 值  :     无
  1132. **函数版本  :     V1.00.00
  1133. **修改时间  :     2007-01-27
  1134. ******************************************************************************/
  1135. void  vInitSoftTimer(void)
  1136. {
  1137.   WORD wI;
  1138. //初始化A类软定时器
  1139. for(wI = 0; wI < MAX_A_SOFT_TIMERS; wI++)
  1140. {
  1141. REC_A_SoftTimers[wI].bStartFb = 0;
  1142. REC_A_SoftTimers[wI].wOverValue = 0;
  1143. REC_A_SoftTimers[wI].pfTimerFunction = NULL;
  1144. }
  1145. }
  1146. /******************************************************************************
  1147. **函 数 名  :    vSoftTimerSum
  1148. **功能简介  :    用于查询软定时器计时
  1149. **参数说明  :    无
  1150. **调用函数  :    无
  1151. **被调用函数:    main
  1152. **全局变量  :    W_TimeCount,REC_A_SoftTimers
  1153. **返 回 值  :    无
  1154. **函数版本  :    V1.00.00
  1155. **修改时间  :    2007-01-27
  1156. ******************************************************************************/
  1157. void vSoftTimerSum(void)
  1158. {
  1159.   WORD wI;
  1160. if(B_GpsVFTimer>2)//gps状态灯指示
  1161. {
  1162. B_GpsVFTimer = 0;
  1163. //LED = 0;
  1164. ClrLED();
  1165. }
  1166. if(B_OverBeepTimer > 10)
  1167. {
  1168. B_OverBeepTimer = 0;
  1169. //驱动封鸣器
  1170. if(beep)ClrBeep();
  1171. else    SetBeep();
  1172. }
  1173. if(W_TimeCount<MIN_TIME_PERIOD)return;
  1174. W_TimeCount = 0;                        //一秒钟时间到
  1175.     for(wI = 0; wI < MAX_A_SOFT_TIMERS; wI++)//检测A类定时器
  1176.     {
  1177.      if(REC_A_SoftTimers[wI].bStartFb == 1)//只有启动了的定时器才作检测
  1178. {
  1179. if(REC_A_SoftTimers[wI].wOverValue>0)
  1180. {
  1181. if(--REC_A_SoftTimers[wI].wOverValue == 0)
  1182. {
  1183. REC_A_SoftTimers[wI].bStartFb = 0;
  1184. REC_A_SoftTimers[wI].pfTimerFunction();//溢出处理
  1185. }
  1186. }
  1187. }
  1188. }
  1189. if(++B_NoCsqTimer > 120)
  1190. {
  1191. B_NoCsqTimer = 0;
  1192. GPIOB->ODR &= 0xffffefff;//power//低电平
  1193. vDelayTime(500);
  1194. GPIOB->ODR |= 0x00001000;//power//高电平
  1195. vDelayTime(500);
  1196. vTurnOnGsm();//开GSM508时序
  1197. EN_CommandStatus = NO_COMMAND_WAIT;
  1198. DW_SetAtCmdFlag = MAC_SET_AT_CMD;
  1199. vStopSoftTimer_A(AT_CMD_WAITING_TIMER); //停止AT命令超时等待定时器
  1200. B_AtCmdTimes = 0;
  1201. B_AtCommandItem = 0xff;//最后赋值成无意义值
  1202. W_InSerial  = 0;
  1203. W_OutSerial = 0;
  1204. }
  1205. if(++W_PowerSwitchTimer > 28800)//8个小时
  1206. {
  1207. W_PowerSwitchTimer = 0;
  1208. GPIOB->ODR &= 0xffffefff;//power//低电平
  1209. vDelayTime(500);
  1210. GPIOB->ODR |= 0x00001000;//power//高电平
  1211. vDelayTime(500);
  1212. vTurnOnGsm();//开GSM508时序
  1213. EN_CommandStatus = NO_COMMAND_WAIT;
  1214. DW_SetAtCmdFlag = MAC_SET_AT_CMD;
  1215. vStopSoftTimer_A(AT_CMD_WAITING_TIMER); //停止AT命令超时等待定时器
  1216. B_AtCmdTimes = 0;
  1217. B_AtCommandItem = 0xff;//最后赋值成无意义值
  1218. W_InSerial  = 0;
  1219. W_OutSerial = 0;
  1220. }
  1221. if(FB_AtdDelayStart)//ATD电话拨打延时准备
  1222. if(++B_AtdDelayTimer >= 30)//延时到
  1223. {
  1224. FB_AtdDelayStart = 0;
  1225. B_AtdDelayTimer = 0; 
  1226. vStartAtCommand(MAC_ATD_ITEM);//拨打电话
  1227. FB_AtdReg = 1;
  1228. }
  1229. }
  1230. vRelayOut();
  1231. vKeyCheck();//按键检测,一秒钟检测一次
  1232. if(B_NetStatus == 1)//网络标志值为'1'不许时间太长
  1233. {
  1234. if(++B_NetValue_1_Cnt > 60)
  1235. {
  1236. B_NetValue_1_Cnt = 0;
  1237. vStartAtCommand(MAC_CIPSHUT_ITEM);//关断IP连接
  1238. }
  1239. }
  1240. else    B_NetValue_1_Cnt = 0;
  1241. }
  1242. /******************************************************************************
  1243. **函 数 名  :    vStartSoftTimer_A
  1244. **功能简介  :    启动一软定时器A
  1245. **参数说明  :    wIndex--为定时器索引,范围0至MAX_A_SOFT_TIMERS-1,
  1246.                   wDelay--定时时间,pfTimerFun--时间到后执行的函数
  1247. **调用函数  :    无
  1248. **被调用函数:    暂无
  1249. **全局变量  :    REC_A_SoftTimers[MAX_A_SOFT_TIMERS]
  1250. **函数返回  :    无
  1251. **修改时间  :    2007-01-27
  1252. ******************************************************************************/
  1253. void vStartSoftTimer_A(WORD wIndex,WORD wDelay,void(*pfTimerFun)(void))
  1254. {
  1255.    if(wIndex>=MAX_A_SOFT_TIMERS)return;//没有这个定时器
  1256. REC_A_SoftTimers[wIndex].wOverValue = wDelay;
  1257. REC_A_SoftTimers[wIndex].bStartFb = 1;
  1258. REC_A_SoftTimers[wIndex].pfTimerFunction = pfTimerFun;
  1259. }
  1260. /******************************************************************************
  1261. **函 数 名  :    vStopSoftTimer_A
  1262. **功能简介  :    停止一软定时器A
  1263. **参数说明  :    wIndex--为定时器索引,范围0至MAX_A_SOFT_TIMERS-1,
  1264. **调用函数  :    无
  1265. **被调用函数:    暂无
  1266. **全局变量  :    REC_A_SoftTimers[MAX_A_SOFT_TIMERS]
  1267. **函数返回  :    无
  1268. **修改时间  :    2006-04-11
  1269. ******************************************************************************/
  1270. void vStopSoftTimer_A(WORD wIndex)
  1271. {
  1272.    if(wIndex>=MAX_A_SOFT_TIMERS)return;//没有这个定时器
  1273. REC_A_SoftTimers[wIndex].wOverValue = 0;
  1274. REC_A_SoftTimers[wIndex].bStartFb = 0;
  1275. REC_A_SoftTimers[wIndex].pfTimerFunction = NULL;
  1276. }
  1277. /******************************************************************************
  1278. **函 数 名  :     vMcuSerialIntr
  1279. **功能简介  :     MCU串口1中断服务函数
  1280. **参数说明  :     无
  1281. **调用函数  :     无
  1282. **被调用函数:     无
  1283. **全局变量  :     W_InSerial, W_OutSerial
  1284. **返 回 值  :     无
  1285. **函数版本  :     V1.00.00
  1286. **修改时间  :     2007-01-27
  1287. ******************************************************************************/
  1288. /*
  1289. void vMcuSerialIntr(void) interrupt  SERIAL_INT_NUM   //4 
  1290. {
  1291.   BYTE bTByte;
  1292.   WORD wTPsn;
  1293.     
  1294. if(RI)        //接收中断服务函数
  1295.     {
  1296. RI = 0;
  1297. bTByte  =  SBUF;//最好先读一下
  1298. wTPsn  =  W_InSerial;
  1299. if(++wTPsn ==  MAX_SERIAL_LEN) wTPsn  =  0;//修改指针边界
  1300.         if(wTPsn  !=  W_OutSerial)//队列没有满的情况下
  1301.         {
  1302.             B_SerialQueue[W_InSerial]  =  bTByte;
  1303.             W_InSerial  =  wTPsn;
  1304.         }    
  1305.     }
  1306. }
  1307. */
  1308. /******************************************************************************
  1309. **函 数 名  :     wReadSerial
  1310. **功能简介  :     读MCU串口1缓冲中的一个字节
  1311. **参数说明  :     无
  1312. **调用函数  :     vCloseINTR(),vOpenINT()
  1313. **被调用函数:     暂无
  1314. **全局变量  :     W_InSerial, W_OutSerial
  1315. **返 回 值  :     WORD类型,为读出一字节内容
  1316. **函数版本  :     V1.00.00
  1317. **修改时间  :     2007-01-27
  1318. ******************************************************************************/
  1319. WORD  wReadSerial(void)
  1320. {
  1321. BYTE bTByte;
  1322. //vCloseINTR();//关中断
  1323. if(W_InSerial  ==  W_OutSerial)//没有字节内容可读取
  1324. {
  1325. //vOpenINTR();//开中断
  1326. return 0x0100;//返回无意义的值(凡是高子节不为零的数都是无意义的值
  1327. }
  1328. bTByte  = B_SerialQueue[W_OutSerial];
  1329. if(++W_OutSerial == MAX_SERIAL_LEN) W_OutSerial = 0; //修改指针边界
  1330. //vOpenINTR();//开中断
  1331. return   ((WORD)bTByte);    
  1332. }
  1333. /******************************************************************************
  1334. **函 数 名  :     wGetSerialUnReadBytes
  1335. **功能简介  :     获取MCU串口1缓冲中当前未读的字节数目
  1336. **参数说明  :     无
  1337. **调用函数  :     vCloseINTR(),vOpenINT()
  1338. **被调用函数:     暂无
  1339. **全局变量  :     W_InSerial, W_OutSerial
  1340. **返 回 值  :     WORD类型,为未读出的字节数
  1341. **函数版本  :     V1.00.00
  1342. **修改时间  :     2007-01-27
  1343. ******************************************************************************/
  1344. WORD  wGetSerialUnReadBytes(void)
  1345. {
  1346. WORD wTemp,wTemp1,wTemp2;
  1347. //vCloseINTR();//关中断
  1348. wTemp1 = W_InSerial;
  1349. wTemp2 = W_OutSerial;
  1350. //vOpenINTR();
  1351. if(wTemp1 >= wTemp2)wTemp = wTemp1 - wTemp2;
  1352. else                wTemp = wTemp1 + MAX_SERIAL_LEN - wTemp2;
  1353. return (wTemp);
  1354. }
  1355. /******************************************************************************
  1356. **函 数 名  :     vSendSerialByte
  1357. **功能简介  :     从MCU串口1发送一字符
  1358. **参数说明  :     bParaCh-待发送的字节
  1359. **调用函数  :     无
  1360. **被调用函数:     vSendSerialString,vSendSerialChars
  1361. **全局变量  :     无
  1362. **返 回 值  :     无
  1363. **函数版本  :     V1.00.00
  1364. **修改时间  :     2007-01-27
  1365. ******************************************************************************/
  1366. void  vSendSerialByte(BYTE bParaCh)
  1367. {
  1368. /*
  1369. SBUF = bParaCh;
  1370. while(!TI){    }
  1371. TI = 0;
  1372. */
  1373. SendChar2(bParaCh);
  1374. }
  1375. /******************************************************************************
  1376. **函 数 名  :     vSendSerialString
  1377. **功能简介  :     从MCU串口1发送一字符串
  1378. **参数说明  :     *pstrPara-指向待发送的字符串
  1379. **调用函数  :     vSendSerialByte
  1380. **被调用函数:     暂无
  1381. **全局变量  :     无
  1382. **返 回 值  :     无
  1383. **函数版本  :     V1.00.00
  1384. **修改时间  :     2007-01-27
  1385. ******************************************************************************/
  1386. void  vSendSerialString(BYTE   *pstrPara)
  1387. {
  1388.   BYTE *pstrTemp;
  1389. pstrTemp = pstrPara;
  1390. while( (*pstrTemp != 0x00) && (*pstrTemp != 0x0d) )
  1391. {
  1392. vSendSerialByte(*pstrTemp++);
  1393. }
  1394. vSendSerialByte(0x0d);
  1395. }
  1396. //=================================================================================================
  1397. /******************************************************************************
  1398. **函 数 名  :     vSendNULLString
  1399. **功能简介  :     从MCU串口1发送一字符串
  1400. **参数说明  :     *pstrPara-指向待发送的字符串
  1401. **调用函数  :     vSendSerialByte
  1402. **被调用函数:     暂无
  1403. **全局变量  :     无
  1404. **返 回 值  :     无
  1405. **函数版本  :     V1.00.00
  1406. **修改时间  :     2007-01-27
  1407. ******************************************************************************/
  1408. void  vSendNULLString(BYTE   *pstrPara, WORD wStrLen)
  1409. {
  1410.   BYTE *pstrTemp;
  1411.   WORD wI;
  1412.   
  1413. pstrTemp = pstrPara;
  1414. for(wI=0;wI<wStrLen;wI++)
  1415. {
  1416. vSendSerialByte(*pstrTemp++);
  1417. }
  1418. }
  1419. //=================================================================================================
  1420. ///////////////////////////
  1421. //modify
  1422. /******************************************************************************
  1423. **函 数 名  :     vMcuSerialIntr2
  1424. **功能简介  :     MCU串口1中断服务函数
  1425. **参数说明  :     无
  1426. **调用函数  :     无
  1427. **被调用函数:     无
  1428. **全局变量  :     W_InSerial, W_OutSerial
  1429. **返 回 值  :     无
  1430. **函数版本  :     V1.00.00
  1431. **修改时间  :     2007-01-27
  1432. ******************************************************************************/
  1433. /*
  1434. void vMcuSerialIntr2(void) interrupt  SERIAL2_INT_NUM   //9
  1435. {
  1436.   BYTE bTByte2;
  1437.   WORD wTPsn2;
  1438.     
  1439. if( (SCON2 & 0x01) == 0x01)        //接收中断服务函数
  1440.     {
  1441. SCON2 &= 0xfe; //位清零
  1442. bTByte2  =  SBUF2;//最好先读一下
  1443. wTPsn2  =  W_InSerial2;
  1444. if(++wTPsn2 ==  MAX_SERIAL_LEN2) wTPsn2  =  0;//修改指针边界
  1445.         if(wTPsn2  !=  W_OutSerial2)//队列没有满的情况下
  1446.         {
  1447.             B_SerialQueue2[W_InSerial2]  =  bTByte2;
  1448.             W_InSerial2  =  wTPsn2;
  1449.         }    
  1450.     }
  1451. }
  1452. */
  1453. /******************************************************************************
  1454. **函 数 名  :     wReadSerial2
  1455. **功能简介  :     读MCU串口1缓冲中的一个字节
  1456. **参数说明  :     无
  1457. **调用函数  :     vCloseINTR(),vOpenINT()
  1458. **被调用函数:     暂无
  1459. **全局变量  :     W_InSerial2, W_OutSerial2
  1460. **返 回 值  :     WORD类型,为读出一字节内容
  1461. **函数版本  :     V1.00.00
  1462. **修改时间  :     2007-01-27
  1463. ******************************************************************************/
  1464. WORD  wReadSerial2(void)
  1465. {
  1466. BYTE bTByte2;
  1467. //vCloseINTR();//关中断
  1468. if(W_InSerial2  ==  W_OutSerial2)//没有字节内容可读取
  1469. {
  1470. //vOpenINTR();//开中断
  1471. return 0x0100;//返回无意义的值(凡是高子节不为零的数都是无意义的值
  1472. }
  1473. bTByte2  = B_SerialQueue2[W_OutSerial2];
  1474. if(++W_OutSerial2 == MAX_SERIAL_LEN2) W_OutSerial2 = 0; //修改指针边界
  1475. //vOpenINTR();//开中断
  1476. return   ((WORD)bTByte2);    
  1477. }
  1478. /******************************************************************************
  1479. **函 数 名  :     wGetSerialUnReadBytes2
  1480. **功能简介  :     获取MCU串口1缓冲中当前未读的字节数目
  1481. **参数说明  :     无
  1482. **调用函数  :     vCloseINTR(),vOpenINT()
  1483. **被调用函数:     暂无
  1484. **全局变量  :     W_InSerial2, W_OutSerial2
  1485. **返 回 值  :     WORD类型,为未读出的字节数
  1486. **函数版本  :     V1.00.00
  1487. **修改时间  :     2007-01-27
  1488. ******************************************************************************/
  1489. WORD  wGetSerialUnReadBytes2(void)
  1490. {
  1491. WORD wTemp2,wTemp3,wTemp4;
  1492. //vCloseINTR();//关中断
  1493. wTemp3 = W_InSerial2;
  1494. wTemp4 = W_OutSerial2;
  1495. //vOpenINTR();
  1496. if(wTemp3 >= wTemp4)wTemp2 = wTemp3 - wTemp4;
  1497. else                wTemp2 = wTemp3 + MAX_SERIAL_LEN2 - wTemp4;
  1498. return (wTemp2);
  1499. }
  1500. /******************************************************************************
  1501. **函 数 名  :     vSendSerialByte2
  1502. **功能简介  :     从MCU串口2发送一字符
  1503. **参数说明  :     bParaCh-待发送的字节
  1504. **调用函数  :     无
  1505. **被调用函数:     vSendSerialString2,vSendSerialChars2
  1506. **全局变量  :     无
  1507. **返 回 值  :     无
  1508. **函数版本  :     V1.00.00
  1509. **修改时间  :     2007-01-27
  1510. ******************************************************************************/
  1511. void  vSendSerialByte2(BYTE bParaCh2)
  1512. {
  1513. /*
  1514. SBUF2 = bParaCh2;
  1515. while( (SCON2 & 0x02) != 0x02 ){    }
  1516. SCON2 &= 0xfd;//清零
  1517. */
  1518. SendChar1(bParaCh2);
  1519. }
  1520. /******************************************************************************
  1521. **函 数 名  :     vSendSerialString2
  1522. **功能简介  :     从MCU串口2发送一字符串
  1523. **参数说明  :     *pstrPara2-指向待发送的字符串
  1524. **调用函数  :     vSendSerialByte2
  1525. **被调用函数:     暂无
  1526. **全局变量  :     无
  1527. **返 回 值  :     无
  1528. **函数版本  :     V1.00.00
  1529. **修改时间  :     2007-01-27
  1530. ******************************************************************************/
  1531. void  vSendSerialString2(BYTE  *pstrPara2)
  1532. {
  1533.   BYTE *pstrTemp2;
  1534. pstrTemp2 = pstrPara2;
  1535. while( (*pstrTemp2 != 0x00) && (*pstrTemp2 != 0x0d) )
  1536. {
  1537. vSendSerialByte2(*pstrTemp2++);
  1538. }
  1539. vSendSerialByte2(0x0d);
  1540. vSendSerialByte2(0x0a);
  1541. }
  1542. //=================================================================================================
  1543. /******************************************************************************
  1544. **函 数 名  :     vSendNULLString2
  1545. **功能简介  :     从MCU串口2发送一字符串
  1546. **参数说明  :     *pstrPara2-指向待发送的字符串
  1547. **调用函数  :     vSendSerialByte2
  1548. **被调用函数:     暂无
  1549. **全局变量  :     无
  1550. **返 回 值  :     无
  1551. **函数版本  :     V1.00.00
  1552. **修改时间  :     2007-01-27
  1553. ******************************************************************************/
  1554. void  vSendNULLString2(BYTE  *pstrPara2, WORD wStrLen2)
  1555. {
  1556.   BYTE *pstrTemp2;
  1557.   WORD wI2;
  1558.   
  1559. pstrTemp2 = pstrPara2;
  1560. for(wI2=0;wI2<wStrLen2;wI2++)
  1561. {
  1562. if((wI2%50)==0)IWDG_ReloadCounter();//喂狗
  1563. vSendSerialByte2(*pstrTemp2++);
  1564. }
  1565. }
  1566. //=================================================================================================
  1567. /*
  1568. void vIinitGps(void)//初始化GPS
  1569. {
  1570.   WORD wI;
  1571. for(wI = 0;wI < 32; wI++)
  1572. vSendSerialByte2(bGPSIinitTable[wI]);
  1573. }
  1574. */
  1575. void vIinitGps(void)//初始化GPS
  1576. {
  1577.   BYTE bI;
  1578.   
  1579.    for(bI = 0; bI < 6; bI++)
  1580.    {
  1581.        IWDG_ReloadCounter();//喂狗
  1582. vSendSerialString2(bGpsSet[bI]);
  1583. }
  1584. W_InSerial2  = 0;
  1585. W_OutSerial2 = 0;
  1586. }
  1587. /******************************************************************************
  1588. **函 数 名  :     wReadTcpSerial
  1589. **功能简介  :     读MCU串口1缓冲中的一个字节
  1590. **参数说明  :     无
  1591. **调用函数  :     vCloseINTR(),vOpenINT()
  1592. **被调用函数:     暂无
  1593. **全局变量  :     W_InSerial, W_OutSerial
  1594. **返 回 值  :     WORD类型,为读出一字节内容
  1595. **函数版本  :     V1.00.00
  1596. **修改时间  :     2007-01-27
  1597. ******************************************************************************/
  1598. WORD  wReadTcpSerial(void)
  1599. {
  1600. BYTE bTByte;
  1601. if(W_TcpInSerial  ==  W_TcpOutSerial)//没有字节内容可读取
  1602. {
  1603. return 0x0100;//返回无意义的值(凡是高子节不为零的数都是无意义的值
  1604. }
  1605. bTByte  = B_TcpSerialQueue[W_TcpOutSerial];
  1606. if(++W_TcpOutSerial == MAX_TCP_SERIAL_LEN) W_TcpOutSerial = 0; //修改指针边界
  1607. return   ((WORD)bTByte);    
  1608. }
  1609. /******************************************************************************
  1610. **函 数 名  :     wGetTcpSerialUnReadBytes
  1611. **功能简介  :     获取MCU串口1缓冲中当前未读的字节数目
  1612. **参数说明  :     无
  1613. **调用函数  :     vCloseINTR(),vOpenINT()
  1614. **被调用函数:     暂无
  1615. **全局变量  :     W_InSerial, W_OutSerial
  1616. **返 回 值  :     WORD类型,为未读出的字节数
  1617. **函数版本  :     V1.00.00
  1618. **修改时间  :     2007-01-27
  1619. ******************************************************************************/
  1620. WORD  wGetTcpSerialUnReadBytes(void)
  1621. {
  1622. WORD wTemp,wTemp1,wTemp2;
  1623. wTemp1 = W_TcpInSerial;
  1624. wTemp2 = W_TcpOutSerial;
  1625. if(wTemp1 >= wTemp2)wTemp = wTemp1 - wTemp2;
  1626. else                wTemp = wTemp1 + MAX_TCP_SERIAL_LEN - wTemp2;
  1627. return (wTemp);
  1628. }
  1629. //=================================================================================================
  1630. /******************************************************************************
  1631. **函 数 名  :     vInitEepromPara
  1632. **功能简介  :     写密码为默认值
  1633. **参数说明  :     无
  1634. **调用函数  :     bISP_IAP_ByteRead,vISP_IAP_ByteProgram
  1635. **被调用函数:     暂无
  1636. **全局变量  :     无
  1637. **返 回 值  :     无
  1638. **函数版本  :     V1.00.00
  1639. **修改时间  :     2007-02-05
  1640. ******************************************************************************/
  1641. void vInitEepromPara(void)
  1642. {
  1643.   BYTE bI,bJ;
  1644.     
  1645.    if((bISP_IAP_ByteRead(CHECK_WORD_STAR_ADDR))!=CHECK_WORD1||(bISP_IAP_ByteRead(CHECK_WORD_STAR_ADDR + 1))!=CHECK_WORD2)
  1646.    {
  1647. vISP_IAP_ByteProgram(CHECK_WORD1, CHECK_WORD_STAR_ADDR);
  1648. vISP_IAP_ByteProgram(CHECK_WORD2, CHECK_WORD_STAR_ADDR + 1);
  1649. for(bI = 0; bI < MAX_PHONE_NUM; bI++)//使用默认密码
  1650. {
  1651. vISP_IAP_ByteProgram(B_DefaultPassWord[bI], PASSWORD_STAR_ADDR + bI);
  1652. if(B_DefaultPassWord[bI] == 0x0)break;
  1653. }
  1654. for(bI = 0; bI < MAX_PHONE_NUM; bI++)//使用默认服务器IP地址
  1655. {
  1656. vISP_IAP_ByteProgram(B_DefaultIP[bI], SEVER_IP_STAR_ADDR + bI);
  1657. if(B_DefaultIP[bI] == 0x0)break;
  1658. }
  1659. for(bI = 0; bI < MAX_PHONE_NUM; bI++)//使用默认监控电话号码作为设备号
  1660. {
  1661. vISP_IAP_ByteProgram(B_DefaultMont[bI], DEVICE_PHONE_STAR_ADDR + bI);
  1662. if(B_DefaultMont[bI] == 0x0)break;
  1663. }
  1664. for(bI = 0; bI < MAX_PHONE_NUM; bI++)//使用默认监控电话号码
  1665. {
  1666. vISP_IAP_ByteProgram(B_DefaultMont[bI], MONT_PHONE_STAR_ADDR + bI);
  1667. if(B_DefaultMont[bI] == 0x0)
  1668. {
  1669. vISP_IAP_ByteProgram('#', MONT_PHONE_STAR_ADDR + bI + 1);
  1670. break;
  1671. }
  1672. }
  1673. for(bI = 0; bI < MAX_PHONE_NUM; bI++)//使用默认中心MODEM号码
  1674. {
  1675. vISP_IAP_ByteProgram(B_DefaultModem[bI], CENTER_MODEM_STAR_ADDR + bI);
  1676. if(B_DefaultModem[bI] == 0x0)break;
  1677. }
  1678. W_InternalLctTimer = 0;
  1679. vISP_IAP_ByteProgram( (BYTE)(W_InternalLctTimer >> 8),LCT_TIME_INTV_ADDR);
  1680. vISP_IAP_ByteProgram( (BYTE) W_InternalLctTimer,      LCT_TIME_INTV_ADDR + 1);
  1681. W_OverSpeedValue = 110;
  1682. vISP_IAP_ByteProgram( (BYTE)(W_OverSpeedValue >> 8),OVER_SPEED_INTV_ADDR);
  1683. vISP_IAP_ByteProgram( (BYTE) W_OverSpeedValue,      OVER_SPEED_INTV_ADDR + 1);
  1684. vISP_IAP_ByteProgram('0',  PHONE_LOCATION_MODE);//电话定位模式默认为'0'
  1685.    }
  1686.   
  1687.    for(bI=0;bI<MAX_PHONE_NUM-1;bI++)//读取中心MODEM号码
  1688. {
  1689. B_UserNum[bI] = bISP_IAP_ByteRead(CENTER_MODEM_STAR_ADDR + bI);
  1690. if(B_UserNum[bI] == 0x0)break;
  1691. }
  1692. B_UserNum[bI] = 0x0;
  1693. bI = bISP_IAP_ByteRead(LCT_TIME_INTV_ADDR);
  1694. bJ = bISP_IAP_ByteRead(LCT_TIME_INTV_ADDR + 1);
  1695. W_InternalLctTimer = bI * 256 + bJ;
  1696. bI = bISP_IAP_ByteRead(OVER_SPEED_INTV_ADDR);
  1697. bJ = bISP_IAP_ByteRead(OVER_SPEED_INTV_ADDR + 1);
  1698. W_OverSpeedValue = bI * 256 + bJ;
  1699. strcpy(B_ScaPhone,"8613800755500");
  1700. }
  1701. //=================================================================================================
  1702. //=================================================================================================
  1703. /******************************************************************************
  1704. **函 数 名  :     bSchearAtCommand
  1705. **功能简介  :     查找处于要发送并且优先级最高的AT命令
  1706. **参数说明  :     无
  1707. **调用函数  :     无
  1708. **被调用函数:     vProduceAtCommand
  1709. **全局变量  :     DW_SetAtCmdFlag
  1710. **返 回 值  :     无
  1711. **函数版本  :     V1.00.00
  1712. **修改时间  :     2007-01-29
  1713. ******************************************************************************/
  1714. BYTE bSchearAtCommand(void)
  1715. {    
  1716.   BYTE bI;
  1717.   DWORDS dwTemp;
  1718.   
  1719.     dwTemp = DW_SetAtCmdFlag;
  1720. for(bI=0; bI<32; bI++)
  1721. {
  1722. if( (dwTemp&0x00000001) == 1 )break;
  1723.      dwTemp >>= 1;
  1724.     }
  1725.     return (bI);
  1726. }    
  1727. /******************************************************************************
  1728. **函 数 名  :     vStopAtCommand
  1729. **功能简介  :     不再发送该AT命令
  1730. **参数说明  :     bCommandItem-要发送的AT命令在REC_AtCommands中的索引
  1731. **调用函数  :     无
  1732. **被调用函数:     vAtCmdOverTime
  1733. **全局变量  :     DW_SetAtCmdFlag,DW_MapTbl
  1734. **返 回 值  :     无
  1735. **函数版本  :     V1.00.00
  1736. **修改时间  :     2007-01-29
  1737. ******************************************************************************/
  1738. void vStopAtCommand(BYTE bCommandItem)
  1739. {    
  1740.     if(bCommandItem < 32)DW_SetAtCmdFlag &= ~DW_MapTbl[bCommandItem];
  1741. }    
  1742. /******************************************************************************
  1743. **函 数 名  :     vStartAtCommand
  1744. **功能简介  :     使该AT命令可以发送
  1745. **参数说明  :     bCommandItem-要发送的AT命令在REC_AtCommands中的索引
  1746. **调用函数  :     无
  1747. **被调用函数:     暂无
  1748. **全局变量  :     DW_SetAtCmdFlag,DW_MapTbl
  1749. **返 回 值  :     无
  1750. **函数版本  :     V1.00.00
  1751. **修改时间  :     2007-01-29
  1752. ******************************************************************************/
  1753. void vStartAtCommand(BYTE bCommandItem)
  1754. {    
  1755. if(bCommandItem < 32)DW_SetAtCmdFlag |= DW_MapTbl[bCommandItem];
  1756. }    
  1757. /******************************************************************************
  1758. **函 数 名  :     vSmsPutInBuf
  1759. **功能简介  :     短消息进发送缓冲
  1760. **参数说明  :     bSmsLen-消息长度,bSmsBuf[]消息内容
  1761. **调用函数  :     无
  1762. **被调用函数:     
  1763. **全局变量  :     B_SmsSendLen,B_SmsSendItem
  1764. **返 回 值  :     无
  1765. **函数版本  :     V1.00.00
  1766. **修改时间  :     2007-02-05
  1767. ******************************************************************************/
  1768. void vSmsPutInBuf(BYTE bSmsLen,BYTE   bSmsBuf[])
  1769. {
  1770.   BYTE bI;
  1771. B_SmsSendLen = bSmsLen;
  1772.     for(bI = 0; bI < bSmsLen; bI++)
  1773.      B_SmsSendItem[bI] = bSmsBuf[bI];
  1774. }
  1775. /******************************************************************************
  1776. **函 数 名  :     vReportLctInfo-二进制编码
  1777. **功能简介  :     返回位置信息
  1778. **参数说明  :     无
  1779. **调用函数  :     
  1780. **被调用函数:     
  1781. **全局变量  :     
  1782. **返 回 值  :     无
  1783. **函数版本  :     V2.00.00
  1784. **修改时间  :     2008-07-27
  1785. ******************************************************************************/
  1786. void vReportLctInfo(void)
  1787. {
  1788.   BYTE bI,bJ,bTemp,bStr[15]="#[GPLUS GB012]";
  1789.   DWORDS dwLctInfo;
  1790.   
  1791. bJ = 0;
  1792. //-------------------起始---------------------------------
  1793. for(bI=0;bI<14;bI++)
  1794. {
  1795. B_SmsSendItem[bJ++] = 0x0;
  1796. B_SmsSendItem[bJ++] = bStr[bI];
  1797. }
  1798. //------------------经度值计算----------------------------
  1799. B_SmsSendItem[bJ++] = 0x0;
  1800. B_SmsSendItem[bJ++] = '[';
  1801. B_SmsSendItem[bJ++] = 0x0;
  1802. B_SmsSendItem[bJ++] = REC_GPSLCTINFO.bLongitude[0];
  1803. B_SmsSendItem[bJ++] = 0x0;
  1804. B_SmsSendItem[bJ++] = REC_GPSLCTINFO.bLongitude[1];
  1805. B_SmsSendItem[bJ++] = 0x0;
  1806. B_SmsSendItem[bJ++] = REC_GPSLCTINFO.bLongitude[2];
  1807. B_SmsSendItem[bJ++] = 0x0;
  1808. B_SmsSendItem[bJ++] = '.';
  1809. dwLctInfo = 0;
  1810. for(bI=0;bI<7;bI++)
  1811. {
  1812. bTemp = REC_GPSLCTINFO.bLongitude[3 + bI];
  1813. if(bTemp == '.')continue;
  1814. if(bTemp == 0x0)bTemp = 0x30;
  1815. dwLctInfo = dwLctInfo * 10 + bTemp - 0x30;
  1816. dwLctInfo = dwLctInfo/60;
  1817. B_SmsSendItem[bJ++] = 0x0;
  1818. B_SmsSendItem[bJ++] = dwLctInfo/1000 + 0x30;
  1819. B_SmsSendItem[bJ++] = 0x0;
  1820. B_SmsSendItem[bJ++] = (dwLctInfo%1000)/100 + 0x30;
  1821. B_SmsSendItem[bJ++] = 0x0;
  1822. B_SmsSendItem[bJ++] = ((dwLctInfo%1000)%100)/10 + 0x30;
  1823. B_SmsSendItem[bJ++] = 0x0;
  1824. B_SmsSendItem[bJ++] = dwLctInfo%10 + 0x30;
  1825. B_SmsSendItem[bJ++] = 0x0;
  1826. B_SmsSendItem[bJ++] = ']';
  1827. //------------------经度值计算----------------------------
  1828. //------------------纬度值计算----------------------------
  1829. B_SmsSendItem[bJ++] = 0x0;
  1830. B_SmsSendItem[bJ++] = '[';
  1831. B_SmsSendItem[bJ++] = 0x0;
  1832. B_SmsSendItem[bJ++] = REC_GPSLCTINFO.bLatitude[0];
  1833. B_SmsSendItem[bJ++] = 0x0;
  1834. B_SmsSendItem[bJ++] = REC_GPSLCTINFO.bLatitude[1];
  1835. B_SmsSendItem[bJ++] = 0x0;
  1836. B_SmsSendItem[bJ++] = '.';
  1837. dwLctInfo = 0;
  1838. for(bI=0;bI<7;bI++)
  1839. {
  1840. bTemp = REC_GPSLCTINFO.bLatitude[2 + bI];
  1841. if(bTemp == '.')continue;
  1842. if(bTemp == 0x0)bTemp = 0x30;
  1843. dwLctInfo = dwLctInfo * 10 + bTemp - 0x30;
  1844. dwLctInfo = dwLctInfo/60;
  1845. B_SmsSendItem[bJ++] = 0x0;
  1846. B_SmsSendItem[bJ++] = dwLctInfo/1000 + 0x30;
  1847. B_SmsSendItem[bJ++] = 0x0;
  1848. B_SmsSendItem[bJ++] = (dwLctInfo%1000)/100 + 0x30;
  1849. B_SmsSendItem[bJ++] = 0x0;
  1850. B_SmsSendItem[bJ++] = ((dwLctInfo%1000)%100)/10 + 0x30;
  1851. B_SmsSendItem[bJ++] = 0x0;
  1852. B_SmsSendItem[bJ++] = dwLctInfo%10 + 0x30;
  1853. B_SmsSendItem[bJ++] = 0x0;
  1854. B_SmsSendItem[bJ++] = ']';
  1855. //------------------纬度值计算----------------------------
  1856. //------------------速度值计算----------------------------
  1857. B_SmsSendItem[bJ++] = 0x0;
  1858. B_SmsSendItem[bJ++] = '[';
  1859. dwLctInfo = (DWORDS)( 100 * (atof(REC_GPSLCTINFO.bSpeed)) );
  1860. dwLctInfo = (185 * dwLctInfo)/100;
  1861. B_SmsSendItem[bJ++] = 0x0;
  1862. B_SmsSendItem[bJ++] = dwLctInfo/1000 + 0x30;
  1863. B_SmsSendItem[bJ++] = 0x0;
  1864. B_SmsSendItem[bJ++] = (dwLctInfo%1000)/100 + 0x30;
  1865. B_SmsSendItem[bJ++] = 0x0;
  1866. B_SmsSendItem[bJ++] = '.';
  1867. B_SmsSendItem[bJ++] = 0x0;
  1868. B_SmsSendItem[bJ++] = ((dwLctInfo%1000)%100)/10 + 0x30;
  1869. B_SmsSendItem[bJ++] = 0x0;
  1870. B_SmsSendItem[bJ++] = dwLctInfo%10 + 0x30;
  1871. B_SmsSendItem[bJ++] = 0x0;
  1872. B_SmsSendItem[bJ++] = ']';
  1873. //------------------速度值计算----------------------------
  1874. //-------------------结束---------------------------------
  1875. for(bI=0;bI<14;bI++)
  1876. {
  1877. B_SmsSendItem[bJ++] = 0x0;
  1878. B_SmsSendItem[bJ++] = bStr[bI];
  1879. }
  1880. B_SmsSendLen = bJ;
  1881. }
  1882. /********************************************************************************************
  1883. **函数名:      vDisConnectTcp
  1884. **功能简介:    关闭IP连接
  1885. **参数说明:    无
  1886. **调用函数:    无
  1887. **全局变量:    无
  1888. **函数返回:    无
  1889. **最后修改时间:2007-02-09
  1890. **********************************************************************************************/
  1891. void vDisConnectTcp(void)
  1892. {
  1893.   BYTE bI,bK,bLen,bLonLat[24];
  1894.   
  1895. B_NetStatus = 0;
  1896. vStartAtCommand(MAC_CIPSHUT_ITEM);//关断IP连接
  1897. vStopAtCommand(MAC_CIPSEND_ITEM);//停止该命令再次发送
  1898. if(++B_SwapDataCount == 3)
  1899. {
  1900. B_SwapDataCount = 0;
  1901. vSmsPutInBuf(94,B_TcpFailRet);
  1902. strcpy(bLonLat,REC_GPSLCTINFO.bLongitude);
  1903. strcat(bLonLat,",");
  1904. strcat(bLonLat,REC_GPSLCTINFO.bLatitude);
  1905. bLen = strlen(bLonLat);
  1906. B_SmsSendLen = 2*bLen + 94;
  1907. bK = 94;
  1908. for(bI=0;bI<bLen;bI++)
  1909. {
  1910. B_SmsSendItem[bK++] = 0x00;
  1911. B_SmsSendItem[bK++] = bLonLat[bI];
  1912. if(bLonLat[bI] == 0x0)break;
  1913. if(bK == MAX_SEND_SMS_LEN)break;
  1914. }
  1915. }
  1916. else
  1917. vSwapGpsStart(B_UserNum,0);//放入需要交换的数据到vSmsPutInBuf
  1918. }
  1919. /******************************************************************************
  1920. **函 数 名  :     vAtCmdOverTime
  1921. **功能简介  :     AT命令超时处理
  1922. **参数说明  :     无
  1923. **调用函数  :     vStopAtCommand
  1924. **被调用函数:     vStartSoftTimer_A
  1925. **全局变量  :     REC_AtCommands[32],EN_CommandStatus,B_AtCommandItem
  1926. **返 回 值  :     无
  1927. **函数版本  :     V1.00.00
  1928. **修改时间  :     2007-01-29
  1929. ******************************************************************************/
  1930. void  vAtCmdOverTime(void)
  1931. {
  1932. EN_CommandStatus = NO_COMMAND_WAIT;
  1933. if(B_AtCommandItem == MAC_CIPSEND_ITEM)
  1934. {
  1935. vStopAtCommand(B_AtCommandItem);//禁止该AT命令发送,等待下一次该命令被激活
  1936. vSendSerialByte2(B_AtCommandItem/10 + 0x30);
  1937. vSendSerialByte2(B_AtCommandItem%10 + 0x30);
  1938. B_SmsSendLen = 0;//没有消息可发送
  1939. B_NetStatus = 0;//强制断开网络
  1940. vStartAtCommand(MAC_CIPSHUT_ITEM);//关断IP连接
  1941. B_AtCmdTimes = 0;
  1942. }
  1943. if(++B_AtCmdTimes >= MAX_AT_CMD_ERRORS)//无回应时,最多发送MAX_AT_CMD_ERRORS次
  1944. {
  1945. B_AtCmdTimes = 0;
  1946. vStopAtCommand(B_AtCommandItem);//禁止该AT命令发送,等待下一次该命令被激活
  1947. if(B_AtCommandItem == MAC_CMGS_ITEM || B_AtCommandItem == MAC_CIPSEND_ITEM || B_AtCommandItem == MAC_CIPSTART_ITEM)
  1948. {
  1949. B_SmsSendLen = 0;//没有消息可发送
  1950. vStartAtCommand(MAC_CIPSHUT_ITEM);//关断IP连接
  1951. }
  1952. else
  1953. {
  1954. // vSendSerialByte2(B_AtCommandItem/10 + 0x30);
  1955. // vSendSerialByte2(B_AtCommandItem%10 + 0x30);
  1956. if(!B_OnOff_FLAG)
  1957. {
  1958. vTurnOnGsm();//开GSM508时序
  1959. // vSendSerialByte2('O');
  1960. // vSendSerialByte2('N');
  1961. }
  1962. else             
  1963. {
  1964. vTurnOffGsm();//关GSM508时序
  1965. B_OnOff_FLAG = 0;
  1966. // vSendSerialByte2('O');
  1967. // vSendSerialByte2('F');
  1968. }
  1969. DW_SetAtCmdFlag = MAC_SET_AT_CMD;
  1970. }
  1971. // for(;;);//使看门狗溢出
  1972. }
  1973. B_AtCommandItem = 0xff;//最后赋值成无意义值
  1974. }
  1975. /******************************************************************************
  1976. **函 数 名  :     vProduceAtCommand
  1977. **功能简介  :     产生一条AT命令并发送
  1978. **参数说明  :     无
  1979. **调用函数  :     vStartSoftTimer_A