具体数据手册细节可以看他们官网
本文配置的是点对点通讯模式
LoRa天线一般都有其支持的频段范围,若在频段外使用,天线性能会有一定程度的下降。因此使用时,应尽量使设备工作在天线支持的频段内,以求达到最好的传输效果。
最最最重要的一点 模块使用的信道的频段一定要和天线的频段一致否则会导致实际通讯距离与理论通讯距离相差甚远!!
值得注意的是 点对点收发数据和透传收发数据 相互发数据的两个模块都得配置在在同一信道,不然收发会失败的哈!!!
另外发送AT指令的时候 切记不能发多了 比如你的AT指令是 “AT+CH=1234\r\n” 如果 \r\n 后面还有数据,比如空格或者其他数据则会导致AT指令识别不出来。
话不多说直接上代码
user_lora.h
#ifndef USER_LORA_H
#define USER_LORA_H
#include "main.h"
#define MAX_TT_COUNT 240 //有人 的模块最大只支持240个字节同时发送,多了就会分包了 切记
typedef enum
{
LORA1 = 0,
LORA2,
}ModChoose;
typedef struct
{
uint8_t ADDH;
uint8_t ADDL;
uint8_t CHANEL;
uint8_t tt_buff[MAX_TT_COUNT];
}TT_buff;//数据包
void usrLoraAT_Init(void);
uint16_t bufferSizeCalc(uint8_t *buff,uint8_t size);
HAL_StatusTypeDef BT_LoraTransmit(ModChoose mod, uint16_t addres,uint8_t chanel, uint8_t *data,uint8_t length );
#endif
user_lora.c
#include "user_lora.h"
#include "main.h"
#include "string.h"
#include "stdio.h"
#include "usart.h"
uint8_t AT_Buff[30];
uint8_t AT_LENGTH = 0;
//lora模块的AT指令初始化
void usrLoraAT_Init(void)
{
uint16_t temp = 0;
temp = 10;// 0-65535
HAL_GPIO_WritePin(MD11_GPIO_Port, MD11_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(MD10_GPIO_Port, MD10_Pin, GPIO_PIN_RESET);
HAL_Delay(3500);
HAL_GPIO_WritePin(MD10_GPIO_Port, MD10_Pin, GPIO_PIN_SET);
HAL_Delay(3500);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"+++");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 3);//串口1
HAL_Delay(20);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"a");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 1);//串口1
HAL_Delay(20);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"AT+WMODE=FP\r\n");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 13);//串口1
HAL_Delay(200);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"AT+PMODE=RUN\r\n");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 14);//串口1
HAL_Delay(200);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"AT+UART=115200,8,1,NONE,NFC\r\n");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 29);//串口1
HAL_Delay(200);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"AT+SPD=2\r\n");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 10);//串口1
HAL_Delay(900);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char *)AT_Buff,"AT+CH=%d\r\n",127);//初始化信道
AT_LENGTH = bufferSizeCalc((uint8_t *)&AT_Buff,sizeof(AT_Buff));
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff,AT_LENGTH);//串口1
AT_LENGTH = 0;
HAL_Delay(200);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"AT+FEC=OFF\r\n");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 12);//串口1
HAL_Delay(200);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"AT+PWR=20\r\n");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 11);//串口1
HAL_Delay(200);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"AT+ADDR=%d\r\n",temp);//初始化ID
AT_LENGTH = bufferSizeCalc((uint8_t *)&AT_Buff,sizeof(AT_Buff));
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, AT_LENGTH);//串口1
HAL_Delay(1200);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
sprintf((char*)AT_Buff,"AT+Z\r\n");
HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&AT_Buff, 6);//串口1
HAL_Delay(200);
memset((uint8_t *)&AT_Buff,0,sizeof(AT_Buff));
}
//次函数用于计算AT指令的数据长度 方便串口能正确发送数据
uint16_t bufferSizeCalc(uint8_t *buff,uint8_t size)
{
uint8_t i;
uint16_t length = 0;
uint8_t temp;
for(i = 0; i < size; i++)
{
temp = *buff;
if(temp != 0x00)
length ++;
else
break;
buff ++;
}
return length;
}
//点对点定向传输
HAL_StatusTypeDef BT_LoraTransmit(ModChoose mod, uint16_t addres,uint8_t chanel, uint8_t *data,uint8_t length )
{
memset((uint8_t *)&bt_buff,0,sizeof(bt_buff));
bt_buff.ADDH = (uint8_t)(addres>>8);
bt_buff.ADDL = (uint8_t)addres;
bt_buff.CHANEL = chanel;
memcpy((uint8_t *)&bt_buff.tt_buff,(uint8_t *)data,length);
switch(mod)
{
case LORA1: HAL_UART_Transmit_DMA(&huart1, (uint8_t *)&bt_buff, (length+3));
break;
case LORA2: HAL_UART_Transmit_DMA(&huart2, (uint8_t *)&bt_buff, (length+3));//
break;
default:
break;
}
return HAL_OK;
}
这里使用的是串口DMA发送方式,用普通HAL_UART_Transmit_IT()或者HAL_UART_Transmit(),操作效果都是一样的,如果对DMA串口发送感兴趣的小伙伴可以查看串口DMA接收不定长数据按照这个流程配置下来也是一样的能使用DMA串口发送数据了。
举个栗子:
main.c 中
#include "user_lora.h"
#include "main.h"
#include "usart.h"
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration--------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_DMA_Init();
MX_USART1_UART_Init();
MX_USART2_UART_Init();
usrLoraAT_Init();
uint16_t address = 15;
uint8_t channel = 127;
uint8_t testarray[13]="hello world\r\n";
while(1)
{
BT_LoraTransmit(LORA1 ,address,channel,(uint8_t *)&testarray,sizeof(testarray));
HAL_Delay(2000);
}
}
这样你的另外一个信道为127 地址为15的 lora模块就会亲切的收到 "hello world“
对你有用记得点赞哟