标题:
STM32F103单片机通过蓝牙发送获取的GPS信息到手机上 主函数怎么写
[打印本页]
作者:
dsm123456789
时间:
2019-4-11 09:40
标题:
STM32F103单片机通过蓝牙发送获取的GPS信息到手机上 主函数怎么写
基于STM32F103单片机通过蓝牙发送获取的GPS信息到手机上 主函数怎么写啊??各位大佬用 的蓝牙是HC-06 GPS是 ATK-S1216
#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"
#include "lcd.h"
#include "key.h"
#include "usmart.h"
#include "gps.h"
#include "string.h"
#include "usart2.h"
#include "hc06.h"
u8 USART1_TX_BUF[USART2_MAX_RECV_LEN]; //串口1,发送缓存区
nmea_msg gpsx; //GPS信息
__align(4) u8 dtbuf[50]; //打印缓存器
const u8*fixmode_tbl[4]={"Fail","Fail"," 2D "," 3D "}; //fix mode字符串
//显示GPS定位信息
//void HC06_Role_Show(void)
//{
// if(HC06_Get_Role()==1)LCD_ShowString(30,140,200,16,16,"ROLE:Master"); //主机
// else LCD_ShowString(30,140,200,16,16,"ROLE:Slave "); //从机
//}
////显示ATK-hc06模块的连接状态
//void HC06_Sta_Show(void)
//{
// if(HC06_STATE)LCD_ShowString(120,140,120,16,16,"STA:Connected "); //连接成功
// else LCD_ShowString(120,140,120,16,16,"STA:Disconnect"); //未连接
//}
//void Gps_Msg_Show(void)
//{
// float tp;
// POINT_COLOR=BLUE;
// tp=gpsx.longitude;
// sprintf((char *)dtbuf,"Longitude:%.5f %1c ",tp/=100000,gpsx.ewhemi); //得到经度字符串
// LCD_ShowString(30,120,200,16,16,dtbuf);
// tp=gpsx.latitude;
// sprintf((char *)dtbuf,"Latitude:%.5f %1c ",tp/=100000,gpsx.nshemi); //得到纬度字符串
// LCD_ShowString(30,140,200,16,16,dtbuf);
// tp=gpsx.altitude;
// sprintf((char *)dtbuf,"Altitude:%.1fm ",tp/=10); //得到高度字符串
// LCD_ShowString(30,160,200,16,16,dtbuf);
// tp=gpsx.speed;
// sprintf((char *)dtbuf,"Speed:%.3fkm/h ",tp/=1000); //得到速度字符串
// LCD_ShowString(30,180,200,16,16,dtbuf);
// if(gpsx.fixmode<=3) //定位状态
// {
// sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);
// LCD_ShowString(30,200,200,16,16,dtbuf);
// }
// sprintf((char *)dtbuf,"GPS+BD Valid satellite:%02d",gpsx.posslnum); //用于定位的GPS卫星数
// LCD_ShowString(30,220,200,16,16,dtbuf);
// sprintf((char *)dtbuf,"GPS Visible satellite:%02d",gpsx.svnum%100); //可见GPS卫星数
// LCD_ShowString(30,240,200,16,16,dtbuf);
//
// sprintf((char *)dtbuf,"BD Visible satellite:%02d",gpsx.beidou_svnum%100); //可见北斗卫星数
// LCD_ShowString(30,260,200,16,16,dtbuf);
//
// sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date); //显示UTC日期
// LCD_ShowString(30,280,200,16,16,dtbuf);
// sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec); //显示UTC时间
// LCD_ShowString(30,300,200,16,16,dtbuf);
//}
int main(void)
{
u8 t;
u8 sendmask=0;
u8 sendcnt=0;
u8 sendbuf[20];
// u8 reclen=0;
u16 i,rxlen;
u16 lenx;
u8 key=0XFF;
u8 upload=0;
POINT_COLOR=RED;
delay_init(); //延时函数初始化
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级
uart_init(115200); //串口初始化为9600
USART2_Init(38400); //初始化串口2波特率为115200
LCD_Init(); //初始化液晶
LED_Init(); //LED初始化
KEY_Init(); //按键初始化
usmart_dev.init(72); //usmart初始化 CHUAN KOU
if(SkyTra_Cfg_Rate(5)!=0) //设置定位信息更新速度为5Hz,顺便判断GPS模块是否在位.
{
//LCD_ShowString(30,120,200,16,16,"S1216F8-BD Setting...");
do
{
USART2_Init(9600); //初始化串口3波特率为9600
SkyTra_Cfg_Prt(3); //重新设置模块的波特率为38400
USART2_Init(38400); //初始化串口3波特率为38400
key=SkyTra_Cfg_Tp(100000); //脉冲宽度为100ms
}
while(SkyTra_Cfg_Rate(5)!=0&&key!=0);//配置SkyTraF8-BD的更新速率为5Hz
//LCD_ShowString(30,120,200,16,16,"S1216F8-BD Set Done!!");
delay_ms(500);
//LCD_Fill(30,120,30+200,120+16,WHITE);//清除显示
}
while(1)
{
delay_ms(1);
if(USART2_RX_STA&0X8000) //接收到一次数据了
{
rxlen=USART2_RX_STA&0X7FFF; //得到数据长度
for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART2_RX_BUF[i];
USART2_RX_STA=0; //启动下一次接收
USART1_TX_BUF[i]=0; //自动添加结束符
GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
//Gps_Msg_Show(); //显示信息
if(upload)printf("\r\n%s\r\n",USART1_TX_BUF);//发送接收到的数据到串口1
}
// key=KEY_Scan(0);
// if(key==KEY0_PRES)
// {
// upload=!upload;
// POINT_COLOR=RED;
// if(upload)LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:ON ");
// else LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF");
// }
if((lenx%500)==0)
LED0=!LED0;
lenx++;
}
while(HC06_Init()) //初始化ATK-hc06模块
{
// LCD_ShowString(30,90,200,16,16,"ATK-hc06 Error!");
// delay_ms(500);
// LCD_ShowString(30,90,200,16,16,"Please Check!!!");
POINT_COLOR=BLUE;
delay_ms(100);
}
// LCD_ShowString(30,90,200,16,16,"WK_UP:ROLE KEY0:SEND/STOP");
// LCD_ShowString(30,110,200,16,16,"ATK-hc06 Standby!");
// LCD_ShowString(30,160,200,16,16,"Send:");
// LCD_ShowString(30,180,200,16,16,"Receive:");
// HC06_Role_Show();
while(1)
{
// key=KEY_Scan(0);
// if(key==WKUP_PRES) //切换模块主从设置
// {
// key=HC06_Get_Role();
// if(key!=0XFF)
// {
// key=!key; //状态取反
// if(key==0)HC06_Set_Cmd("AT+ROLE=0");
// else HC06_Set_Cmd("AT+ROLE=1");
// HC06_Role_Show();
// HC06_Set_Cmd("AT+RESET"); //复位ATK-hc06模块
// }
// }else
if(key==KEY0_PRES)
{
sendmask=!sendmask; //发送/停止发送
if(sendmask==0)LCD_Fill(30+40,160,240,160+16,WHITE);//清除显示
}else delay_ms(10);
if(t==50)
{
if(sendmask) //定时发送
{
sprintf((char*)sendbuf,"ALIENTEK hc06 %d\r\n",sendcnt);
LCD_ShowString(30+40,160,200,16,16,sendbuf); //显示发送数据
u2_printf("ALIENTEK hc06 %d\r\n",sendcnt); //发送到蓝牙模块
sendcnt++;
if(sendcnt>99)sendcnt=0;
}
// HC06_Sta_Show();
// t=0;
// LED0=!LED0;
// }
// if(USART2_RX_STA&0X8000) //接收到一次数据了
// {
// LCD_Fill(30,200,240,320,WHITE); //清除显示
// reclen=USART2_RX_STA&0X7FFF; //得到数据长度
// USART2_RX_BUF[reclen]=0; //加入结束符
// if(reclen==9||reclen==8) //控制DS1检测
// {
// if(strcmp((const char*)USART2_RX_BUF,"+LED1 ON")==0)LED1=0; //打开LED1
// if(strcmp((const char*)USART2_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1
// }
// LCD_ShowString(30,200,209,119,16,USART2_RX_BUF);//显示接收到的数据
// USART2_RX_STA=0;
// }
// t++;
}
}
}
复制代码
作者:
Alive111
时间:
2021-6-24 11:33
请问这个项目代码你实现了吗
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1