基于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++;
- }
- }
- }
-
复制代码
|