欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
115200波特率GPS解析發送 單片機源程序
[打印本頁]
作者:
njjm
時間:
2019-11-25 17:08
標題:
115200波特率GPS解析發送 單片機源程序
這個程序是以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();
}
復制代碼
115200GPS解析發送.zip
2019-11-25 17:08 上傳
點擊文件名下載附件
下載積分: 黑幣 -5
69.97 KB, 下載次數: 7, 下載積分: 黑幣 -5
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1