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;
}

如果顺利运行了以上代码就代表初始化完成了

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐