|
这个程序是以115200的波特率解析GPS- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "delay.h"
- #include "uart.h"
- #define Buf1_Max 68 //串口1缓存长度
- #define Buf2_Max 200 //串口2缓存长度
- /************* 本地常量声明 **************/
- const u8 *string = "AT+CIPSTART=\"UDP\",\"120.79.47.48\",8088"; //IP登录服务器
- sbit RUNING_LED = P2^1; //运行指示灯
- sbit LED = P3^3; //控制指示灯
- /************* 本地变量声明 **************/
- xdata u8 Uart1_Buf[Buf1_Max];
- xdata u8 Uart2_Buf[Buf2_Max];
- xdata u8 GPGGA_Buffer[68];
- u8 latitude[13],longitude[14],N_S,E_W;
- u8 RX_Count = 0;
- u8 Times=0,First_Int = 0,shijian=0;
- u16 Heartbeat=0;
- bit Flag_GPS_OK = 0;
- bit Flag_Calc_GPGGA_OK = 0;
- //u8 Time_count=0;
- bdata u8 Flag;//定时器标志位
- sbit Timer0_start =Flag^0; //定时器0延时启动计数器
- sbit Heart_beat =Flag^1; //发送心跳帧标志位
- /************* 本地函数声明 **************/
- void GPIO_config(void);
- void Timer0Init(void);
- void CLR_Buf2(void);
- u8 Find(u8 *a);
- void Second_AT_Command(u8 *b,u8 *a,u8 wait_time);
- void Set_ATE0(void);
- void Connect_Server(void);
- //void Rec_Server_Data(void);
- void Wait_CREG(void);
- //void Send_OK(void);
- void READ_GPS(void);
- /************* 外部函数和变量声明*****************/
- /*******************************************************************************
- * 函数名 : main
- * 描述 : 主函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 : 串口2负责与GPRS模块通信,串口1用于串口调试,可以避免在下载程序时数据
- 还发送到模块
- *******************************************************************************/
- void main(void)
- {
- GPIO_config();
- Uart1Init();
- Uart2Init();
- Timer0Init();
- EA=1; //开总中断
- //UART1_SendString("GPRS模块GPRS测试程序\r\n");
- //UART1_SendString("GPRS模块在注册网络\r\n");
- Wait_CREG();
- //UART1_SendString("GPRS模块注册成功\r\n");
- //UART1_SendString("GPRS模块开始连接服务器\r\n");
- Set_ATE0();
- Connect_Server();
- //UART1_SendString("连接成功\r\n");
- while(1)
- {
- Second_AT_Command("AT+CIPSEND",">",2);
- UART2_SendString("No:Dog001");
- UART2_SendData(0x1A);
- CLR_Buf2();
- READ_GPS();
- Second_AT_Command("AT+CIPSEND",">",2);
- UART2_SendString(latitude);
- UART2_SendData(0x1A);
- CLR_Buf2();
- Second_AT_Command("AT+CIPSEND",">",2);
- UART2_SendData(N_S);
- UART2_SendData(0x1A);
- CLR_Buf2();
- Second_AT_Command("AT+CIPSEND",">",2);
- UART2_SendString(longitude);
- UART2_SendData(0x1A);
- CLR_Buf2();
- Second_AT_Command("AT+CIPSEND",">",2);
- UART2_SendData(E_W);
- UART2_SendData(0x1A);
- CLR_Buf2();
- }
- }
- void READ_GPS(void)
- {
- u8 i = 0;
- if(Flag_GPS_OK == 1 && Uart1_Buf[4] == 'G' && Uart1_Buf[6] == ',' && Uart1_Buf[13] == '.') //确定是否收到"GPGGA"这一帧数据
- {
- for( i = 0; i < 68 ; i++)
- {
- GPGGA_Buffer[i] = Uart1_Buf[i];
- }
- Flag_Calc_GPGGA_OK = 1;
- }
- if(Flag_Calc_GPGGA_OK == 1)
- {
- strncpy(latitude,GPGGA_Buffer+17,13);
- N_S=GPGGA_Buffer[28];
- strncpy(longitude,GPGGA_Buffer+30,14);
- E_W=GPGGA_Buffer[42];
- }
-
- }
- /*******************************************************************************
- * 函数名 : Uart1
- * 描述 : 串口1中断服务入口函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Uart1() interrupt 4 using 3
- {
- u8 temp = 0;
- ES=0;
- temp = SBUF;
- RI = 0; //清除RI位
- Uart1_Buf[RX_Count++] = temp;
- if(RX_Count >= 59)
- {
- RX_Count = 59;
- Flag_GPS_OK = 1;
- }
- ES=1;
- }
- /*******************************************************************************
- * 函数名 : Uart2
- * 描述 : 串口2中断服务入口函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Uart2() interrupt 8
- {
- IE2 &= ~0x01; //关闭串口2中断
- if (S2CON & S2RI)
- {
- S2CON &= ~S2RI; //清除S2RI位
- Uart2_Buf[First_Int] = S2BUF; //将接收到的字符串存到缓存中
- First_Int++; //缓存指针向后移动
- if(First_Int > Buf2_Max) //如果缓存满,将缓存指针指向缓存的首地址
- {
- First_Int = 0;
- }
- }
- if (S2CON & S2TI)
- {
- S2CON &= ~S2TI; //清除S2TI位
- }
- IE2 |= 0x01; //使能串口2中断
- }
- /*******************************************************************************
- * 函数名 : Timer0_ISR
- * 描述 : 定时器0中断服务入口函数,20ms中断一次
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Timer0_ISR() interrupt 1
- {
- static u8 Time_count=0;
- TR0=0;//关定时器
- Time_count++;
- if(Time_count>=50)//1秒运行指示灯闪烁
- {
- Time_count = 0;
- RUNING_LED =~RUNING_LED;
- }
- Heartbeat++;
- if(Heartbeat>500)//每10秒发送心跳帧
- {
- Heartbeat=0;
- Heart_beat=1;
- }
- if(Timer0_start)
- Times++;
- if(Times > (50*shijian))
- {
- Timer0_start = 0;
- Times = 0;
- }
- TR0=1;//开定时器
- }
- /*******************************************************************************
- * 函数名 : GPIO_config
- * 描述 : IO口配置函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void GPIO_config(void)
- {
- P3M1 &= 0XC3; //配置P32~P35为推挽输出
- P3M0 |= ~0XC3;
- LED=0;
- RUNING_LED=0;
- }
- /*******************************************************************************
- * 函数名 : Timer0Init
- * 描述 : 定时器0初始化函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Timer0Init(void) //20毫秒@22.1184MHz
- {
- AUXR &= 0x7F; //12T模式
- TMOD &= 0xF0; //设置定时器模式 16位重载
- TL0 = 0x00; //设定定时器初值
- TH0 = 0x70; //设定定时器初值
- TF0 = 0; //清除TF0标志
- TR0 = 1; //定时器0开始计时
- ET0 = 1; //使能定时器0中断
- }
- /*******************************************************************************
- * 函数名 : CLR_Buf2
- * 描述 : 清除串口2缓存数据
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void CLR_Buf2(void)
- {
- u16 k;
- for(k=0;k<Buf2_Max;k++) //将缓存内容清零
- {
- Uart2_Buf[k] = 0x00;
- }
- First_Int = 0; //接收字符串的起始存储位置
- }
- /*******************************************************************************
- * 函数名 : Wait_CREG
- * 描述 : 等待模块注册成功
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Wait_CREG(void)
- {
- u8 i;
- u8 k;
- i = 0;
- CLR_Buf2();
- while(i == 0)
- {
- CLR_Buf2();
- UART2_SendString("AT+CREG?");
- UART2_SendLR();
- delay_ms(5000);
- for(k=0;k<Buf2_Max;k++)
- {
- if(Uart2_Buf[k] == ':')
- {
- if((Uart2_Buf[k+4] == '1')||(Uart2_Buf[k+4] == '5'))
- {
- i = 1;
- break;
- }
- }
- }
- //UART1_SendString("注册中.....");
- }
- }
- /*******************************************************************************
- * 函数名 : Find
- * 描述 : 判断缓存中是否含有指定的字符串
- * 输入 :
- * 输出 :
- * 返回 : unsigned char:1 找到指定字符,0 未找到指定字符
- * 注意 :
- *******************************************************************************/
- u8 Find(u8 *a)
- {
- if(strstr(Uart2_Buf,a)!=NULL)
- return 1;
- else
- return 0;
- }
- /*******************************************************************************
- * 函数名 : Second_AT_Command
- * 描述 : 发送AT指令函数
- * 输入 : 发送数据的指针、发送等待时间(单位:S)
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Second_AT_Command(u8 *b,u8 *a,u8 wait_time)
- {
- u8 i;
- u8 *c;
- c = b; //保存字符串地址到c
- CLR_Buf2();
- i = 0;
- while(i == 0)
- {
- if(!Find(a))
- {
- if(Timer0_start == 0)
- {
- b = c; //将字符串地址给b
- for (b; *b!='\0';b++)
- {
- UART2_SendData(*b);
- }
- UART2_SendLR();
- Times = 0;
- shijian = wait_time;
- Timer0_start = 1;
- }
- }
- else
- {
- i = 1;
- Timer0_start = 0;
- }
- }
- CLR_Buf2();
- }
- /*******************************************************************************
- * 函数名 : Set_ATE0
- * 描述 : 取消回显
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Set_ATE0(void)
- {
- Second_AT_Command("ATE0","OK",3); //取消回显
- }
- /*******************************************************************************
- * 函数名 : Connect_Server
- * 描述 : GPRS连接服务器函数
- * 输入 :
- * 输出 :
- * 返回 :
- * 注意 :
- *******************************************************************************/
- void Connect_Server(void)
- {
- UART2_SendString("AT+CIPCLOSE=1"); //关闭连接
- Second_AT_Command("AT+CIPSHUT","SHUT OK",2); //关闭移动场景
- Second_AT_Command("AT+CGCLASS=\"B\"","OK",2);//设置GPRS移动台类别为B,支持包交换和数据交换
- Second_AT_Command("AT+CGDCONT=1,\"IP\",\"CMNET\"","OK",2);//设置PDP上下文,互联网接协议,接入点等信息
- Second_AT_Command("AT+CGATT=1","OK",2);//附着GPRS业务
- Second_AT_Command("AT+CIPCSGP=1,\"CMNET\"","OK",2);//设置为GPRS连接模式
- Second_AT_Command("AT+CIPHEAD=1","OK",2);//设置接收数据显示IP头(方便判断数据来源,仅在单路连接有效)
- Second_AT_Command(string,"OK",5);
- delay_ms(100);
- CLR_Buf2();
- }
复制代码
|
|