实现功能
- 模块0x0002通过PC端的串口助手发送数据包“FE 06 A0 A1 01 00 01 00 FF”,点亮最小系统板上的LED指示灯;
- 模块0x0002通过PC端的串口助手发送数据包“FE 06 A0 A1 01 00 01 01 FF”,熄灭最小系统板上的LED指示灯;
- 按最小系统板上的白色按键,实现通过0x0001模块点亮0x0002模块上的红灯亮5S。
原理图
最小系统板底板与ZigBee模块连接原理图
ZigBee模块底板连接原理图
此底板与ZigBee模块连接之后,只需要一根Micro USB线即可实现对ZigBee模块的各种功能调试,此底板相当于一个USB转TTL线的作用,底板上的主芯片为CH340C。
测试网络是否正常
通过与地址0x0002模块相连的COM14发送测试数据,
例如发送:
FE 05 91 20 00 00 32 FF
或者:
FE 05 91 20 02 00 32 FF
让自己模块上的红色LED点亮5秒。
==>证明硬件连接没有问题。
然后测试网络是否正常,发送测试数据:
FE 05 91 20 01 00 32 FF
此指令将使地址0x0001的模块亮5S。
==>证明网络是正常的。
PC 串口助手发送数据
如下图所示,发送如下数据包:
FE 06 A0 A1 01 00 01 00 FF
地址0x0002的模块收到数据包之后,会将数据发送至目标地址0x0001模块,STM32最小系统板接收地址0x0001模块收到的数据,进而对收到的数据进行解析,然后点亮最小系统板上的绿色LED。
要想实现对数据包的解析,要完成如下几部分工作:
- 正确接收完整数据包
- 可以采用空闲中断接收
- 采用定时器的方式,保证接收数据的完整
- 对数据包进行解析
根据DL-LN33模块协议及自定义协议,综合解析数据包内容。
此Demo可用于模拟根据需要自动触发某个动作或者自动上传传感器数据至其他模块。
自定义通讯协议说明
- 数据位中第一位01代表绿色指示灯:
- 数据位中第二位代表输出电平:
- 0x00代表输出低电平
- 0x01代表输出高电平
通讯协议自己可以根据需要随意定义,只要能保证数据传输的准确性、解析数据包后的结果唯一性即可,因为本例只是实现点灯功能,所以通讯协议设定的比较简单。
按键触发数据传输
按键按下将发送如下数据包:
FE 05 91 20 02 00 32 FF
点击核心板上的按键,上面数据将通过地址0x0001的模块传输出去,地址0x0002的模块收到数据之后,模块上的红灯亮5S。
按键触发代码
key = KEY_Scan(0);
if(key)
{
switch(key)
{
case KEY0_PRES:
{
memset(USART3_TX_BUF, 0, sizeof(USART3_TX_BUF));
// 让地址0x0002的模块亮5S:FE 05 91 20 02 00 32 FF
USART3_TX_BUF[0] = 0xFE;
USART3_TX_BUF[1] = 0x05;
USART3_TX_BUF[2] = 0x91;
USART3_TX_BUF[3] = 0x20;
USART3_TX_BUF[4] = 0x02;
USART3_TX_BUF[5] = 0x00;
USART3_TX_BUF[6] = 0x32;
USART3_TX_BUF[7] = 0xFF;
zigbee_send_cmd_by_lens(USART3_TX_BUF,8,"",10);
printf("KEY0_PRES...\r\n");
}
break;
default:
break;
}
}
这里注意封装的函数:
u8 zigbee_send_cmd_by_lens(u8 *cmd,u8 lens,u8 *ack,u16 waittime);
由于发送的指令中,会存在0x00,所以串口发送函数要有一个发送字节长度的参数才行,否则发送的数据可能不全。
参数ack可以传进去一个返回值的数组,用于校验指令返回值是否正确,进而判断指令是否发送成功。
因为点亮模块上的红色LED的指令,属于内部端口指令,没有返回值,所以咱们的ack参数传进去一个空字符串即可。
结果展示
小结
这是DL-LN33 ZigBee模块介绍的最后一篇,有什么问题大家可以留言区交流