在好例子网,分享、交流、成长!
您当前所在位置:首页C/C++ 开发实例嵌入式开发 → LORA(嵌入式源码)

LORA(嵌入式源码)

嵌入式开发

下载此实例
  • 开发语言:C/C++
  • 实例大小:0.01M
  • 下载次数:2
  • 浏览次数:45
  • 发布时间:2024-10-10
  • 实例类别:嵌入式开发
  • 发 布 人:hbSnj
  • 文件格式:.zip
  • 所需积分:2
 相关标签: LORA

实例介绍

#include "lora_app.h"
#include "sys.h"//*这个直接用正点原子的
#include "usart3.h"
#include "string.h"
#include "stdio.h"
#include "delay.h"
 #include "lcd.h"
//设备参数初始化(具体设备参数见lora_cfg.h定义)
_LoRa_CFG LoRa_CFG=
{
.addr = LORA_ADDR,       //设备地址
.power = LORA_POWER,     //发射功率
.chn = LORA_CHN,         //信道
.wlrate = LORA_RATE,     //空中速率
.wltime = LORA_WLTIME,   //睡眠时间
.mode = LORA_MODE,       //工作模式
.mode_sta = LORA_STA,    //发送状态
.bps = LORA_TTLBPS ,     //波特率设置
.parity = LORA_TTLPAR    //校验位设置
};
 
//全局参数
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
//设备工作模式(用于记录设备状态)
u8 Lora_mode=0;//0:配置模式 1:接收模式 2:发送模式
//记录中断状态
static u8 Int_mode=0;//0:关闭 1:上升沿 2:下降沿
 
 
//usmart支持部分
//将收到的AT指令应答数据返回给电脑串口
//mode:0,不清零USART3_RX_STA;
//     1,清零USART3_RX_STA;
void lora_at_response(u8 mode)
{
if(UART5_RX_STA&0X8000) //接收到一次数据了

UART5_RX_BUF[UART5_RX_STA&0X7FFF]=0;//添加结束符
printf("%s",UART5_RX_BUF); //发送到串口
if(mode)UART5_RX_STA=0;

}
//lora发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
//其他,期待应答结果的位置(str的位置)
u8* lora_check_cmd(u8 *str)
{
char *strx=0;
if(UART5_RX_STA&0X8000) //接收到一次数据了

UART5_RX_BUF[UART5_RX_STA&0X7FFF]=0;//添加结束符
strx=strstr((const char*)UART5_RX_BUF,(const char*)str);

return (u8*)strx;
}
//lora发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 lora_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0; 
UART5_RX_STA=0;
if((u32)cmd<=0XFF)
{
while((UART5->SR&0X40)==0);//等待上一次数据发送完成  
UART5->DR=(u32)cmd;
}else {
u5_printf("%s\r\n",cmd);
}//发送命令

if(ack&&waittime) //需要等待应答
{
   while(--waittime) //等待倒计时
   { 
  delay_ms(10);
  if(UART5_RX_STA&0X8000)//接收到期待的应答结果
  {
  if(lora_check_cmd(ack))break;//得到有效数据 
  UART5_RX_STA=0;
  } 
   }
   if(waittime==0)res=1; 
}
return res;
}
 
 
//AUX中断设置
//mode:配置的模式 0:关闭 1:上升沿 2:下降沿
void Aux_Int(u8 mode)
{
    if(!mode)
{
EXTI_InitStructure.EXTI_LineCmd = DISABLE;//关闭中断
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
}else
{
if(mode==1)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿
    else if(mode==2)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿

EXTI_InitStructure.EXTI_LineCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
}
Int_mode = mode;//记录中断模式
EXTI_Init(&EXTI_InitStructure);
NVIC_Init(&NVIC_InitStructure);  
    
}
 
//LoRa模块初始化
//返回值: 0,检测成功
//        1,检测失败
u8 LoRa_Configure(void)
{
u8 retry=0;
u8 temp=1;

GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PA端口时钟
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
 
//     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,从而PA15可以做普通IO使用,否则PA15不能做普通IO!!!
//*我的PA15引脚有问题,所以我直接换成PB4了,但注意换的话,要去lora_app.h中去改引脚
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;     //LORA_MD0
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
// GPIO_Init(GPIOA, &GPIO_InitStructure);   //推挽输出 ,IO口速度为50MHz

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //LORA_AUX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;      //下拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOA.4

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4);
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟//GPIOA.4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;     //LORA_MD0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);   //推挽输出 ,IO口速度为50MHz
//*这个对应的是一个上升沿触发的中断,对应于PA4引脚
   EXTI_InitStructure.EXTI_Line=EXTI_Line4;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发
  EXTI_InitStructure.EXTI_LineCmd = DISABLE;              //中断线关闭(先关闭后面再打开)
  EXTI_Init(&EXTI_InitStructure);//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

   NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //LORA_AUX
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2, 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; //关闭外部中断通道(后面再打开)
    NVIC_Init(&NVIC_InitStructure); 
 
LORA_MD0=0;
LORA_AUX=0;
POINT_COLOR=RED;
LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");
while(LORA_AUX)//确保LORA模块在空闲状态下(LORA_AUX=0)
{
delay_ms(500); 
}
uart5_init(115200);//初始化串口3 
LORA_MD0=1;//进入AT模式
delay_ms(100);
retry=5;
while(retry--)
{
if(!lora_send_cmd("AT","OK",70))
{
LCD_ShowString(30,70,200,16,16,"TFTLCD TESTOK");
temp=0;//检测成功
break;
}
}
if(retry==0) temp=1;//检测失败
LCD_ShowString(30,70,200,16,16,"TFTLCD TESTERR");
return temp;
}
 
void LoRa_Init(void)
{
delay_ms(6000);
while(LoRa_Configure())//初始化ATK-LORA-01模块
{
printf("未检测到模块!!!\n\r");
LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");
LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
    printf("检测到模块!!!\n\r");
delay_ms(500);
}
  POINT_COLOR=RED;   
LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");
    printf("检测到模块!!!\n\r");
    delay_ms(500);
    //1.进入配置模式

// LORA_MD0=1; //进入配置模式
delay_ms(40);
uart5_rx(0);//关闭串口接收
Aux_Int(0);//关闭中断

LoRa_CFG.addr = 0x10; // 0x5410
LoRa_CFG.chn = 0x10; //0x20
LoRa_CFG.power = LORA_PW_20Bbm;
LoRa_CFG.wlrate = LORA_RATE_19K2;
LoRa_CFG.wltime = LORA_WLTIME_1S;
LoRa_CFG.mode = LORA_MODE_GEN;
//*注意不同传输方式的选择
LoRa_CFG.mode_sta =LORA_STA_Tran;//LORA_STA_Dire;
LoRa_CFG.bps = LORA_TTLBPS_115200;
LoRa_CFG.parity = LORA_TTLPAR_8N1;
LoRa_Set();
}
 
//Lora模块参数配置
void LoRa_Set(void)
{
u8 sendbuf[20];
u8 lora_addrh,lora_addrl=0;

uart5_set(LORA_TTLBPS_115200,LORA_TTLPAR_8N1);//进入配置模式前设置通信波特率和校验位(115200 8位数据 1位停止 无数据校验)
uart5_rx(1);//开启串口3接收

while(LORA_AUX);//等待模块空闲
LORA_MD0=1; //进入配置模式
delay_ms(40);
Lora_mode=0;//标记"配置模式"

lora_addrh =  (LoRa_CFG.addr>>8)&0xff;
lora_addrl = LoRa_CFG.addr&0xff;

sprintf((char*)sendbuf,"AT ADDR=%02x,%02x",lora_addrh,lora_addrl);//设置设备地址
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT WLRATE=%d,%d",LoRa_CFG.chn,LoRa_CFG.wlrate);//设置信道和空中速率
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT TPOWER=%d",LoRa_CFG.power);//设置发射功率
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT CWMODE=%d",LoRa_CFG.mode);//设置工作模式x
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT TMODE=%d",LoRa_CFG.mode_sta);//设置发送状态
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT WLTIME=%d",LoRa_CFG.wltime);//设置睡眠时间
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT UART=%d,%d",LoRa_CFG.bps,LoRa_CFG.parity);//设置串口波特率、数据校验位
lora_send_cmd(sendbuf,"OK",50);
LORA_MD0=0;//退出配置,进入通信
delay_ms(40);
while(LORA_AUX);//判断是否空闲(模块会重新配置参数)
UART5_RX_STA=0;
Lora_mode=1;//标记"接收模式"
uart5_set(LoRa_CFG.bps,LoRa_CFG.parity);//返回通信,更新通信串口配置(波特率、数据校验位)
Aux_Int(1);//设置LORA_AUX上升沿中断

}
 
u8 Dire_Date[]={0x11,0x22,0x33,0x44,0x55};//定向传输数据
u8 date[30]={0};//定向数组
 
u8 Tran_Data[200]={0};//透传数组
//*这里是定向传输发送地址与目标信道的选择
u32 obj_addr = 0x0014;//记录用户输入目标地址
u8 obj_chn = 0x05;//记录用户输入目标信道
 
u8 wlcd_buff[10]={0}; //LCD显示字符串缓冲区
//Lora模块发送数据
void LoRa_SendData(char* message)
{      
  u16 addr;
u8 chn;
u16 i=0; 
if(LoRa_CFG.mode_sta == LORA_STA_Tran)//透明传输0
{
sprintf((char*)Tran_Data,"%s",message);
u5_printf("%s\r\n",Tran_Data);
printf("Send123:%s\r\n",Tran_Data);//显示发送的数据

}else if(LoRa_CFG.mode_sta == LORA_STA_Dire)//定向传输1
{
addr = (u16)obj_addr;//目标地址
chn = obj_chn;//目标信道

date[i ] =(addr>>8)&0xff;//高位地址
date[i ] = addr&0xff;//低位地址
date[i] = chn;//无线信道
//*发送对应的地址与信道
for(i=0;i<Dire_DateLen;i )//数据写到发送BUFF
{
date[3 i] = Dire_Date[i];
}
for(i=0;i<(Dire_DateLen 3);i )//*发送真正的数据内容
{
while(USART_GetFlagStatus(UART5,USART_FLAG_TC)==RESET);//循环发送,直到发送完毕   
USART_SendData(UART5,date[i]); 
}

        //将十六进制的数据转化为字符串打印在lcd_buff数组
sprintf((char*)wlcd_buff,"%x %x %x %x %x %x %x %x",
date[0],date[1],date[2],date[3],date[4],date[5],date[6],date[7]);
printf("send:%s",wlcd_buff);
    Dire_Date[4] ;//Dire_Date[4]数据更新
}

}
 

u8 rlcd_buff[10]={0}; //LCD显示字符串缓冲区
//Lora模块接收数据
void LoRa_ReceData(void)
{
 
    u16 len=0;
char msg[1024];
//有数据来了
if(UART5_RX_STA&0x8000)
{
printf("已经接收到数据了\r\n");

    while(UART5_RX_BUF[len]!='\0')
{
    msg[len]=UART5_RX_BUF[len];//*直接将接收到的数据存入
  len ;
}
msg[len]='\0';
printf("%s",msg);
UART5_RX_STA=0;

memset((char*)UART5_RX_BUF,0x00,len);//串口接收缓冲区清0
}
 
}
 
 
//LORA_AUX中断服务函数
void EXTI4_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line4))
{  
   if(Int_mode==1)//上升沿(发送:开始发送数据 接收:数据开始输出)     
   {
  if(Lora_mode==1)//接收模式
  {
UART5_RX_STA=0;//数据计数清0
  }
  Int_mode=2;//设置下降沿触发
   }
       else if(Int_mode==2)//下降沿(发送:数据已发送完 接收:数据输出结束)
   {
  if(Lora_mode==1)//接收模式
  {
UART5_RX_STA|=1<<15;//数据计数标记完成
  }else if(Lora_mode==2)//发送模式(串口数据发送完毕)
  {
Lora_mode=1;//进入接收模式
  }
  Int_mode=1;//设置上升沿触发    
   }
     Aux_Int(Int_mode);//重新设置中断边沿
   EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位  
}
}
#include "lora_app.h"
#include "sys.h"//*这个直接用正点原子的
#include "usart3.h"
#include "string.h"
#include "stdio.h"
#include "delay.h"
 #include "lcd.h"
//设备参数初始化(具体设备参数见lora_cfg.h定义)
_LoRa_CFG LoRa_CFG=
{
.addr = LORA_ADDR,       //设备地址
.power = LORA_POWER,     //发射功率
.chn = LORA_CHN,         //信道
.wlrate = LORA_RATE,     //空中速率
.wltime = LORA_WLTIME,   //睡眠时间
.mode = LORA_MODE,       //工作模式
.mode_sta = LORA_STA,    //发送状态
.bps = LORA_TTLBPS ,     //波特率设置
.parity = LORA_TTLPAR    //校验位设置
};
 
//全局参数
EXTI_InitTypeDef EXTI_InitStructure;
NVIC_InitTypeDef NVIC_InitStructure;
 
//设备工作模式(用于记录设备状态)
u8 Lora_mode=0;//0:配置模式 1:接收模式 2:发送模式
//记录中断状态
static u8 Int_mode=0;//0:关闭 1:上升沿 2:下降沿
 
 
//usmart支持部分
//将收到的AT指令应答数据返回给电脑串口
//mode:0,不清零USART3_RX_STA;
//     1,清零USART3_RX_STA;
void lora_at_response(u8 mode)
{
if(UART5_RX_STA&0X8000) //接收到一次数据了

UART5_RX_BUF[UART5_RX_STA&0X7FFF]=0;//添加结束符
printf("%s",UART5_RX_BUF); //发送到串口
if(mode)UART5_RX_STA=0;

}
//lora发送命令后,检测接收到的应答
//str:期待的应答结果
//返回值:0,没有得到期待的应答结果
//其他,期待应答结果的位置(str的位置)
u8* lora_check_cmd(u8 *str)
{
char *strx=0;
if(UART5_RX_STA&0X8000) //接收到一次数据了

UART5_RX_BUF[UART5_RX_STA&0X7FFF]=0;//添加结束符
strx=strstr((const char*)UART5_RX_BUF,(const char*)str);

return (u8*)strx;
}
//lora发送命令
//cmd:发送的命令字符串(不需要添加回车了),当cmd<0XFF的时候,发送数字(比如发送0X1A),大于的时候发送字符串.
//ack:期待的应答结果,如果为空,则表示不需要等待应答
//waittime:等待时间(单位:10ms)
//返回值:0,发送成功(得到了期待的应答结果)
//       1,发送失败
u8 lora_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0; 
UART5_RX_STA=0;
if((u32)cmd<=0XFF)
{
while((UART5->SR&0X40)==0);//等待上一次数据发送完成  
UART5->DR=(u32)cmd;
}else {
u5_printf("%s\r\n",cmd);
}//发送命令

if(ack&&waittime) //需要等待应答
{
   while(--waittime) //等待倒计时
   { 
  delay_ms(10);
  if(UART5_RX_STA&0X8000)//接收到期待的应答结果
  {
  if(lora_check_cmd(ack))break;//得到有效数据 
  UART5_RX_STA=0;
  } 
   }
   if(waittime==0)res=1; 
}
return res;
}
 
 
//AUX中断设置
//mode:配置的模式 0:关闭 1:上升沿 2:下降沿
void Aux_Int(u8 mode)
{
    if(!mode)
{
EXTI_InitStructure.EXTI_LineCmd = DISABLE;//关闭中断
NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE;
}else
{
if(mode==1)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising; //上升沿
    else if(mode==2)
EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Falling;//下降沿

EXTI_InitStructure.EXTI_LineCmd = ENABLE;
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;
}
Int_mode = mode;//记录中断模式
EXTI_Init(&EXTI_InitStructure);
NVIC_Init(&NVIC_InitStructure);  
    
}
 
//LoRa模块初始化
//返回值: 0,检测成功
//        1,检测失败
u8 LoRa_Configure(void)
{
u8 retry=0;
u8 temp=1;

GPIO_InitTypeDef  GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC, ENABLE); //使能PA端口时钟
// RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE); //使能复用功能时钟
 
//     GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable,ENABLE);//禁止JTAG,从而PA15可以做普通IO使用,否则PA15不能做普通IO!!!
//*我的PA15引脚有问题,所以我直接换成PB4了,但注意换的话,要去lora_app.h中去改引脚
// GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;     //LORA_MD0
// GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
// GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
// GPIO_Init(GPIOA, &GPIO_InitStructure);   //推挽输出 ,IO口速度为50MHz

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4; //LORA_AUX
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;      //下拉输入
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOC, &GPIO_InitStructure); //根据设定参数初始化GPIOA.4

GPIO_EXTILineConfig(GPIO_PortSourceGPIOC,GPIO_PinSource4);
 
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //使能PA端口时钟//GPIOA.4
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4;     //LORA_MD0
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure);   //推挽输出 ,IO口速度为50MHz
//*这个对应的是一个上升沿触发的中断,对应于PA4引脚
   EXTI_InitStructure.EXTI_Line=EXTI_Line4;
  EXTI_InitStructure.EXTI_Mode = EXTI_Mode_Interrupt;
  EXTI_InitStructure.EXTI_Trigger = EXTI_Trigger_Rising;  //上升沿触发
  EXTI_InitStructure.EXTI_LineCmd = DISABLE;              //中断线关闭(先关闭后面再打开)
  EXTI_Init(&EXTI_InitStructure);//根据EXTI_InitStruct中指定的参数初始化外设EXTI寄存器

   NVIC_InitStructure.NVIC_IRQChannel = EXTI4_IRQn; //LORA_AUX
  NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 0x02;//抢占优先级2, 
  NVIC_InitStructure.NVIC_IRQChannelSubPriority = 0x03; //子优先级3
  NVIC_InitStructure.NVIC_IRQChannelCmd = DISABLE; //关闭外部中断通道(后面再打开)
    NVIC_Init(&NVIC_InitStructure); 
 
LORA_MD0=0;
LORA_AUX=0;
POINT_COLOR=RED;
LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");
while(LORA_AUX)//确保LORA模块在空闲状态下(LORA_AUX=0)
{
delay_ms(500); 
}
uart5_init(115200);//初始化串口3 
LORA_MD0=1;//进入AT模式
delay_ms(100);
retry=5;
while(retry--)
{
if(!lora_send_cmd("AT","OK",70))
{
LCD_ShowString(30,70,200,16,16,"TFTLCD TESTOK");
temp=0;//检测成功
break;
}
}
if(retry==0) temp=1;//检测失败
LCD_ShowString(30,70,200,16,16,"TFTLCD TESTERR");
return temp;
}
 
void LoRa_Init(void)
{
delay_ms(6000);
while(LoRa_Configure())//初始化ATK-LORA-01模块
{
printf("未检测到模块!!!\n\r");
LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");
LCD_ShowString(30,70,200,16,16,"TFTLCD TEST");
    printf("检测到模块!!!\n\r");
delay_ms(500);
}
  POINT_COLOR=RED;   
LCD_ShowString(30,40,200,24,24,"Mini STM32 ^_^");
    printf("检测到模块!!!\n\r");
    delay_ms(500);
    //1.进入配置模式

// LORA_MD0=1; //进入配置模式
delay_ms(40);
uart5_rx(0);//关闭串口接收
Aux_Int(0);//关闭中断

LoRa_CFG.addr = 0x10; // 0x5410
LoRa_CFG.chn = 0x10; //0x20
LoRa_CFG.power = LORA_PW_20Bbm;
LoRa_CFG.wlrate = LORA_RATE_19K2;
LoRa_CFG.wltime = LORA_WLTIME_1S;
LoRa_CFG.mode = LORA_MODE_GEN;
//*注意不同传输方式的选择
LoRa_CFG.mode_sta =LORA_STA_Tran;//LORA_STA_Dire;
LoRa_CFG.bps = LORA_TTLBPS_115200;
LoRa_CFG.parity = LORA_TTLPAR_8N1;
LoRa_Set();
}
 
//Lora模块参数配置
void LoRa_Set(void)
{
u8 sendbuf[20];
u8 lora_addrh,lora_addrl=0;

uart5_set(LORA_TTLBPS_115200,LORA_TTLPAR_8N1);//进入配置模式前设置通信波特率和校验位(115200 8位数据 1位停止 无数据校验)
uart5_rx(1);//开启串口3接收

while(LORA_AUX);//等待模块空闲
LORA_MD0=1; //进入配置模式
delay_ms(40);
Lora_mode=0;//标记"配置模式"

lora_addrh =  (LoRa_CFG.addr>>8)&0xff;
lora_addrl = LoRa_CFG.addr&0xff;

sprintf((char*)sendbuf,"AT ADDR=%02x,%02x",lora_addrh,lora_addrl);//设置设备地址
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT WLRATE=%d,%d",LoRa_CFG.chn,LoRa_CFG.wlrate);//设置信道和空中速率
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT TPOWER=%d",LoRa_CFG.power);//设置发射功率
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT CWMODE=%d",LoRa_CFG.mode);//设置工作模式x
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT TMODE=%d",LoRa_CFG.mode_sta);//设置发送状态
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT WLTIME=%d",LoRa_CFG.wltime);//设置睡眠时间
lora_send_cmd(sendbuf,"OK",50);

sprintf((char*)sendbuf,"AT UART=%d,%d",LoRa_CFG.bps,LoRa_CFG.parity);//设置串口波特率、数据校验位
lora_send_cmd(sendbuf,"OK",50);
LORA_MD0=0;//退出配置,进入通信
delay_ms(40);
while(LORA_AUX);//判断是否空闲(模块会重新配置参数)
UART5_RX_STA=0;
Lora_mode=1;//标记"接收模式"
uart5_set(LoRa_CFG.bps,LoRa_CFG.parity);//返回通信,更新通信串口配置(波特率、数据校验位)
Aux_Int(1);//设置LORA_AUX上升沿中断

}
 
u8 Dire_Date[]={0x11,0x22,0x33,0x44,0x55};//定向传输数据
u8 date[30]={0};//定向数组
 
u8 Tran_Data[200]={0};//透传数组
//*这里是定向传输发送地址与目标信道的选择
u32 obj_addr = 0x0014;//记录用户输入目标地址
u8 obj_chn = 0x05;//记录用户输入目标信道
 
u8 wlcd_buff[10]={0}; //LCD显示字符串缓冲区
//Lora模块发送数据
void LoRa_SendData(char* message)
{      
  u16 addr;
u8 chn;
u16 i=0; 
if(LoRa_CFG.mode_sta == LORA_STA_Tran)//透明传输0
{
sprintf((char*)Tran_Data,"%s",message);
u5_printf("%s\r\n",Tran_Data);
printf("Send123:%s\r\n",Tran_Data);//显示发送的数据

}else if(LoRa_CFG.mode_sta == LORA_STA_Dire)//定向传输1
{
addr = (u16)obj_addr;//目标地址
chn = obj_chn;//目标信道

date[i ] =(addr>>8)&0xff;//高位地址
date[i ] = addr&0xff;//低位地址
date[i] = chn;//无线信道
//*发送对应的地址与信道
for(i=0;i<Dire_DateLen;i )//数据写到发送BUFF
{
date[3 i] = Dire_Date[i];
}
for(i=0;i<(Dire_DateLen 3);i )//*发送真正的数据内容
{
while(USART_GetFlagStatus(UART5,USART_FLAG_TC)==RESET);//循环发送,直到发送完毕   
USART_SendData(UART5,date[i]); 
}

        //将十六进制的数据转化为字符串打印在lcd_buff数组
sprintf((char*)wlcd_buff,"%x %x %x %x %x %x %x %x",
date[0],date[1],date[2],date[3],date[4],date[5],date[6],date[7]);
printf("send:%s",wlcd_buff);
    Dire_Date[4] ;//Dire_Date[4]数据更新
}

}
 

u8 rlcd_buff[10]={0}; //LCD显示字符串缓冲区
//Lora模块接收数据
void LoRa_ReceData(void)
{
 
    u16 len=0;
char msg[1024];
//有数据来了
if(UART5_RX_STA&0x8000)
{
printf("已经接收到数据了\r\n");

    while(UART5_RX_BUF[len]!='\0')
{
    msg[len]=UART5_RX_BUF[len];//*直接将接收到的数据存入
  len ;
}
msg[len]='\0';
printf("%s",msg);
UART5_RX_STA=0;

memset((char*)UART5_RX_BUF,0x00,len);//串口接收缓冲区清0
}
 
}
 
 
//LORA_AUX中断服务函数
void EXTI4_IRQHandler(void)
{
    if(EXTI_GetITStatus(EXTI_Line4))
{  
   if(Int_mode==1)//上升沿(发送:开始发送数据 接收:数据开始输出)     
   {
  if(Lora_mode==1)//接收模式
  {
UART5_RX_STA=0;//数据计数清0
  }
  Int_mode=2;//设置下降沿触发
   }
       else if(Int_mode==2)//下降沿(发送:数据已发送完 接收:数据输出结束)
   {
  if(Lora_mode==1)//接收模式
  {
UART5_RX_STA|=1<<15;//数据计数标记完成
  }else if(Lora_mode==2)//发送模式(串口数据发送完毕)
  {
Lora_mode=1;//进入接收模式
  }
  Int_mode=1;//设置上升沿触发    
   }
     Aux_Int(Int_mode);//重新设置中断边沿
   EXTI_ClearITPendingBit(EXTI_Line4); //清除LINE4上的中断标志位  
}
}


标签: LORA

实例下载地址

LORA(嵌入式源码)

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警