使用DL-22发送数据

一、DL-22简介


DL-22无线串口模块为串口转2.4G无线模块,可以通过无线将两个或者多个串口连接起来。串口发入模块的数据会被模块使用无线发出,收到无线数据的模块会将这个数据使用串口发出,在两个设备上使用模块就像将这两个设备用串口连接起来一样。

1. 主要特点

点对点传输带有确认,数据丢失率为0.00%。
支持串口不间断发送。
支持串口双向同时收发。
最高可达3300字节每秒的传输速率。
适应2.8V~3.5V。
使用单个按键进行设置,可以修改模块的信道、波特率。
按键可配置为多对多模式。

2. 模块实图


3. 模式说明

DL-22模块可以配置为点对点模式和广播模式使用。
点对点模式分为A端和B端,A端串口收到的数据会被B端串口发出,反之亦然。此模式下同一频道只准许两个节点互相通信,通信可保证数据丢失率为0.00%。
广播模式下,一个节点的串口收到的数据会从所有距离可及,且频道相同的节点收到,并从串口发出。
在对模块进行配置时,可以将同一个信道的两个模块配置为点对点A端和点对点B端,以获得О数据丢失的功能;或者将多个模块全部配置为广播模式,以获得多对多通信的功能。除此之外的通信模式都是不可用的。


4. 产品参数


二、模块配置

DL-22模块配置分5个步骤︰

进入设置模式
设置波特率
设置频道
设置主/从机
确认设置
第一步-进入设置模式
在模块断电的情况下按下按键不松手,然后给模块供电,模块的四个LED会不断循环闪烁,此时释放按键,LED循环闪烁会停止,即进入设置模式。

第二步-设置波特率
完成第一步后,模块会使用LED指示当前的波特率,短按按键可以切换波特率。点亮的LED和波特率的对应关系如下表:

第三步–设置频道
在设置波特率完成后,长按按键直到LED循环闪烁,释放按键后可进入频道设置阶段。
在此阶段,点亮的LED会快速闪烁,代表选中一个频道。短按按键可以切换到下一个频道。本模块提供16个频道,分别对应四个LED的16种状态(包括全部LED熄灭)。如果您只有两个模块,可以先将第-个模块的频道设置为任意状态,然后记下闪烁LED的位置,在设置第二个模块时将LED设置成和上一个相同即可。只要频道相同,波特率不同的两个模块也可以互相通信。

第四步–设置模式
在设置频道完成后,长按按键直到LED循环闪烁,可进入模式设置阶段。
在此阶段,点亮的LED会缓慢的闪烁。短按按键,LED会在三种模式之间切换。

 

第五步–确认设置
在模式设置完成后,长按按键直到LED循环闪烁,释放按键后所有LED常亮2秒钟,之后会进入正常工作模式,刚刚配置的内容即可保存并生效。如果不希望刚刚的设置生效,则可给模块断电。在确认设置前的任何阶段给模块断电,设置的信息都不会被保存。

三、代码

代码功能:代码将温湿度传感器dht11检测的数据通过Zigbee上传到电脑,再通过串口接收助手将数据显示出来

main.c

#include "stm32f10x.h"                  // Device header
#include "Delay.h"
#include "OLED.h"
#include "Serial.h"
#include "dht11.h"


uint8_t RX_Data;
extern  unsigned int rec_data[4];
int main(void)
{
	OLED_Init();


USART1_Init();
 while(1)
    {
			
	   	DHT11_REC_Data();
			OLED_ShowString(1, 1, "temp:");
			OLED_ShowNum(2, 1, rec_data[2],3);
			OLED_ShowChar(2,4,'.');
			OLED_ShowNum(2, 5, rec_data[3],1);
		  OLED_ShowString(3, 1, "humi:");
			OLED_ShowNum(4, 1, rec_data[0],3);
			OLED_ShowChar(4,4,'.');
			OLED_ShowNum(4, 5, rec_data[1],1);
			
		  Serial_SendString("温度:");
			Serial_Printf("%d.%d%d",rec_data[2],rec_data[3]);
			
		
			Serial_SendString("     ");
			Serial_SendString("湿度:");
			Serial_Printf("%d.%d%d",rec_data[0],rec_data[1]);

			Serial_SendString("\r\n");
			

			Delay_ms(1000);
			
	
       
    }

	}

串口代码Serial.c:

#include "stm32f10x.h"                  // Device header
#include <stdio.h>
#include <stdarg.h>
#include <stdint.h>
#include "string.h"	
#include "Serial.h"
 
void USART1_Init(void)
{
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1,ENABLE);  //开启USART1的时钟
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);   //开启GPIOA的时钟
	
	//TX端
    GPIO_InitTypeDef GPIO_InitStructure;
    GPIO_InitStructure.GPIO_Mode=GPIO_Mode_AF_PP;  //复用推挽输出
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_9;   //USART1对应的TX端为GPIOA2
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //50MhZ
    GPIO_Init(GPIOA,&GPIO_InitStructure);
	
	//RX端
	GPIO_InitStructure.GPIO_Mode=GPIO_Mode_IPU;  //上拉输入
    GPIO_InitStructure.GPIO_Pin=GPIO_Pin_10;
    GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;  //50MhZ
    GPIO_Init(GPIOA,&GPIO_InitStructure);

 //串口初始化
	USART_InitTypeDef USART_InitStruct;
	USART_StructInit(&USART_InitStruct);  //初始默认值
	USART_InitStruct.USART_BaudRate=9600;
	USART_InitStruct.USART_HardwareFlowControl=USART_HardwareFlowControl_None;   //不使用硬件流触发
  USART_InitStruct.USART_Mode=USART_Mode_Tx|USART_Mode_Rx;   			//TX 发送模式  RX 接收模式
	USART_InitStruct.USART_Parity=USART_Parity_No;   		//不选择校验
	USART_InitStruct.USART_StopBits=USART_StopBits_1;  		//停止位1位
	USART_InitStruct.USART_WordLength=USART_WordLength_8b;	//数据位8位
	USART_Init(USART1,&USART_InitStruct);
	
	//串口使能
   USART_Cmd(USART1,ENABLE);



}
 
void Serial_SendByte(uint16_t Byte)
{
	USART_SendData(USART1,Byte);
	//0 表示数据还未转移到移位寄存器 循环等待 1 数据已经被转移到了移位寄存器可以发送数据
	while(USART_GetFlagStatus(USART1,USART_FLAG_TXE)==RESET);  //不需要手动清零 再次写入TDR时会自动清零	
}

void Serial_SendArray(uint8_t *Array, uint16_t Length)//发送多个数据
{
	uint16_t i;
	for (i = 0; i < Length; i ++)
	{
		Serial_SendByte(Array[i]);
	}
}

void Serial_SendString(char *String)//定义一个char类型的数组,然后一个char类型变量是uint16_t类型的
{
	uint8_t i;
	for (i = 0; String[i] != '\0'; i ++)
	{
		Serial_SendByte(String[i]);
	}
}


int fputc(int ch, FILE *f)
{
	Serial_SendByte(ch);
	return ch;
}


void Serial_Printf(char *format, ...)
{
	u16 i,j; 
	va_list ap; 
	char TX_BUF[100];
	va_start(ap,format);
	vsprintf((char*)TX_BUF,format,ap);
	va_end(ap);
	i=strlen((const char*)TX_BUF);		//此次发送数据的长度
	for(j=0;j<i;j++)							//循环发送数据
	{
	  while(USART_GetFlagStatus(USART1,USART_FLAG_TC)==RESET); //循环发送,直到发送完毕   
		USART_SendData(USART1,TX_BUF[j]); 
	} 
}

温湿度传感器代码dht11.c:

#include "stm32f10x.h"                  // Device header
#include  "dht11.h"
#include  "Delay.h"
#include "OLED.h"
//数据
unsigned int rec_data[4];


//对于stm32来说,是输出
void DH11_GPIO_Init_OUT(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_Out_PP; //推挽输出
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);
		

}

//对于stm32来说,是输入
void DH11_GPIO_Init_IN(void)
{
	GPIO_InitTypeDef GPIO_InitStructure;
	
	RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE);
	
	GPIO_InitStructure.GPIO_Mode  = GPIO_Mode_IN_FLOATING; //浮空输入
	GPIO_InitStructure.GPIO_Pin   = GPIO_Pin_1;
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	
	GPIO_Init(GPIOA, &GPIO_InitStructure);

}



//主机发送开始信号
void DHT11_Start(void)
{
	DH11_GPIO_Init_OUT(); //输出模式



	 GPIO_SetBits(GPIOA, GPIO_Pin_1); //先拉高
	Delay_us(30);
	
	GPIO_ResetBits(GPIOA, GPIO_Pin_1); //拉低电平至少18us
	Delay_ms(20);
	
	GPIO_SetBits(GPIOA, GPIO_Pin_1); //拉高电平20~40us
	Delay_us(30);

	DH11_GPIO_Init_IN(); //输入模式
}


//获取一个字节
char DHT11_Rec_Byte(void)
{
	unsigned char i = 0;
	unsigned char data;
	
	for(i=0;i<8;i++) //1个数据就是1个字节byte,1个字节byte有8位bit
	{
		while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0); //从1bit开始,低电平变高电平,等待低电平结束
		Delay_us(30); //延迟30us是为了区别数据0和数据1,0只有26~28us
		
		data <<= 1; //左移
		
		if( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 1 ) //如果过了30us还是高电平的话就是数据1
		{
			data |= 1; //数据+1
		}
		
		while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 1 ); //高电平变低电平,等待高电平结束
	}
	
	return data;
}

//获取数据

void DHT11_REC_Data(void)
{	
	unsigned int R_H,R_L,T_H,T_L;
	unsigned char RH,RL,TH,TL,CHECK;
	
	DHT11_Start(); //主机发送信号
	 GPIO_SetBits(GPIOA, GPIO_Pin_1); //拉高电平
	
	if( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0 ) //判断DHT11是否响应
	{
		while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 0); //低电平变高电平,等待低电平结束
		while( GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_1) == 1); //高电平变低电平,等待高电平结束
	
		R_H = DHT11_Rec_Byte();
		R_L = DHT11_Rec_Byte();
		T_H = DHT11_Rec_Byte();
		T_L = DHT11_Rec_Byte();
		CHECK = DHT11_Rec_Byte(); //接收5个数据
		
			GPIO_ResetBits(GPIOA, GPIO_Pin_1); //当最后一bit数据传送完毕后,DHT11拉低总线 50us
		Delay_us(55); //这里延时55us
		 GPIO_SetBits(GPIOA, GPIO_Pin_1); //随后总线由上拉电阻拉高进入空闲状态。
		
		if(R_H + R_L + T_H + T_L == CHECK) //和检验位对比,判断校验接收到的数据是否正确
		{
			RH = R_H;
			RL = R_L;
			TH = T_H;
			TL = T_L;
		}
	}
	rec_data[0] = RH;
	rec_data[1] = RL;
	rec_data[2] = TH;
	rec_data[3] = TL;
}



 

四、作品实图

发送方样品实图:

接受方样品实图:

电脑接收数据实图:

  • 28
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值