实例介绍
#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
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论