stm32Hal库配置有人Lora模块初始化笔记 WH-L102 无线通讯模块

具体数据手册细节可以看他们官网
本文配置的是点对点通讯模式

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“

对你有用记得点赞哟

  • 7
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
上述211行附近的代码如下,请具体指出问题 def build_targets(self, p, targets): # Build targets for compute_loss(), input targets(image,class,x,y,w,h) na, nt = self.na, targets.shape[0] # number of anchors, targets tcls, tbox, indices, anch = [], [], [], [] gain = torch.ones(7, device=targets.device) # normalized to gridspace gain ai = torch.arange(na, device=targets.device).float().view(na, 1).repeat(1, nt) # same as .repeat_interleave(nt) targets = torch.cat((targets.repeat(na, 1, 1), ai[:, :, None]), 2) # append anchor indices g = 0.5 # bias off = torch.tensor([[0, 0], [1, 0], [0, 1], [-1, 0], [0, -1], # j,k,l,m # [1, 1], [1, -1], [-1, 1], [-1, -1], # jk,jm,lk,lm ], device=targets.device).float() * g # offsets for i in range(self.nl): anchors = self.anchors[i] gain[2:6] = torch.tensor(p[i].shape)[[3, 2, 3, 2]] # xyxy gain # Match targets to anchors t = targets * gain if nt: # Matches r = t[:, :, 4:6] / anchors[:, None] # wh ratio j = torch.max(r, 1. / r).max(2)[0] < self.hyp['anchor_t'] # compare # j = wh_iou(anchors, t[:, 4:6]) > model.hyp['iou_t'] # iou(3,n)=wh_iou(anchors(3,2), gwh(n,2)) t = t[j] # filter # Offsets gxy = t[:, 2:4] # grid xy gxi = gain[[2, 3]] - gxy # inverse j, k = ((gxy % 1. < g) & (gxy > 1.)).T l, m = ((gxi % 1. < g) & (gxi > 1.)).T j = torch.stack((torch.ones_like(j), j, k, l, m)) t = t.repeat((5, 1, 1))[j] offsets = (torch.zeros_like(gxy)[None] + off[:, None])[j] else: t = targets[0] offsets = 0 # Define b, c = t[:, :2].long().T # image, class gxy = t[:, 2:4] # grid xy gwh = t[:, 4:6] # grid wh gij = (gxy - offsets).long() gi, gj = gij.T # grid xy indices # Append a = t[:, 6].long() # anchor indices indices.append((b, a, gj.clamp_(0, gain[3] - 1), gi.clamp_(0, gain[2] - 1))) # image, anchor, grid indices tbox.append(torch.cat((gxy - gij, gwh), 1)) # box anch.append(anchors[a]) # anchors tcls.append(c) # class return tcls, tbox, indices, anch
07-17

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值