找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2910|回复: 1
收起左侧

STM32F103单片机通过蓝牙发送获取的GPS信息到手机上 主函数怎么写

[复制链接]
ID:508887 发表于 2019-4-11 09:40 | 显示全部楼层 |阅读模式
基于STM32F103单片机通过蓝牙发送获取的GPS信息到手机上 主函数怎么写啊??各位大佬用 的蓝牙是HC-06  GPS是  ATK-S1216

  1. #include "sys.h"
  2. #include "delay.h"
  3. #include "usart.h"
  4. #include "led.h"                           
  5. #include "lcd.h"  
  6. #include "key.h"     
  7. #include "usmart.h"
  8. #include "gps.h"
  9. #include "string.h"               
  10. #include "usart2.h"
  11. #include "hc06.h"



  12. u8 USART1_TX_BUF[USART2_MAX_RECV_LEN];                                         //串口1,发送缓存区
  13. nmea_msg gpsx;                                                                                         //GPS信息
  14. __align(4) u8 dtbuf[50];                                                                   //打印缓存器
  15. const u8*fixmode_tbl[4]={"Fail","Fail"," 2D "," 3D "};        //fix mode字符串
  16.          
  17. //显示GPS定位信息

  18. //void HC06_Role_Show(void)
  19. //{
  20. //        if(HC06_Get_Role()==1)LCD_ShowString(30,140,200,16,16,"ROLE:Master");        //主机
  21. //        else LCD_ShowString(30,140,200,16,16,"ROLE:Slave ");                                         //从机
  22. //}
  23. ////显示ATK-hc06模块的连接状态
  24. //void HC06_Sta_Show(void)
  25. //{                                                                                                
  26. //        if(HC06_STATE)LCD_ShowString(120,140,120,16,16,"STA:Connected ");                        //连接成功
  27. //        else LCD_ShowString(120,140,120,16,16,"STA:Disconnect");                                 //未连接                                 
  28. //}

  29. //void Gps_Msg_Show(void)
  30. //{
  31. //         float tp;                  
  32. //        POINT_COLOR=BLUE;           
  33. //        tp=gpsx.longitude;           
  34. //        sprintf((char *)dtbuf,"Longitude:%.5f %1c   ",tp/=100000,gpsx.ewhemi);        //得到经度字符串
  35. //         LCD_ShowString(30,120,200,16,16,dtbuf);                    
  36. //        tp=gpsx.latitude;           
  37. //        sprintf((char *)dtbuf,"Latitude:%.5f %1c   ",tp/=100000,gpsx.nshemi);        //得到纬度字符串
  38. //         LCD_ShowString(30,140,200,16,16,dtbuf);                  
  39. //        tp=gpsx.altitude;           
  40. //         sprintf((char *)dtbuf,"Altitude:%.1fm     ",tp/=10);                                    //得到高度字符串
  41. //         LCD_ShowString(30,160,200,16,16,dtbuf);                                    
  42. //        tp=gpsx.speed;           
  43. //         sprintf((char *)dtbuf,"Speed:%.3fkm/h     ",tp/=1000);                                    //得到速度字符串         
  44. //         LCD_ShowString(30,180,200,16,16,dtbuf);                                             
  45. //        if(gpsx.fixmode<=3)                                                                                                                //定位状态
  46. //        {  
  47. //                sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);        
  48. //          LCD_ShowString(30,200,200,16,16,dtbuf);                           
  49. //        }                    
  50. //        sprintf((char *)dtbuf,"GPS+BD Valid satellite:%02d",gpsx.posslnum);                         //用于定位的GPS卫星数
  51. //         LCD_ShowString(30,220,200,16,16,dtbuf);            
  52. //        sprintf((char *)dtbuf,"GPS Visible satellite:%02d",gpsx.svnum%100);                         //可见GPS卫星数
  53. //         LCD_ShowString(30,240,200,16,16,dtbuf);
  54. //        
  55. //        sprintf((char *)dtbuf,"BD Visible satellite:%02d",gpsx.beidou_svnum%100);                         //可见北斗卫星数
  56. //         LCD_ShowString(30,260,200,16,16,dtbuf);
  57. //        
  58. //        sprintf((char *)dtbuf,"UTC Date:%04d/%02d/%02d   ",gpsx.utc.year,gpsx.utc.month,gpsx.utc.date);        //显示UTC日期
  59. //        LCD_ShowString(30,280,200,16,16,dtbuf);                    
  60. //        sprintf((char *)dtbuf,"UTC Time:%02d:%02d:%02d   ",gpsx.utc.hour,gpsx.utc.min,gpsx.utc.sec);        //显示UTC时间
  61. //  LCD_ShowString(30,300,200,16,16,dtbuf);                  
  62. //}
  63. int main(void)
  64. {
  65.         u8 t;
  66.         u8 sendmask=0;
  67.         u8 sendcnt=0;
  68.         u8 sendbuf[20];         
  69. // u8 reclen=0;  
  70.   u16 i,rxlen;
  71.         u16 lenx;
  72.         u8 key=0XFF;
  73.         u8 upload=0;
  74.         POINT_COLOR=RED;         
  75.         delay_init();                     //延时函数初始化
  76.         NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置NVIC中断分组2:2位抢占优先级,2位响应优先级         
  77.         uart_init(115200);                 //串口初始化为9600        
  78.         USART2_Init(38400);  //初始化串口2波特率为115200
  79.         LCD_Init();                                //初始化液晶
  80.         LED_Init();                 //LED初始化         
  81.         KEY_Init();                                //按键初始化
  82.         usmart_dev.init(72);        //usmart初始化             CHUAN KOU

  83.          


  84.         if(SkyTra_Cfg_Rate(5)!=0)        //设置定位信息更新速度为5Hz,顺便判断GPS模块是否在位.
  85.         {
  86.            //LCD_ShowString(30,120,200,16,16,"S1216F8-BD Setting...");
  87.                 do
  88.                 {
  89.                         USART2_Init(9600);                        //初始化串口3波特率为9600
  90.                   SkyTra_Cfg_Prt(3);                        //重新设置模块的波特率为38400
  91.                         USART2_Init(38400);                        //初始化串口3波特率为38400
  92.       key=SkyTra_Cfg_Tp(100000);        //脉冲宽度为100ms
  93.                 }
  94.                 while(SkyTra_Cfg_Rate(5)!=0&&key!=0);//配置SkyTraF8-BD的更新速率为5Hz
  95.           //LCD_ShowString(30,120,200,16,16,"S1216F8-BD Set Done!!");
  96.                 delay_ms(500);
  97.                 //LCD_Fill(30,120,30+200,120+16,WHITE);//清除显示
  98.         }
  99.         while(1)
  100.         {               
  101.                 delay_ms(1);
  102.                 if(USART2_RX_STA&0X8000)                //接收到一次数据了
  103.                 {
  104.                         rxlen=USART2_RX_STA&0X7FFF;        //得到数据长度
  105.                         for(i=0;i<rxlen;i++)USART1_TX_BUF[i]=USART2_RX_BUF[i];           
  106.                          USART2_RX_STA=0;                           //启动下一次接收
  107.                         USART1_TX_BUF[i]=0;                        //自动添加结束符
  108.                         GPS_Analysis(&gpsx,(u8*)USART1_TX_BUF);//分析字符串
  109.                         //Gps_Msg_Show();                                //显示信息        
  110.                         if(upload)printf("\r\n%s\r\n",USART1_TX_BUF);//发送接收到的数据到串口1
  111.                  }
  112. //                key=KEY_Scan(0);
  113. //                if(key==KEY0_PRES)
  114. //                {
  115. //                        upload=!upload;
  116. //                        POINT_COLOR=RED;
  117. //                        if(upload)LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:ON ");
  118. //                        else LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF");
  119. //                 }
  120.                 if((lenx%500)==0)
  121.                         LED0=!LED0;
  122.                 lenx++;        
  123.         }

  124.                 while(HC06_Init())        //初始化ATK-hc06模块  
  125.         {
  126. //                LCD_ShowString(30,90,200,16,16,"ATK-hc06 Error!");
  127. //                delay_ms(500);
  128. //                LCD_ShowString(30,90,200,16,16,"Please Check!!!");
  129.                         POINT_COLOR=BLUE;
  130.                   delay_ms(100);
  131.         }                                                                                               
  132. //          LCD_ShowString(30,90,200,16,16,"WK_UP:ROLE KEY0:SEND/STOP");  
  133. //          LCD_ShowString(30,110,200,16,16,"ATK-hc06 Standby!");  
  134. //          LCD_ShowString(30,160,200,16,16,"Send:");        
  135. //          LCD_ShowString(30,180,200,16,16,"Receive:");        
  136. //    HC06_Role_Show();         
  137.          while(1)
  138.         {               
  139. //                key=KEY_Scan(0);
  140. //                if(key==WKUP_PRES)                                                //切换模块主从设置
  141. //                {
  142. //                           key=HC06_Get_Role();
  143. //                        if(key!=0XFF)
  144. //                        {
  145. //                                key=!key;                                          //状态取反           
  146. //                                if(key==0)HC06_Set_Cmd("AT+ROLE=0");
  147. //                                else HC06_Set_Cmd("AT+ROLE=1");
  148. //                                HC06_Role_Show();
  149. //                                HC06_Set_Cmd("AT+RESET");        //复位ATK-hc06模块
  150. //                        }
  151. //                }else

  152.         if(key==KEY0_PRES)
  153.                 {
  154.                         sendmask=!sendmask;                                //发送/停止发送           
  155.                         if(sendmask==0)LCD_Fill(30+40,160,240,160+16,WHITE);//清除显示
  156.                 }else delay_ms(10);           
  157.                 if(t==50)
  158.                 {
  159.                         if(sendmask)                                        //定时发送
  160.                         {
  161.                                 sprintf((char*)sendbuf,"ALIENTEK hc06 %d\r\n",sendcnt);
  162.                                   LCD_ShowString(30+40,160,200,16,16,sendbuf);        //显示发送数据        
  163.                                 u2_printf("ALIENTEK hc06 %d\r\n",sendcnt);                //发送到蓝牙模块
  164.                                 sendcnt++;
  165.                                 if(sendcnt>99)sendcnt=0;
  166.                         }
  167. //                        HC06_Sta_Show();            
  168. //                        t=0;
  169. //                        LED0=!LED0;              
  170. //                }         
  171. //                if(USART2_RX_STA&0X8000)                        //接收到一次数据了
  172. //                {
  173. //                        LCD_Fill(30,200,240,320,WHITE);        //清除显示
  174. //                         reclen=USART2_RX_STA&0X7FFF;        //得到数据长度
  175. //                          USART2_RX_BUF[reclen]=0;                 //加入结束符
  176. //                        if(reclen==9||reclen==8)                 //控制DS1检测
  177. //                        {
  178. //                                if(strcmp((const char*)USART2_RX_BUF,"+LED1 ON")==0)LED1=0;        //打开LED1
  179. //                                if(strcmp((const char*)USART2_RX_BUF,"+LED1 OFF")==0)LED1=1;//关闭LED1
  180. //                        }
  181. //                         LCD_ShowString(30,200,209,119,16,USART2_RX_BUF);//显示接收到的数据
  182. //                         USART2_RX_STA=0;         
  183. //                }                                                                                                                                                                        
  184. //                t++;        
  185.         }                                                                                            
  186. }        
  187. }
  188.         
复制代码

回复

使用道具 举报

ID:943849 发表于 2021-6-24 11:33 | 显示全部楼层
请问这个项目代码你实现了吗
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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