lora模块的使用

2019-07-21 08:34发布

如题,再给lora初始化的时候,给的MD0=1,进入配置模式,此时发送AT,正常初始化返回值应该是OK,但是发送后没有数据接收单独的测试lora模块是没有问题的,然后单独的测串口也没有问题,但是现在放在一起用的话就会出问题,收不到数据,也就无法初始化
贴出代码
[mw_shl_code=c,true]    HAL_Init();                                     //初始化HAL库   
    Stm32_Clock_Init(RCC_PLL_MUL9);           //设置时钟,72M
        delay_init(72);                               //初始化延时函数
        USART_DMA_Config(1);                //初始化DMA1通道4-TX  通道5-RX

        uart_init(1,115200,UART_WORDLENGTH_8B,UART_STOPBITS_1,UART_PARITY_NONE,UART_HWCONTROL_NONE,UART_MODE_TX_RX);                                        //初始化串口


                Lora_Test();//lora测试
//主测试函数
void Lora_Test(void)
{
        u8 t=0;
       
        printf("ATK-LORA-01 测试程序");
       
        while(LoRa_Init())//初始化ATK-LORA-01模块
        {
                printf("未检测到模块!!!");
                delay_ms(300);
        }
        printf("检测到模块!!!");
    delay_ms(500);        
        Menu_ui();                //主菜单显示}
u8 LoRa_Init(void)
{
         u8 retry=0;
         u8 temp=1;
//AUX-PA4   MD0-PA1初始化
       
         __HAL_RCC_GPIOA_CLK_ENABLE();          //开启GPIOA时钟
         
        GPIO_Initure.Pin=GPIO_PIN_1;           //PA1   MD0初始化
        GPIO_Initure.Mode=GPIO_MODE_OUTPUT_PP; //推挽输出
        GPIO_Initure.Pull=GPIO_PULLDOWN;       //下拉
        GPIO_Initure.Speed=GPIO_SPEED_HIGH;    //高速
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);

        GPIO_Initure.Pin=GPIO_PIN_4;          //PA4    AUX初始化
        GPIO_Initure.Mode=GPIO_MODE_IT_RISING; //上升沿触发
        GPIO_Initure.Pull=GPIO_PULLDOWN;       //下拉
        GPIO_Initure.Speed=GPIO_SPEED_HIGH;    //高速
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);
       
        LORA_MD0=0;
//        LORA_AUX=0;
       
        while(LORA_AUX)//确保LORA模块在空闲状态下(LORA_AUX=0)
        {
printf("模块正忙,请稍后");
                delay_ms(500);
        delay_ms(100);                 
        }
        usart2_init(115200);//初始化串口2
printf("USART2初始化完成");         
delay_ms(20);
       
        LORA_MD0=1;//进入AT模式
        delay_ms(40);
        retry=3;
        while(retry--)
          {
                 if(!lora_send_cmd("AT","OK",70))
                 {
                         temp=0;//检测成功
                         break;
                 }       
          }
          if(retry==0) temp=1;//检测失败
          return temp;
}
u8 lora_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
        u8 res=0;
        USART2_RX_STA=0;
        if((u32)cmd<=0XFF)
        {
                while((USART2->SR&0X40)==0);//等待上一次数据发送完成  
                USART2->DR=(u32)cmd;
        }else u2_printf("%s ",cmd);//发送命令
       
        if(ack&&waittime)                //需要等待应答
        {
           while(--waittime)        //等待倒计时
           {
                  delay_ms(10);
                  if(USART2_RX_STA&0X8000)//接收到期待的应答结果
                  {
                          if(lora_check_cmd(ack))
                          {
                                  USART2_RX_STA=0;
                                  break;//得到有效数据
                          }  
                  }
           }
           if(waittime==0)res=1;
        }
        return res;
}[/mw_shl_code][mw_shl_code=c,true]u8* lora_check_cmd(u8 *str)
{
        char *strx=0;
        if(USART2_RX_STA&0X8000)                //接收到一次数据了
        {
                USART2_RX_BUF[USART2_RX_STA&0X7FFF]=0;//添加结束符
                strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
        }
        return (u8*)strx;
}

//初始化IO,串口2
//bound:波特率
void usart2_init(u32 bound)
{       
        //GPIO端口设置
        GPIO_InitTypeDef GPIO_Initure;

        __HAL_RCC_GPIOA_CLK_ENABLE();                                      //使能GPIOA时钟
        __HAL_RCC_USART2_CLK_ENABLE();                                      //使能USART2时钟

        //UART 初始化设置
        UART2_Handler.Instance=USART2;                                              //USART2
        UART2_Handler.Init.BaudRate=bound;                                      //波特率
        UART2_Handler.Init.WordLength=UART_WORDLENGTH_8B;     //字长为8位数据格式
        UART2_Handler.Init.StopBits=UART_STOPBITS_1;              //一个停止位
        UART2_Handler.Init.Parity=UART_PARITY_NONE;                      //无奇偶校验位
        UART2_Handler.Init.HwFlowCtl=UART_HWCONTROL_NONE;     //无硬件流控
        UART2_Handler.Init.Mode=UART_MODE_TX_RX;                      //收发模式
        HAL_UART_Init(&UART2_Handler);                                              //HAL_UART_Init()会使能UART2       

        GPIO_Initure.Pin=GPIO_PIN_2|GPIO_PIN_3;                          //PA2,PA3
        GPIO_Initure.Mode=GPIO_MODE_AF_PP;                              //复用推挽输出
        GPIO_Initure.Pull=GPIO_PULLUP;                                      //上拉
        GPIO_Initure.Speed=GPIO_SPEED_FREQ_HIGH;                      //高速
        HAL_GPIO_Init(GPIOA,&GPIO_Initure);                              //初始化PA2

        __HAL_UART_DISABLE_IT(&UART2_Handler,UART_IT_TC);       
#if USART2_RX_EN
        __HAL_UART_ENABLE_IT(&UART2_Handler,UART_IT_RXNE);    //开启接收中断
        HAL_NVIC_EnableIRQ(USART2_IRQn);                                      //使能USART2中断通道
        HAL_NVIC_SetPriority(USART2_IRQn,2,3);                              //抢占优先级2,子优先级3
#endif       
        TIM7_Init(100-1,9000-1);                              //重新设置为10ms中断       
        HAL_TIM_Base_Stop(&TIM7_Handler);                     //关闭定时器7
        USART2_RX_STA=0;                                                      //清零   
}
//串口2中断服务程序
void USART2_IRQHandler(void)
{
          u8 Res;
          if((__HAL_UART_GET_FLAG(&UART2_Handler,UART_FLAG_RXNE)!=RESET))
          {
                  HAL_UART_Receive(&UART2_Handler,&Res,1,1000);
                  if((USART2_RX_STA&0x8000)==0)                //接收完的一批数据,还没有被处理,则不再接收其他数据
                  {
                         if(USART2_RX_STA<USART2_MAX_RECV_LEN)     //还可以接收数据
                         {
                                 
                                 if(!Lora_mode)//配置模式下(启动定时器超时)
                                 {
                                          TIM7->CNT = 0;                       //计数器清空
                                          if(USART2_RX_STA==0)                 //如果没有接收任何数据
                                          {
                                                 HAL_TIM_Base_Start(&TIM7_Handler);//开启定时器7
                                          }
                                         
                                 }
                                 USART2_RX_BUF[USART2_RX_STA++]=Res;  //记录接收到的值
                                  
                         }
                         else
                         {
                                  USART2_RX_STA|=1<<15;                               //强制标记接收完成
                         }
                  }
          }
//          HAL_UART_IRQHandler(&UART2_Handler);       
}

//串口2,printf 函数
//确保一次发送数据不超过USART2_MAX_SEND_LEN字节
void u2_printf(char* fmt,...)  
{  
        u16 i,j;
        va_list ap;
        va_start(ap,fmt);
        vsprintf((char*)USART2_TX_BUF,fmt,ap);
        va_end(ap);
        i=strlen((const char*)USART2_TX_BUF);//此次发送数据的长度
        for(j=0;j<i;j++)                     //循环发送数据
        {
                while((USART2->SR&0X40)==0);     //循环发送,直到发送完毕   
                USART2->DR=USART2_TX_BUF[j];  
        }
}[/mw_shl_code]

测试串口单独收发数据都是没问题的,有人知道是哪里出错了吗
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
FantaSy_
1楼-- · 2019-07-21 13:56
 精彩回答 2  元偷偷看……
fang百川
2楼-- · 2019-07-21 14:06
FantaSy_ 发表于 2018-10-29 20:38
用我们的代码测试一下!

好的谢谢

一周热门 更多>