基于LoRa的有人物联网USR-LG210与WH-L101-L的轮询的stm32初始化
然后我使用的是数据唤醒,接收到lora后Lora_Flag标志位置1 ,单片机就可以把数据发送出去,当没置1的时候可以先用一个队列存储要发送的数据。轮询是指210会在配置的时间内轮流询问每个101节点,如果有数据需要上报,就会将该次数据传输至网关再到配置的服务器(也可以选择发送到有人的云平台)。现在可以回到初始化函数,以下是初始化函数里面函数的内容,第一步是唤醒;指令,以下是101节点初始化配置的
LG210(以下简称210)和WH-L101-L(以下简称101)是基于LoRa进行通讯的、功能非常强大,无论是使用210进行组网通讯还是101的点对点通信。这两者可以使用上位机先进行配置测试,具体上位机的使用下载和其他功能可以看以下网站产品手册,本次只讲解一下210和101轮询主动上报。
轮询是指210会在配置的时间内轮流询问每个101节点,如果有数据需要上报,就会将该次数据传输至网关再到配置的服务器(也可以选择发送到有人的云平台)。关于上位机配置210和101的具体操作可以参考这个USR-LG210和WH-L101-L-H20 节点主动上报模式+节点低功耗配置案例-济南有人物联网技术有限公司官网
配置使用的是at指令,以下是101节点初始化配置的代码,接下来会对以下函数逐个分析,一些常见的初始化函数就不赘述了,你们一定会觉得太简单了啰嗦的。
/******Lora初始化**********/
void Lora_Init(void)
{
Lora_Res_Config();//需要配置一个复位引脚每次进入at模式需要下拉20ms
Lora_Uart_Config();//这个是对单片机串口的初始化
GPIO_ResetBits(LORA_RES_GPIO_PORT,LORA_RES_PIN);//拉低20ms复位
Delay_ms(20);
GPIO_SetBits(LORA_RES_GPIO_PORT,LORA_RES_PIN);//20ms后拉高
Lora_Wakeup();//发送唤醒的at指令
Lora_EnterAT();//进入AT模式
Lora_GetID();//获取该节点ID,增强适配性
Lora_SetAT();//进行模式配置
Lora_NID[8] = '\0';//去除NID的\n,如果后续不使用到节点id的话这行可以删去
}
以下是at指定发送命令的函数,这个是初始化的核心函数
/**
* @brief 发送AT指令
* @param cmd:发送的命令,reply:发送成功返回的命令,wait:等待的时间
* @retval 返回1发送成功,0失败
*/
int Lora_SendCmd(char* cmd, char* reply, int wait)
{
Lora_Clear_Struct();//清理缓冲区
printf("[Lora_SendCmd] %s", cmd);//debug串口显示发送的命令
Lora_Send_buff((char*)cmd, strlen(cmd));//发送at指令字符串
Delay_ms(wait);
if (strcmp(reply, "") == 0)//如果没有设置需接收的内容
{
return 0;
}
if (Lora_Struct.USART_Length != 0)//如果接收到内容
{
Lora_Struct.USART_BUFF[Lora_Struct.USART_Length] = '\0';//添加结束
if (strstr((char*)Lora_Struct.USART_BUFF, reply))//如果不相等
{
printf("return:%s\n", Lora_Struct.USART_BUFF);
return 1;
}
else
{
printf("return:%s\n", Lora_Struct.USART_BUFF);、如果相等
return 0;
}
}
return 0;
}
上面提到了接收就需要编辑一下LORA的串口接收中断,接收缓存区和相关函数 。然后我使用的是数据唤醒,接收到lora后Lora_Flag标志位置1 ,单片机就可以把数据发送出去,当没置1的时候可以先用一个队列存储要发送的数据。
/*接收缓存*/
typedef struct Lora_Usart {
char USART_BUFF[200];
int USART_Length;
}Lora_Usart;
Lora_Usart Lora_Struct;
char Lora_Flag;//接收到唤醒指令Lora置1
/******清除接收缓冲区**********/
void Lora_Clear_Struct(void)
{
memset(Lora_Struct.USART_BUFF,0,Lora_Struct.USART_Length);
Lora_Struct.USART_Length=0;
}
/******接收中断**********/
void LORA_UART_IRQHandler(void)
{
uint8_t ch;
if(USART_GetITStatus(LORA_UART,USART_IT_RXNE) != RESET)
{
USART_ClearITPendingBit(LORA_UART,USART_IT_RXNE);
ch = USART_ReceiveData(LORA_UART);
Lora_Struct.USART_BUFF[Lora_Struct.USART_Length++] = ch;//放入缓冲区
//Usart_SendByte(DEBUG_USART,Lora_Struct.USART_BUFF[Lora_Struct.USART_Length-1]);//用于调试查看
}
if(USART_GetITStatus(LORA_UART,USART_IT_IDLE) != SET)
{
if (strcmp(Lora_Struct.USART_BUFF, "Lora") == 0)//是否为唤醒指令
{
Lora_Clear_Struct();//清除接收缓冲
Lora_Flag=1;//成功唤醒配合其他标志可发送
}
USART_ClearITPendingBit(LORA_UART,USART_IT_IDLE);
}
}
现在可以回到初始化函数,以下是初始化函数里面函数的内容,第一步是唤醒;第二部是进入id配置模式;第三步是获取节点id用于配置,这样可以增加同一网关不同节点的代码通用性
/****唤醒******/
void Lora_Wakeup(void)
{
Lora_SendCmd("Lora\n","LoRa Start!",300);
}
/****进入AT******/
void Lora_EnterAT(void)
{
int ret = 0;
ret=Lora_SendCmd("+++","a",300);
if(ret==1)
ret=Lora_SendCmd("a","+OK",50);
if(ret==1)
Lora_SendCmd("AT+E=OFF\n","OK",300);
}
/****获取ID******/
void Lora_GetID(void)
{
int ret = 0;
ret=Lora_SendCmd("AT+NID?\n","+NID",300);
if(ret==1)
{
strncpy(Lora_NID,&(Lora_Struct.USART_BUFF[7]),9);
}
strcpy(Lora_SetNID,"AT+NID=");
strcat(Lora_SetNID,Lora_NID);
}
/****配置******/
void Lora_SetAT(void)
{
int ret = 0;
ret=Lora_SendCmd("AT+E=OFF\r\n","OK",300);//关闭回显
if(ret==1)
ret=Lora_SendCmd(Lora_SetNID,"OK",300);//设置节点id
if(ret==1)
ret=Lora_SendCmd("AT+LORAPROT=LG210\r\n","OK",300);//设置210协议
if(ret==1)
ret=Lora_SendCmd("AT+WMODE=NET\r\n","OK",300);//设置组网
if(ret==1)
ret=Lora_SendCmd("AT+GWID=20866974\r\n","OK",300);//设置连接的网关
if(ret==1)
ret=Lora_SendCmd("AT+FEC=OFF\r\n","OK",300);//关闭前向纠错功能
if(ret==1)
ret=Lora_SendCmd("AT+PNUM=0\r\n","OK",300);//设置通信端口号为0
if(ret==1)
ret=Lora_SendCmd("AT+SPD1=7\r\n","OK",300);//设置速率等级1为7
if(ret==1)
ret=Lora_SendCmd("AT+SPD2=8\r\n","OK",300);//设置速率等级2为8
if(ret==1)
ret=Lora_SendCmd("AT+CH1=4700\r\n","OK",300);//配置信道1频率为4700MHz
if(ret==1)
ret=Lora_SendCmd("AT+CH2=4800\r\n","OK",300);//配置信道1频率为4800MHz
if(ret==1)
ret=Lora_SendCmd("AT+PWR=22\r\n","OK",300);//设置发射功率为22dBm
if(ret==1)
ret=Lora_SendCmd("AT+CAD=OFF\r\n","OK",300);//关闭信道活动检测
if(ret==1)
ret=Lora_SendCmd("AT+MCU=Lora,ascii\r\n","OK",300);//设置唤醒指令为ascii的Lora
if(ret==1)
ret=Lora_SendCmd("AT+MFLAG=ON\r\n","OK",300);//启用消息标志位
if(ret==1)
ret=Lora_SendCmd("AT+UARTFT=10\r\n","OK",300);//设置UART帧超时时间为10ms
if(ret==1)
ret=Lora_SendCmd("AT+UART=115200,8,1,NONE,NFC\r\n","OK",300);//配置串口参数:115200波特率,8数据位,1停止位,无校验,无流控
if(ret==1)
ret=Lora_SendCmd("AT+Z\r\n","OK",300);//执行软重启
// if(ret==1)
// ret=Lora_SendCmd("[TX]:AT+ENTM\r\n","OK",300);
memset(Lora_Struct.USART_BUFF,0,50);
Lora_Struct.USART_Length=0;
}
如果顺利运行了以上代码就代表初始化完成了
更多推荐



所有评论(0)