OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2568|回复: 1

精英板+lora+gps,发送的数据是垃圾值问题

[复制链接]

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-4-13
在线时间
35 小时
发表于 2019-8-21 21:09:51 | 显示全部楼层 |阅读模式
20金钱
大家好,我把gps程序移植到lora中了,请问在没进入lora通信之前,gps信息能正常更新,但进入通信后没有更新或停止在更新前的那一刻,怎么解决? 谢谢!

图一

图一

图二

图二
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

13

帖子

0

精华

初级会员

Rank: 2

积分
66
金钱
66
注册时间
2019-4-13
在线时间
35 小时
 楼主| 发表于 2019-8-21 21:20:25 | 显示全部楼层
main函数如下#include "sys.h"
#include "delay.h"
#include "usart.h"
#include "led.h"                           
#include "lcd.h"  
#include "key.h"     
#include "usmart.h"
#include "malloc.h"
#include "sdio_sdcard.h"  
#include "w25qxx.h"   
#include "ff.h"  
#include "exfuns.h"   
#include "text.h"               
#include "usart3.h"
#include "string.h"
#include "touch.h"
#include "lora_app.h"                  
#include "gps.h"       
#include "usart2.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 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,70,200,16,16,dtbuf);                   
        tp=gpsx.latitude;          
        sprintf((char *)dtbuf,"Latitude:%.5f %1c   ",tp/=100000,gpsx.nshemi);        //得到纬度字符串
        LCD_ShowString(30,90,200,16,16,dtbuf);                  
        tp=gpsx.altitude;          
        sprintf((char *)dtbuf,"Altitude:%.1fm     ",tp/=10);                                    //得到高度字符串
        LCD_ShowString(30,110,200,16,16,dtbuf);                                   
        tp=gpsx.speed;          
        sprintf((char *)dtbuf,"Speed:%.3fkm/h     ",tp/=1000);                                    //得到速度字符串         
        LCD_ShowString(30,130,200,16,16,dtbuf);                                             
        if(gpsx.fixmode<=3)                                                                                                                //定位状态
        {  
          sprintf((char *)dtbuf,"Fix Mode:%s",fixmode_tbl[gpsx.fixmode]);       
          LCD_ShowString(30,150,200,16,16,dtbuf);                          
        }                   
        sprintf((char *)dtbuf,"GPS+BD Valid satellite:%02d",gpsx.posslnum);                         //用于定位的GPS卫星数
        LCD_ShowString(30,170,200,16,16,dtbuf);            
        sprintf((char *)dtbuf,"GPS Visible satellite:%02d",gpsx.svnum%100);                         //可见GPS卫星数
        LCD_ShowString(30,190,200,16,16,dtbuf);
        sprintf((char *)dtbuf,"BD Visible satellite:%02d",gpsx.beidou_svnum%100);                         //可见北斗卫星数
        LCD_ShowString(30,210,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,230,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,250,200,16,16,dtbuf);                            
}
//主函数
int main(void)
{                  

        u8 key=0;
        u8 fontok=0;
       
        u16 i,rxlen;
        u16 lenx;
   //  u8 key=0XFF;
        u8 upload=0;       
        delay_init();                                            //延时函数初始化          
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2); //设置中断优先级分组为组2:2位抢占优先级,2位响应优先级
        uart_init(115200);                                         //串口初始化为115200
        LCD_Init();         
        tp_dev.init();                                                    //初始化触摸屏
        LED_Init();
        KEY_Init();
        W25QXX_Init();                                                      //初始化W25Q128
        my_mem_init(SRAMIN);                                    //初始化内部内存池
        exfuns_init();                                                    //为fatfs相关变量申请内存
        usmart_dev.init(72);                //初始化USMART                 
        usart2_init(38400);                //初始化串口3
        fontok=font_init();                                        //检查字库是否OK
        POINT_COLOR=RED;
        LCD_ShowString(30,20,200,16,16,"ALIENTEK STM32F1 ^_^");          
        LCD_ShowString(30,40,200,16,16,"S1216F8 GPS TEST");       
        LCD_ShowString(30,60,200,16,16,"ATOM@ALIENTEK");
        LCD_ShowString(30,80,200,16,16,"KEY0:Upload NMEA Data SW");                                                                                                         
        LCD_ShowString(30,100,200,16,16,"NMEA Data Upload:OFF");
        if(SkyTra_Cfg_Rate(5)!=0)        //设置定位信息更新速度为5Hz,顺便判断GPS模块是否在位.
        {
           LCD_ShowString(30,120,200,16,16,"SkyTraF8-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,"SkyTraF8-BD Set Done!!");
                delay_ms(500);
                LCD_Fill(30,120,30+200,120+16,WHITE);//清除显示
        }

                        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
         u8 t=0;
//        u8 key=0;
        u8 netpro=0;
       
        LCD_Clear(WHITE);
        POINT_COLOR=RED;
        Show_Str_Mid(0,30,"ATK-LORA-01 测试程序",16,240);
       
        while(LoRa_Init())//初始化ATK-LORA-01模块
        {
                Show_Str(40+30,50+20,200,16,"未检测到模块!!!",16,0);        
                delay_ms(300);
                Show_Str(40+30,50+20,200,16,"                ",16,0);
        }
        Show_Str(40+30,50+20,200,16,"检测到模块!!!",16,0);
        delay_ms(500);        
        Menu_ui();//主界面显示
        while(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
                       
                 delay_ms(100);
                key = KEY_Scan(0);
                if(key)
                {
                        Show_Str(30+10,95+45+netpro*25,200,16,"  ",16,0);//清空之前的显示
                       
                        if(key==KEY0_PRES)//KEY0按下
                        {
                          if(netpro<6)
                                        netpro++;
                                else
                                        netpro=0;
                        }
                        else if(key==KEY1_PRES)//KEY1按下
                        {
                                if(netpro>0)netpro--;
                                else netpro=6;
                        }
                        else if(key==WKUP_PRES)//KEY_UP按下
                        {
                                if(netpro==0)//进入通信选项
                                {
                                  LoRa_Process();//开始数据测试
                                  netpro=0;//索引返回第0
                                  Menu_ui();
                                }
                                else
                                {
                                        Show_Str(30+40,95+45+netpro*25+2,200,16,"________",16,1);//显示下划线,表示选中
                                        Show_Str(30+10,95+45+netpro*25,200,16,"→",16,0);//指向新条目
                                        Menu_cfg(netpro);//参数配置
                                        LCD_Fill(30+40,95+45+netpro*25+2+15,30+40+100,95+45+netpro*25+2+18,WHITE);//清除下划线显示
                                }
                        }
                        Show_Str(30+10,95+45+netpro*25,200,16,"→",16,0);//指向新条目
                }
               
                t++;
                if(t==30)
                {
                        t=0;
                        LED1=~LED1;
                }
                delay_ms(10);
        }       
}
       


回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-13 03:52

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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