点击上方“嵌入式从0到1”,选择“置顶/星标公众号”
干货福利,第一时间送达!
在DL-LN33模块使用之前,我们需要对模块进行通信的波特率、地址、信道和网络ID进行设置,这样我们首先要对模块的通信协议进行了解,本文重点分析一下模块指令的格式,然后对模块地址和组网信息进行修改。
接线
注意: 默认购买的PL2303TA线一般红线为5V,需打开蓝盖,将红线更改为3.3V。
图中所示的USB转TTL的串口模块都可以,但是使用的时候,注意: ZigBee模块的工作电压应为2.5V~3.6V。
Uart通信协议
1. 串口参数
数据位:8位
起始位:1位
停止位:1位
校验位:无校验
波特率可以选用下面任意值:
2400、 4800、 9600、 14400、 19200、 28800、 38400、 57600、 115200、 230400、 125000、 250000、 500000。
模块出厂默认波特率为:115200。
2. 数据包结构定义
在通信过程中,最常见的应用场景是单片机通过 Uart 告诉模块这样的信息:
“将数据 00 AE 13 33 发往地址为 0003 的模块,目标端口为 90,源端口为 91。”
对于单片机,需要将这些信息整理成一个包,通过 Uart 发给模块:
FE 08 91 90 03 00 00 AE 13 33 FF
此包的说明如下表所示:
信息名 | 长度 | 说明 | 举例 |
---|---|---|---|
包头 | 2 Byte | 包头由FE和包的长度组成,长度为包的数据长度加4(源端口号1Byte+目的端口号1Byte+远程地址2Byte)。 | FE 08 |
源端口号 | 1 Byte | 包的源端口号。 | 0x91 |
目的端口号 | 1 Byte | 包的目的端口号。 | 0x90 |
远程地址 | 2Byte | 远程模块的地址,当发送数据给模块时,远程地址为目标模块的地址, 目标地址为 0x0000 表示此包发给本模块,目标地址为 0xFFFF 的包会被发往本网络中的所有节点。 | 03 00 |
数据 | 可变 | 想要传输的数据。 | 00 AE 13 33 |
包尾 | 1 Byte | 固定为FF表示一个包传输完成。 | FF |
注: 远程地址即节点地址,长度为2 Byte,使用小端模式进行传输,即先传输低8位,再传输高8位。
3. 转义机制
-
包尾是一个包的结束,值为
FF,如果收发过程中出现FF则会干扰包的正常接收。所以包中不能出现FF,如果需要发送FF则用
FE FD代替;
-
FE是包头,也是转义标志,如果传输过程中出现
FE,后面跟着一个小于64(因为该模块传输的数据包最大长度为63)的数字,则会使接收方误认为收到了一个包头。因此,在任何时候需要发送一个FE时,则发送
FE FC代替;
-
处理在包头、包尾和数据长度(数据长度不会大于63)数据传输过程中遇到的任何FE/FF都需要转义处理。
传输过程中如果遇到数据部分、地址或者端口号中出现 FF,则使用 FE FD 来代替;如果出现 FE,则用 FE FC 来代替。
以免传输过程中出现的包头和包尾,使接收方误判断。在传输中这种替换称为“转义”。
包长度不会受到转义的影响,例如发送的数据为 09 FF 时,替换为 09 FE FD,但包头中的数据长度仍然按照 2+4 来计算,这样,发送的包如下:
FE 06 91 90 03 00 09 FE FD FF
虽然一共传输了 7 个字节,但包长为 6。如果地址、端口号中出现了 FF、FE 也需要进行转义。
-
要发送的数据是:FE 08 90 91
FF 00 20
FE
FF 20 FF
-
实际发送的数据是:FE 08 90 91
FE FD 00 20
FE FC
FE FD 20 FF
4. 解析包策略上的规律
-
凡是FE后面跟着的内容必然特殊处理
-
如果是小于63的数据,则是收到了包头。
-
如果是FD和FC,则将此数据+2既是要发送的数据,FD对应FF,FC对应FE。
-
凡是遇到FF,一定是包尾。
第四篇网文,串口编程解析数据包时,将会应用此处的结论。
端口
DL-LN3X 模块设计了端口的概念,接收方收到一个包时,会根据包的端口号,选择对应的程序处理包。
端口号的取值范围是 0x00~0xFF,其中 0x00~0x7F 端口由模块内部程序占用, 0x80~0xFF 端口开放给 Uart 连接的 MCU 或者电脑。
当 MCU 给一个模块发送数据时,如果源端口号填写了小于 0x80 的值,则包无法发出;如果目的端口号填写了小于 0x80 的值,接收方模块的内部程序将处理这个包并执行相关的动作,而不是从 Uart 发出这个包。
例如发送这个包:
FE 05 91 20 03 00 0A FF
则会让地址为 03 00 的模块自带的红灯点亮 1 秒,而他的 Uart 不会输出数据。
FE 05 91 20 00 00 0A FF
让自己模块上的红色LED点亮1秒。
修改通信的波特率、地址、网络ID和信道,都是跟模块自身的内部端口进行通信,即与自己的小于0x80的端口进行通信,这些端口都是厂家预先内置的端口,用于实现不同组网信息的查询和修改。
红灯闪烁控制端口
端口 0x20 用于控制模块的红色 LED 点亮,发送此包可以使模块的红色 LED 点亮一定时间。
模块与USB转TTL连接之后,利用此端口可以测试接线是否正确。
测试命令:FE 05 A3 20 02 00 32 FF
数据位的值0x32代表红灯点亮的时间,该时间为100ms的倍数,换算关系如下:
0x32 = 50 * 100ms = 5 S。
所以上面命令为点亮地址为0x0002的模块红灯5秒钟。
FE 05 A3 20 00 00 32 FF
让本模块的LED点亮5 S。
应用: 此功能可以用于测试一个指定地址的模块是否包含在网络中,如果想从许多节点中迅速找到某个特定地址的节点,也可以使用此功能。
基本信息管理端口
设置/修改模块信息
端口 0x21 用于配置模块的基本参数,包括波特率、地址、网络 ID和信道等。
此端口只接受远程地址填写 0x0000 的包,因此,这些信息的读取和修改只能通过本模块的 Uart 进行,不能远程操作。
查询组网信息
发送数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为以下值中的一个:0x01 读取地址;0x02 读取网络ID;0x03 读取信道编号;0x04 读取Uart的波特率。 |
发送这个数据后,模块会根据修改的内容返回一个地址包、网络 ID 包、信道包或者波特率包。这些包将会携带对应的配置信息。
通信的波特率
1. 设置波特率包
发送数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为0x14。 |
新波特率 | 1Byte | 想要设置的新波特率读数。 |
发送这个数据后,模块的波特率将被修改为新的的值,除非此值不合法。操作完成后,此端口会返回一个响应包。
测试指令:修改波特率
发送:FE 06 90 21 00 00 14 08 FF
返回:FE 05 21 90 00 00 00 FF
修改后模块信息:波特率读数为0x08(115200)
2. 查询波特率
返回数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为0x24。 |
波特率 | 1Byte | 当前波特率,如果节点曾经收到过设置信息包,并且没有进行更新,则此处返回最新设置的波特率读数。 |
测试指令:
发送:FE 05 90 21 00 00 04 FF
返回:FE 06 21 90 00 00 24 08 FF
模块信息:波特率为0x08,查看下表即为 115200。
注意: 如果不发送复位指令,那么重新上电之后,修改的信息将无效。
3. 波特率–读数对照表
波特率 | 读数 | 波特率 | 读数 | |
---|---|---|---|---|
2400 | 0x00 | 57600 | 0x07 | |
4800 | 0x01 | 115200 | 0x08 | |
9600 | 0x02 | 230400 | 0x09 | |
14400 | 0x03 | 125000 | 0x0A | |
19200 | 0x04 | 250000 | 0x0B | |
28800 | 0x05 | 500000 | 0x0C | |
38400 | 0x06 |
设置说明
如果不知道模块配置的波特率,可以将 BaudReset 引脚连接到 GND,这样便可以使用 115200 波特率对模块进行配置。
地址
1. 设置地址
发送数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为0x11。 |
新地址 | 2Byte | 想要设置的新地址值,新地址必须合法。 |
发送这个数据后,模块的地址将被修改为新地址给定的值,除非此值不合法。操作完成后,此端口会返回一个响应包。
测试指令:修改地址为0x0001
发送:FE 07 90 21 00 00 11 01 00 FF
返回:FE 05 21 90 00 00 00 FF
修改后模块信息:地址为0x0001
2. 查询地址
返回数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为0x21。 |
地址 | 2Byte | 当前地址,如果节点曾经收到过设置信息包,并且没有进行更新,则此处返回最新设置的值。 |
测试指令:查询地址
发送:FE 05 90 21 00 00 01 FF
返回:FE 07 21 90 00 00 21 01 00 FF
模块信息:地址为0x0001。
网络ID
1. 设置新网络ID
信息名 | 长度 | 说明 | 举例 |
---|---|---|---|
包头 | 2 Byte | 包头由FE和包的长度组成,长度为包的数据长度加4。 | FE 07 |
源端口号 | 1 Byte | 包的源端口号。 | 0x91 |
目的端口号 | 1 Byte | 包的目的端口号。 | 0x21 |
远程地址 | 2 Byte | 目标地址为 0x0000 表示此包发给本模块。 | 00 00 |
数据 | 3 Byte | 第一个字节固定为0x12,后两个字节为新网络ID | 12 34 12 |
包尾 | 1 Byte | 固定为FF表示一个包传输完成。 | FF |
测试指令:修改网络ID为0x1234
发送:FE 07 90 21 00 00 12 34 12 FF
发送这个数据后,模块的网络 ID 将被修改为新网络 ID 给定的值:0x1234,除非此值不合法。操作完成后,此端口会返回一个响应包。
返回:FE 05 21 90 00 00 00 FF
修改后模块信息:网络ID为0x1234。
2. 查询网络ID包
返回数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为0x22。 |
网络ID | 2Byte | 当前网络 ID,如果节点曾经收到过设置信息包,并且没有进行更新,则此处返回最新设置的值。 |
测试指令:
发送:FE 05 90 21 00 00 02 FF
返回:FE 07 21 90 00 00 22 34 12 FF
模块信息:网络ID为0x1234。
信道
1. 设置信道
发送数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为0x13。 |
新信道 | 1Byte | 想要设置的新信道值,新网络信道必须合法。 |
发送这个数据后,模块的网络 ID 将被修改为新网络 ID 给定的值,除非此值不合法。操作完成后,此端口会返回一个响应包。
测试指令:修改信道为0x0F
发送:FE 06 90 21 00 00 13 0F FF
返回:FE 05 21 90 00 00 00 FF
修改后模块信息:信道为0x0F
2. 查询信道
返回数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为0x23。 |
信道 | 1Byte | 当前信道,如果节点曾经收到过设置信息包,并且没有进行更新,则此处返回最新设 置的值。 |
测试指令:
发送:FE 05 90 21 00 00 03 FF
返回:FE 06 21 90 00 00 23 0F FF
模块信息:信道为0x0F
重启命令包
设置信息包含设置地址,设置网络 ID,设置波特率,设置信道四种。
这些设置信息在更新以后,不会立即执行,模块会使用原有的参数继续工作,此时如果希望写入的参数生效,则需发送重启命令包给模块。
在设置地址信息且没有发送重启命令的情况下,如果模块断电后再次启动,设置的信息也将丢失。
一旦设置这些信息并发送重启命令包,这些信息不会因为断电和任何形式的复位丢失。
发送重启命令
发送数据 | 长度 | 意义 |
---|---|---|
命令 | 1Byte | 必须为0x10,更新信息并重启。 |
测试指令:重启包
发送:FE 05 90 21 00 00 10 FF
返回:无
现象:模块上的灯闪烁亮2S左右
发送这个重启命令之后,模块的最新参数将被固化。
参考阅读
2.4G ZigBee无线自组网mesh网络模块简介
写文不易,对你有帮助的话,
请四连鼓励一下,谢谢各位!
免责声明:本文内容由21ic获得授权后发布,版权归原作者所有,本平台仅提供信息存储服务。文章仅代表作者个人观点,不代表本平台立场,如有问题,请联系我们,谢谢!