目录
一、ATK-LORA-01无线串口资料
二、代码移植
1.分析
(1)usart3(也可以是其他的串口)用于接收数据的串口
usart.h
(2)time3(也可以是其他的定时器)用于时序的设置
(3)lora.c
三、演示
1.主机(发送方)
(1)主机接线
(2)主机代码(发送方)
(3)主机实物
?插上无线串口通电即可发送?
?2.从机(接收方)
(1)从机接线(LORA与主机相同)
?(2)从机代码(接收方)
(3)从机实物
接上TTL和LORA并通电即可用
??
?3.串口显示结果(从机串口1接的串口助手)
?4.注意
(1)接收数据的函数与发送数据的函数不能同时烧录,只能实现接收和发送二者之一的功能,若要在接收的基础上返送可以写一个按键扫描,当按键按下发送,没按下一直处于接收状态,此时就可以同时存在,但是不能连续发送(可能还得优化!)。
?(2)发送时必须有延时函数,不然接收会出现乱码!
一、ATK-LORA-01无线串口资料
该资料为正点原子提供的资料,也可以去正点原子的官网下载资料,这里只是方便大家资料提取
链接:https://pan.baidu.com/s/11WQbh1tCQIu54zZDEiqmew? 提取码:tsy6? --来自百度网盘超级会员V4的分享
本人自己移植后的工程:
链接:https://pan.baidu.com/s/15S6a3le2xYR56GH5qRscDg? 提取码:tsy6? --来自百度网盘超级会员V4的分享
二、代码移植
1.分析
移植前首先需要创建的片上外设为:
(1)usart3(也可以是其他的串口)用于接收数据的串口
usart3.c
/****************
1、串口时钟、GPIOA时钟使能
2、GPIOA端口模式设置
3、串口参数初始化
4、开启中断并且初始化NVIC
5、使能串口
6、编写中断处理函数
******************/
#include "sys.h" //包含需要的头文件
extern u8 Lora_mode;
//串口接收缓存区
u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN个字节.
u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节
//通过判断接收连续2个字符之间的时间差不大于10ms来决定是不是一次连续的数据.
//如果2个字符接收间隔超过timer,则认为不是1次连续数据.也就是超过timer没有接收到
//任何数据,则表示此次接收完毕.
//接收到的数据状态
//[15]:0,没有接收到数据;1,接收到了一批数据.
//[14:0]:接收到的数据长度
vu16 USART3_RX_STA=0;
void USART3_IRQHandler(void)
{
u8 res;
if(USART_GetITStatus(USART3, USART_IT_RXNE) != RESET)//接收到数据
{
res =USART_ReceiveData(USART3);
if((USART3_RX_STA&(1<<15))==0) //接收完的一批数据,还没有被处理,则不再接收其他数据
{
if(USART3_RX_STA<USART3_MAX_RECV_LEN) //还可以接收数据
{
if(!Lora_mode)//配置功能下(启动定时器超时)
{
TIM_SetCounter(TIM7,0); //计数器清空
if(USART3_RX_STA==0) //使能定时器7的中断
{
TIM_Cmd(TIM7,ENABLE); //使能定时器7
}
}
USART3_RX_BUF[USART3_RX_STA++]=res; //记录接收到的值
}else
{
USART3_RX_STA|=1<<15; //强制标记接收完成
}
}
}
}
USART_InitTypeDef USART_InitStructure;
//初始化IO 串口3
//pclk1:PCLK1时钟频率(Mhz)
//bound:波特率
void usart3_init(u32 bound)
{
NVIC_InitTypeDef NVIC_InitStructure;
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE); // GPIOB时钟
RCC_APB1PeriphClockCmd(RCC_APB1Periph_USART3,ENABLE); //串口3时钟使能
USART_DeInit(USART3); //复位串口3
//USART3_TX PB10
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10; //PB10
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP; //复用推挽输出
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB10
//USART3_RX PB11
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_11;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING; //浮空输入
GPIO_Init(GPIOB, &GPIO_InitStructure); //初始化PB11
USART_InitStructure.USART_BaudRate = bound; //波特率一般设置为9600;
USART_InitStructure.USART_WordLength = USART_WordLength_8b; //字长为8位数据格式
USART_InitStructure.USART_StopBits = USART_StopBits_1; //一个停止位
USART_InitStructure.USART_Parity = USART_Parity_No; //无奇偶校验位
USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//无硬件数据流控制
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx; //收发模式
USART_Init(USART3, &USART_InitStructure); //初始化串口3
USART_Cmd(USART3, ENABLE); //使能串口
//使能接收中断
USART_ITConfig(USART3, USART_IT_RXNE, ENABLE);//开启中断
//设置中断优先级
NVIC_InitStructure.NVIC_IRQChannel = USART3_IRQn;
NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=2 ;//抢占优先级3
NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3; //子优先级3
NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE; //IRQ通道使能
NVIC_Init(&NVIC_InitStructure); //根据指定的参数初始化VIC寄存器
TIM3_Init(99,7199); //10ms中断
USART3_RX_STA=0; //清零
TIM_Cmd(TIM3,DISABLE); //关闭定时器7
}
//串口3,printf 函数
//确保一次发送数据不超过USART3_MAX_SEND_LEN字节
void u3_printf(char* fmt,...)
{
u16 i,j;
va_list ap;
va_start(ap,fmt);
vsprintf((char*)USART3_TX_BUF,fmt,ap);
va_end(ap);
i=strlen((const char*)USART3_TX_BUF); //此次发送数据的长度
for(j=0;j<i;j++) //循环发送数据
{
while(USART_GetFlagStatus(USART3,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕
USART_SendData(USART3,USART3_TX_BUF[j]);
}
}
//串口接收使能控制
//enable:0,关闭 1,打开
void usart3_rx(u8 enable)
{
USART_Cmd(USART3, DISABLE); //失能串口
if(enable)
{
USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;//收发模式
}else
{
USART_InitStructure.USART_Mode = USART_Mode_Tx;//只发送
}
USART_Init(USART3, &USART_InitStructure); //初始化串口3
USART_Cmd(USART3, ENABLE); //使能串口
}
usart.h
#ifndef __USART3_H
#define __USART3_H
#include "sys.h"
#define USART3_MAX_RECV_LEN 1024 //最大接收缓存字节数
#define USART3_MAX_SEND_LEN 600 //最大发送缓存字节数
#define USART3_RX_EN 1 //0,不接收;1,接收.
extern u8 USART3_RX_BUF[USART3_MAX_RECV_LEN]; //接收缓冲,最大USART3_MAX_RECV_LEN字节
extern u8 USART3_TX_BUF[USART3_MAX_SEND_LEN]; //发送缓冲,最大USART3_MAX_SEND_LEN字节
extern vu16 USART3_RX_STA; //接收数据状态
void usart3_init(u32 bound); //串口2初始化
void usart3_set(u8 bps,u8 parity);
void usart3_rx(u8 enable);
void u3_printf(char* fmt,...);
#endif
(2)time3(也可以是其他的定时器)用于时序的设置
time3的中断服务函数需要添加如下:
(3)lora.c
发送数据(相当的简单)
????????发送什么数据调sprintf()就完了注意:这里的temp[100],是为sprintf()发送字符串创造一个空间,temp数组的长度可以根据发送数据的长度来定。
接收数据(相当好用)
三、演示
1.主机(发送方)
(1)主机接线
(2)主机代码(发送方)
(3)主机实物
?插上无线串口通电即可发送
?2.从机(接收方)
(1)从机接线(LORA与主机相同)
TTL转USP接线
?(2)从机代码(接收方)
(3)从机实物
接上TTL和LORA并通电即可用
?
?3.串口显示结果(从机串口1接的串口助手)
?4.注意
(1)接收数据的函数与发送数据的函数不能同时烧录,只能实现接收和发送二者之一的功能,若要在接收的基础上返送可以写一个按键扫描,当按键按下发送,没按下一直处于接收状态,此时就可以同时存在,但是不能连续发送(可能还得优化!)。
如下:
?(2)发送时必须有延时函数,不然接收会出现乱码!
|