参考的原子哥的例程,谢谢原子哥,你真伟大。佩服!!!
他们都是 比较牛的人,就是把自己会的毫无保留的分享给后辈学习。
代码是先.c 文件 后.h文件。
注意其中的的IO 口配置。
我亲自测试通过,接收可以收到准确的信息。
KEIL 4 编译通过,keil5 编译通过。
有错误一定给说说,我好进步谢谢。
#include “sys.h”
#include “usart.h”
#include “delay.h”
#include “lora.h”
int main(void)
{
u8 suk;
Stm32_Clock_Init(9); //系统时钟设置
delay_init(72); //延时初始化
uart_init(72,115200); //串口初始化为9600
printf(“开始 Lora 无线测试\r\n”);
suk = LoRa_Init();
while(LoRa_Init())
{
delay_ms(300);
printf("\r\n 初始化 不成功 \r\n");
}
printf("\r\n 初始化 成功 \r\n");
printf("初始化 LoRa_Init = %d\r\n",suk);
printf("\r\n 配置 lora 模块 \r\n");
LoRa_Set(); //lora 配置 设置串口波特率
while(1)
{
delay_ms(1000);
printf("Lora 正在 发送 数据 \r\n");
if(!LORA_AUX&&(LoRa_CFG.mode!=LORA_MODE_SLEEP))//空闲且非省电模式
{
LoRa_SendData();//发送数据
}
//数据接收
//LoRa_ReceData();
}
}
#include “lora.h”
#include “stdarg.h”
#include “stdio.h”
#include “string.h”
#include “sys.h”
#include “usart.h”
#include “delay.h”
#include “usart2.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 //校验位设置
};
/**********************************
//将1个字符转换为16进制数字
//chr:字符,09/AF/a~F
//返回值:chr对应的16进制数值
***********************************/
u8 chr2hex(u8 chr)
{
if(chr>=‘0’&&chr<=‘9’)return chr-‘0’;
if(chr>=‘A’&&chr<=‘F’)return (chr-‘A’+10);
if(chr>=‘a’&&chr<=‘f’)return (chr-‘a’+10);
return 0;
}
/*******************************
//字符转成16进制数据
//test[] 存储位置
//buffer[] 需转换的数组
//len: 长度
*********************************/
void char2hex_buff(u8 test[],u8 buff[],u8 len)
{
u8 i=0;
for(i=0;i<len;i++)
{
test[i] = chr2hex(buff[i]);
}
}
/****************************
//将16进制数据转换成数字
******************************/
u32 hexbuff_num(u8 test[],u8 buff[],u8 len)
{
u8 i=0;
u32 num=0;
for(i=0;i<len;i++) test[i] = chr2hex(buff[i]);
if(len==5) num = test[0]*10000+test[1]*1000+test[2]*100+test[3]*10+test[4];
else if(len==4) num = test[0]*1000+test[1]*100+test[2]*10+test[3];
else if(len==3) num = test[0]*100+test[1]*10+test[2];
else if(len==2) num = test[0]*10+test[1];
else if(len==1) num = test[0];
return num;
}
/***********************
//计算数字位数
//如:100,3位数、10,1位数
***************************/
u8 num_count(u32 num)
{
u32 date=0;
u8 count=0;
date = num;
do
{
count++;
date/=10;
}while(date>0);
return count;
}
/**************************************
LoRa 发送命令后,检测接收到的应答
str:期待的应答结果
返回值: 0, 没有得到期待的应答结果
其他,期待应答结果的位置(str的位置)
*****************************************/
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;
}
/*****************
strx=strstr((const char*)USART2_RX_BUF,(const char*)str);
strstr(str1,str2);
函数用于判断字符串str2 是否是str1 的子串
如果 是 则该函数返回str2 在str1 中首次出现的地址;
否 返回NULL
*******************/
/***********************************
LoRa 发送命令:
cmd 发送的命令字符串 不需要添加回车
当cmd<0xff发送数字 大于发送字符串
ack 期待的应答结果 如果为空 则表示不需要等待应答
waitime 等待时间 单位是10ms
返回: 0 发送成功
1 发送失败
****************************************/
u8 lora_send_cmd(u8 *cmd,u8 *ack,u16 waittime)
{
u8 res=0;
USART2_RX_STA=0; //接收置 0
if((u32)cmd<=0XFF) //发送数字
{
while((USART2->SR&0x40)=