找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1010|回复: 0
打印 上一主题 下一主题
收起左侧

115200波特率GPS解析发送 单片机源程序

[复制链接]
跳转到指定楼层
楼主
ID:273434 发表于 2019-11-25 17:08 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
这个程序是以115200的波特率解析GPS
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "delay.h"
  5. #include "uart.h"


  6. #define Buf1_Max 68                                           //串口1缓存长度
  7. #define Buf2_Max 200                                           //串口2缓存长度
  8. /*************        本地常量声明        **************/

  9. const u8 *string = "AT+CIPSTART=\"UDP\",\"120.79.47.48\",8088";        //IP登录服务器
  10. sbit RUNING_LED = P2^1;                                        //运行指示灯
  11. sbit LED                          = P3^3;                                        //控制指示灯



  12. /*************  本地变量声明        **************/
  13. xdata u8 Uart1_Buf[Buf1_Max];
  14. xdata u8 Uart2_Buf[Buf2_Max];
  15. xdata u8 GPGGA_Buffer[68];
  16. u8 latitude[13],longitude[14],N_S,E_W;

  17. u8 RX_Count = 0;

  18. u8 Times=0,First_Int = 0,shijian=0;
  19. u16 Heartbeat=0;
  20. bit Flag_GPS_OK = 0;
  21. bit Flag_Calc_GPGGA_OK = 0;

  22. //u8 Time_count=0;
  23. bdata u8 Flag;//定时器标志位
  24. sbit Timer0_start =Flag^0;        //定时器0延时启动计数器
  25. sbit Heart_beat                =Flag^1;        //发送心跳帧标志位

  26. /*************        本地函数声明        **************/
  27. void GPIO_config(void);
  28. void Timer0Init(void);
  29. void CLR_Buf2(void);
  30. u8 Find(u8 *a);
  31. void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);
  32. void Set_ATE0(void);
  33. void Connect_Server(void);
  34. //void Rec_Server_Data(void);
  35. void Wait_CREG(void);
  36. //void Send_OK(void);
  37. void READ_GPS(void);

  38. /*************  外部函数和变量声明*****************/




  39. /*******************************************************************************
  40. * 函数名 : main
  41. * 描述   : 主函数
  42. * 输入   :
  43. * 输出   :
  44. * 返回   :
  45. * 注意   : 串口2负责与GPRS模块通信,串口1用于串口调试,可以避免在下载程序时数据
  46.                                          还发送到模块
  47. *******************************************************************************/
  48. void main(void)
  49. {
  50.         GPIO_config();
  51.         Uart1Init();
  52.         Uart2Init();
  53.         Timer0Init();
  54.         EA=1;        //开总中断
  55.         //UART1_SendString("GPRS模块GPRS测试程序\r\n");
  56.         //UART1_SendString("GPRS模块在注册网络\r\n");
  57.         Wait_CREG();
  58.         //UART1_SendString("GPRS模块注册成功\r\n");
  59.         //UART1_SendString("GPRS模块开始连接服务器\r\n");
  60.         Set_ATE0();
  61.         Connect_Server();
  62.         //UART1_SendString("连接成功\r\n");
  63.         while(1)
  64.         {
  65.                 Second_AT_Command("AT+CIPSEND",">",2);
  66.                 UART2_SendString("No:Dog001");
  67.                 UART2_SendData(0x1A);
  68.                 CLR_Buf2();
  69.                 READ_GPS();
  70.                 Second_AT_Command("AT+CIPSEND",">",2);
  71.                 UART2_SendString(latitude);
  72.                 UART2_SendData(0x1A);
  73.                 CLR_Buf2();
  74.                 Second_AT_Command("AT+CIPSEND",">",2);
  75.                 UART2_SendData(N_S);
  76.                 UART2_SendData(0x1A);
  77.                 CLR_Buf2();
  78.                 Second_AT_Command("AT+CIPSEND",">",2);
  79.                 UART2_SendString(longitude);
  80.                 UART2_SendData(0x1A);
  81.                 CLR_Buf2();
  82.                 Second_AT_Command("AT+CIPSEND",">",2);
  83.                 UART2_SendData(E_W);
  84.                 UART2_SendData(0x1A);
  85.                 CLR_Buf2();
  86.         }
  87. }

  88. void READ_GPS(void)
  89. {
  90.         u8 i = 0;
  91.         if(Flag_GPS_OK == 1 && Uart1_Buf[4] == 'G' && Uart1_Buf[6] == ',' && Uart1_Buf[13] == '.')                        //确定是否收到"GPGGA"这一帧数据
  92.                 {
  93.                         for( i = 0; i < 68 ; i++)
  94.                         {
  95.                                 GPGGA_Buffer[i] = Uart1_Buf[i];        
  96.                         }
  97.                         Flag_Calc_GPGGA_OK = 1;
  98.                 }
  99.         if(Flag_Calc_GPGGA_OK == 1)
  100.         {
  101.                 strncpy(latitude,GPGGA_Buffer+17,13);
  102.                 N_S=GPGGA_Buffer[28];
  103.                 strncpy(longitude,GPGGA_Buffer+30,14);
  104.                 E_W=GPGGA_Buffer[42];        
  105.         }
  106.         
  107. }

  108. /*******************************************************************************
  109. * 函数名 : Uart1
  110. * 描述   : 串口1中断服务入口函数
  111. * 输入   :
  112. * 输出   :
  113. * 返回   :
  114. * 注意   :
  115. *******************************************************************************/
  116. void Uart1() interrupt 4 using 3
  117. {
  118.         u8 temp = 0;
  119.         ES=0;
  120.         temp = SBUF;
  121.     RI = 0;                 //清除RI位
  122.         Uart1_Buf[RX_Count++] = temp;
  123.         if(RX_Count >= 59)
  124.         {
  125.                 RX_Count = 59;
  126.                 Flag_GPS_OK = 1;               
  127.         }

  128.         ES=1;
  129. }

  130. /*******************************************************************************
  131. * 函数名 : Uart2
  132. * 描述   : 串口2中断服务入口函数
  133. * 输入   :
  134. * 输出   :
  135. * 返回   :
  136. * 注意   :
  137. *******************************************************************************/
  138. void Uart2() interrupt 8
  139. {
  140.                 IE2  &= ~0x01;   //关闭串口2中断
  141.     if (S2CON & S2RI)
  142.     {
  143.       S2CON &= ~S2RI;         //清除S2RI位
  144.                         Uart2_Buf[First_Int] = S2BUF;            //将接收到的字符串存到缓存中
  145.                         First_Int++;                                        //缓存指针向后移动
  146.                         if(First_Int > Buf2_Max)                       //如果缓存满,将缓存指针指向缓存的首地址
  147.                         {
  148.                                 First_Int = 0;
  149.                         }
  150.     }
  151.     if (S2CON & S2TI)
  152.     {
  153.       S2CON &= ~S2TI;         //清除S2TI位
  154.     }
  155.                 IE2  |= 0x01;   //使能串口2中断
  156. }
  157. /*******************************************************************************
  158. * 函数名 : Timer0_ISR
  159. * 描述   : 定时器0中断服务入口函数,20ms中断一次
  160. * 输入   :
  161. * 输出   :
  162. * 返回   :
  163. * 注意   :
  164. *******************************************************************************/
  165. void Timer0_ISR() interrupt 1
  166. {
  167.         static u8 Time_count=0;
  168.         TR0=0;//关定时器
  169.         Time_count++;
  170.         if(Time_count>=50)//1秒运行指示灯闪烁
  171.         {
  172.                 Time_count = 0;
  173.                 RUNING_LED =~RUNING_LED;
  174.         }
  175.         Heartbeat++;
  176.         if(Heartbeat>500)//每10秒发送心跳帧
  177.         {
  178.                 Heartbeat=0;
  179.                 Heart_beat=1;
  180.         }
  181.         if(Timer0_start)
  182.         Times++;
  183.         if(Times > (50*shijian))
  184.         {
  185.                 Timer0_start = 0;
  186.                 Times = 0;
  187.         }
  188.         TR0=1;//开定时器
  189. }
  190. /*******************************************************************************
  191. * 函数名 : GPIO_config
  192. * 描述   : IO口配置函数
  193. * 输入   :
  194. * 输出   :
  195. * 返回   :
  196. * 注意   :
  197. *******************************************************************************/
  198. void        GPIO_config(void)
  199. {
  200.                 P3M1 &= 0XC3;  //配置P32~P35为推挽输出
  201.                 P3M0 |=        ~0XC3;
  202.                 LED=0;
  203.                 RUNING_LED=0;
  204. }
  205. /*******************************************************************************
  206. * 函数名 : Timer0Init
  207. * 描述   : 定时器0初始化函数
  208. * 输入   :
  209. * 输出   :
  210. * 返回   :
  211. * 注意   :
  212. *******************************************************************************/
  213. void Timer0Init(void)                //20毫秒@22.1184MHz
  214. {
  215.         AUXR &= 0x7F;        //12T模式
  216.         TMOD &= 0xF0;        //设置定时器模式 16位重载
  217.         TL0 = 0x00;                //设定定时器初值
  218.         TH0 = 0x70;                //设定定时器初值
  219.         TF0 = 0;                        //清除TF0标志
  220.         TR0 = 1;                        //定时器0开始计时
  221.         ET0 = 1;            //使能定时器0中断
  222. }

  223. /*******************************************************************************
  224. * 函数名 : CLR_Buf2
  225. * 描述   : 清除串口2缓存数据
  226. * 输入   :
  227. * 输出   :
  228. * 返回   :
  229. * 注意   :
  230. *******************************************************************************/
  231. void CLR_Buf2(void)
  232. {
  233.         u16 k;
  234.         for(k=0;k<Buf2_Max;k++)      //将缓存内容清零
  235.         {
  236.                 Uart2_Buf[k] = 0x00;
  237.         }
  238.     First_Int = 0;             //接收字符串的起始存储位置
  239. }

  240. /*******************************************************************************
  241. * 函数名 : Wait_CREG
  242. * 描述   : 等待模块注册成功
  243. * 输入   :
  244. * 输出   :
  245. * 返回   :
  246. * 注意   :
  247. *******************************************************************************/
  248. void Wait_CREG(void)
  249. {
  250.         u8 i;
  251.         u8 k;
  252.         i = 0;
  253.         CLR_Buf2();
  254.   while(i == 0)                                
  255.         {
  256.                 CLR_Buf2();        
  257.                 UART2_SendString("AT+CREG?");
  258.                 UART2_SendLR();
  259.                 delay_ms(5000);                                                  
  260.             for(k=0;k<Buf2_Max;k++)                              
  261.             {
  262.                         if(Uart2_Buf[k] == ':')
  263.                         {
  264.                                 if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5'))
  265.                                 {
  266.                                         i = 1;
  267.                                   break;
  268.                                 }
  269.                         }
  270.                 }
  271.                 //UART1_SendString("注册中.....");
  272.         }
  273. }

  274. /*******************************************************************************
  275. * 函数名 : Find
  276. * 描述   : 判断缓存中是否含有指定的字符串
  277. * 输入   :
  278. * 输出   :
  279. * 返回   : unsigned char:1 找到指定字符,0 未找到指定字符
  280. * 注意   :
  281. *******************************************************************************/

  282. u8 Find(u8 *a)
  283. {
  284.   if(strstr(Uart2_Buf,a)!=NULL)
  285.             return 1;
  286.         else
  287.                         return 0;
  288. }

  289. /*******************************************************************************
  290. * 函数名 : Second_AT_Command
  291. * 描述   : 发送AT指令函数
  292. * 输入   : 发送数据的指针、发送等待时间(单位:S)
  293. * 输出   :
  294. * 返回   :
  295. * 注意   :
  296. *******************************************************************************/

  297. void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)         
  298. {
  299.         u8 i;
  300.         u8 *c;
  301.         c = b;                                                                                //保存字符串地址到c
  302.         CLR_Buf2();
  303.   i = 0;
  304.         while(i == 0)                    
  305.         {
  306.                 if(!Find(a))
  307.                 {
  308.                         if(Timer0_start == 0)
  309.                         {
  310.                                 b = c;                                                        //将字符串地址给b
  311.                                 for (b; *b!='\0';b++)
  312.                                 {
  313.                                         UART2_SendData(*b);
  314.                                 }
  315.                                 UART2_SendLR();        
  316.                                 Times = 0;
  317.                                 shijian = wait_time;
  318.                                 Timer0_start = 1;
  319.                    }
  320.     }
  321.            else
  322.                 {
  323.                         i = 1;
  324.                         Timer0_start = 0;
  325.                 }
  326.         }
  327.         CLR_Buf2();
  328. }

  329. /*******************************************************************************
  330. * 函数名 : Set_ATE0
  331. * 描述   : 取消回显
  332. * 输入   :
  333. * 输出   :
  334. * 返回   :
  335. * 注意   :
  336. *******************************************************************************/
  337. void Set_ATE0(void)
  338. {
  339.         Second_AT_Command("ATE0","OK",3);                                                                //取消回显               
  340. }
  341. /*******************************************************************************
  342. * 函数名 : Connect_Server
  343. * 描述   : GPRS连接服务器函数
  344. * 输入   :
  345. * 输出   :
  346. * 返回   :
  347. * 注意   :
  348. *******************************************************************************/
  349. void Connect_Server(void)
  350. {
  351.         UART2_SendString("AT+CIPCLOSE=1");        //关闭连接
  352.         Second_AT_Command("AT+CIPSHUT","SHUT OK",2);                //关闭移动场景
  353.         Second_AT_Command("AT+CGCLASS=\"B\"","OK",2);//设置GPRS移动台类别为B,支持包交换和数据交换
  354.         Second_AT_Command("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",2);//设置PDP上下文,互联网接协议,接入点等信息
  355.         Second_AT_Command("AT+CGATT=1","OK",2);//附着GPRS业务
  356.         Second_AT_Command("AT+CIPCSGP=1,\"CMNET\"","OK",2);//设置为GPRS连接模式
  357.         Second_AT_Command("AT+CIPHEAD=1","OK",2);//设置接收数据显示IP头(方便判断数据来源,仅在单路连接有效)
  358.         Second_AT_Command(string,"OK",5);
  359.         delay_ms(100);
  360.         CLR_Buf2();
  361. }
复制代码


115200GPS解析发送.zip

69.97 KB, 下载次数: 7, 下载积分: 黑币 -5

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表