DL-LN33 ZigBee模塊:指令分析/地址和組網(wǎng)信息的修改
點擊上方“嵌入式從0到1”,選擇“置頂/星標(biāo)公眾號”
干貨福利,第一時間送達(dá)!
在DL-LN33模塊使用之前,我們需要對模塊進(jìn)行通信的波特率、地址、信道和網(wǎng)絡(luò)ID進(jìn)行設(shè)置,這樣我們首先要對模塊的通信協(xié)議進(jìn)行了解,本文重點分析一下模塊指令的格式,然后對模塊地址和組網(wǎng)信息進(jìn)行修改。
接線
注意: 默認(rèn)購買的PL2303TA線一般紅線為5V,需打開藍(lán)蓋,將紅線更改為3.3V。
圖中所示的USB轉(zhuǎn)TTL的串口模塊都可以,但是使用的時候,注意: ZigBee模塊的工作電壓應(yīng)為2.5V~3.6V。
Uart通信協(xié)議
1. 串口參數(shù)
數(shù)據(jù)位:8位
起始位:1位
停止位:1位
校驗位:無校驗
波特率可以選用下面任意值:
2400、 4800、 9600、 14400、 19200、 28800、 38400、 57600、 115200、 230400、 125000、 250000、 500000。
模塊出廠默認(rèn)波特率為:115200。
2. 數(shù)據(jù)包結(jié)構(gòu)定義
在通信過程中,最常見的應(yīng)用場景是單片機(jī)通過 Uart 告訴模塊這樣的信息:
“將數(shù)據(jù) 00 AE 13 33 發(fā)往地址為 0003 的模塊,目標(biāo)端口為 90,源端口為 91?!?br>對于單片機(jī),需要將這些信息整理成一個包,通過 Uart 發(fā)給模塊:
FE 08 91 90 03 00 00 AE 13 33 FF
此包的說明如下表所示:
信息名 | 長度 | 說明 | 舉例 |
---|---|---|---|
包頭 | 2 Byte | 包頭由FE和包的長度組成,長度為包的數(shù)據(jù)長度加4(源端口號1Byte+目的端口號1Byte+遠(yuǎn)程地址2Byte)。 | FE 08 |
源端口號 | 1 Byte | 包的源端口號。 | 0x91 |
目的端口號 | 1 Byte | 包的目的端口號。 | 0x90 |
遠(yuǎn)程地址 | 2Byte | 遠(yuǎn)程模塊的地址,當(dāng)發(fā)送數(shù)據(jù)給模塊時,遠(yuǎn)程地址為目標(biāo)模塊的地址, 目標(biāo)地址為 0x0000 表示此包發(fā)給本模塊,目標(biāo)地址為 0xFFFF 的包會被發(fā)往本網(wǎng)絡(luò)中的所有節(jié)點。 | 03 00 |
數(shù)據(jù) | 可變 | 想要傳輸?shù)臄?shù)據(jù)。 | 00 AE 13 33 |
包尾 | 1 Byte | 固定為FF表示一個包傳輸完成。 | FF |
注: 遠(yuǎn)程地址即節(jié)點地址,長度為2 Byte,使用小端模式進(jìn)行傳輸,即先傳輸?shù)?位,再傳輸高8位。
3. 轉(zhuǎn)義機(jī)制
-
包尾是一個包的結(jié)束,值為 FF,如果收發(fā)過程中出現(xiàn)FF則會干擾包的正常接收。所以包中不能出現(xiàn)FF,如果需要發(fā)送FF則用 FE FD代替; -
FE是包頭,也是轉(zhuǎn)義標(biāo)志,如果傳輸過程中出現(xiàn) FE,后面跟著一個小于64(因為該模塊傳輸?shù)臄?shù)據(jù)包最大長度為63)的數(shù)字,則會使接收方誤認(rèn)為收到了一個包頭。因此,在任何時候需要發(fā)送一個FE時,則發(fā)送 FE FC代替; -
處理在包頭、包尾和數(shù)據(jù)長度(數(shù)據(jù)長度不會大于63)數(shù)據(jù)傳輸過程中遇到的任何FE/FF都需要轉(zhuǎn)義處理。
傳輸過程中如果遇到數(shù)據(jù)部分、地址或者端口號中出現(xiàn) FF,則使用 FE FD 來代替;如果出現(xiàn) FE,則用 FE FC 來代替。
以免傳輸過程中出現(xiàn)的包頭和包尾,使接收方誤判斷。在傳輸中這種替換稱為“轉(zhuǎn)義”。
包長度不會受到轉(zhuǎn)義的影響,例如發(fā)送的數(shù)據(jù)為 09 FF 時,替換為 09 FE FD,但包頭中的數(shù)據(jù)長度仍然按照 2+4 來計算,這樣,發(fā)送的包如下:
FE 06 91 90 03 00 09 FE FD FF
雖然一共傳輸了 7 個字節(jié),但包長為 6。如果地址、端口號中出現(xiàn)了 FF、FE 也需要進(jìn)行轉(zhuǎn)義。
-
要發(fā)送的數(shù)據(jù)是:FE 08 90 91 FF?00 20 FE?? FF?20 FF -
實際發(fā)送的數(shù)據(jù)是:FE 08 90 91 FE FD 00 20 FE FC FE FD 20 FF
4. 解析包策略上的規(guī)律
-
凡是FE后面跟著的內(nèi)容必然特殊處理
-
如果是小于63的數(shù)據(jù),則是收到了包頭。 -
如果是FD和FC,則將此數(shù)據(jù)+2既是要發(fā)送的數(shù)據(jù),F(xiàn)D對應(yīng)FF,F(xiàn)C對應(yīng)FE。 -
凡是遇到FF,一定是包尾。
第四篇網(wǎng)文,串口編程解析數(shù)據(jù)包時,將會應(yīng)用此處的結(jié)論。
端口
DL-LN3X 模塊設(shè)計了端口的概念,接收方收到一個包時,會根據(jù)包的端口號,選擇對應(yīng)的程序處理包。
端口號的取值范圍是 0x00~0xFF,其中 0x00~0x7F 端口由模塊內(nèi)部程序占用, 0x80~0xFF 端口開放給 Uart 連接的 MCU 或者電腦。
當(dāng) MCU 給一個模塊發(fā)送數(shù)據(jù)時,如果源端口號填寫了小于 0x80 的值,則包無法發(fā)出;如果目的端口號填寫了小于 0x80 的值,接收方模塊的內(nèi)部程序?qū)⑻幚磉@個包并執(zhí)行相關(guān)的動作,而不是從 Uart 發(fā)出這個包。
例如發(fā)送這個包:
FE 05 91 20 03 00 0A FF
則會讓地址為 03 00 的模塊自帶的紅燈點亮 1 秒,而他的 Uart 不會輸出數(shù)據(jù)。
FE 05 91 20 00 00 0A FF
讓自己模塊上的紅色LED點亮1秒。
修改通信的波特率、地址、網(wǎng)絡(luò)ID和信道,都是跟模塊自身的內(nèi)部端口進(jìn)行通信,即與自己的小于0x80的端口進(jìn)行通信,這些端口都是廠家預(yù)先內(nèi)置的端口,用于實現(xiàn)不同組網(wǎng)信息的查詢和修改。
紅燈閃爍控制端口
端口 0x20 用于控制模塊的紅色 LED 點亮,發(fā)送此包可以使模塊的紅色 LED 點亮一定時間。
模塊與USB轉(zhuǎn)TTL連接之后,利用此端口可以測試接線是否正確。
測試命令:FE 05 A3 20 02 00 32 FF
數(shù)據(jù)位的值0x32代表紅燈點亮的時間,該時間為100ms的倍數(shù),換算關(guān)系如下:
0x32 = 50 * 100ms = 5 S。
所以上面命令為點亮地址為0x0002的模塊紅燈5秒鐘。
FE 05 A3 20 00 00 32 FF
讓本模塊的LED點亮5 S。
應(yīng)用: 此功能可以用于測試一個指定地址的模塊是否包含在網(wǎng)絡(luò)中,如果想從許多節(jié)點中迅速找到某個特定地址的節(jié)點,也可以使用此功能。
基本信息管理端口
設(shè)置/修改模塊信息
端口 0x21 用于配置模塊的基本參數(shù),包括波特率、地址、網(wǎng)絡(luò) ID和信道等。
此端口只接受遠(yuǎn)程地址填寫 0x0000 的包,因此,這些信息的讀取和修改只能通過本模塊的 Uart 進(jìn)行,不能遠(yuǎn)程操作。
查詢組網(wǎng)信息
發(fā)送數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為以下值中的一個:0x01 讀取地址;0x02 讀取網(wǎng)絡(luò)ID;0x03 讀取信道編號;0x04 讀取Uart的波特率。 |
發(fā)送這個數(shù)據(jù)后,模塊會根據(jù)修改的內(nèi)容返回一個地址包、網(wǎng)絡(luò) ID 包、信道包或者波特率包。這些包將會攜帶對應(yīng)的配置信息。
通信的波特率
1. 設(shè)置波特率包
發(fā)送數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為0x14。 |
新波特率 | 1Byte | 想要設(shè)置的新波特率讀數(shù)。 |
發(fā)送這個數(shù)據(jù)后,模塊的波特率將被修改為新的的值,除非此值不合法。操作完成后,此端口會返回一個響應(yīng)包。
測試指令:修改波特率
發(fā)送:FE 06 90 21 00 00 14 08 FF
返回:FE 05 21 90 00 00 00 FF
修改后模塊信息:波特率讀數(shù)為0x08(115200)
2. 查詢波特率
返回數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為0x24。 |
波特率 | 1Byte | 當(dāng)前波特率,如果節(jié)點曾經(jīng)收到過設(shè)置信息包,并且沒有進(jìn)行更新,則此處返回最新設(shè)置的波特率讀數(shù)。 |
測試指令:
發(fā)送:FE 05 90 21 00 00 04 FF
返回:FE 06 21 90 00 00 24 08 FF
模塊信息:波特率為0x08,查看下表即為 115200。
注意: 如果不發(fā)送復(fù)位指令,那么重新上電之后,修改的信息將無效。
3. 波特率--讀數(shù)對照表
波特率 | 讀數(shù) | 波特率 | 讀數(shù) | |
---|---|---|---|---|
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 |
設(shè)置說明
如果不知道模塊配置的波特率,可以將 BaudReset 引腳連接到 GND,這樣便可以使用 115200 波特率對模塊進(jìn)行配置。
地址
1. 設(shè)置地址
發(fā)送數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為0x11。 |
新地址 | 2Byte | 想要設(shè)置的新地址值,新地址必須合法。 |
發(fā)送這個數(shù)據(jù)后,模塊的地址將被修改為新地址給定的值,除非此值不合法。操作完成后,此端口會返回一個響應(yīng)包。
測試指令:修改地址為0x0001
發(fā)送:FE 07 90 21 00 00 11 01 00 FF
返回:FE 05 21 90 00 00 00 FF
修改后模塊信息:地址為0x0001
2. 查詢地址
返回數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為0x21。 |
地址 | 2Byte | 當(dāng)前地址,如果節(jié)點曾經(jīng)收到過設(shè)置信息包,并且沒有進(jìn)行更新,則此處返回最新設(shè)置的值。 |
測試指令:查詢地址
發(fā)送:FE 05 90 21 00 00 01 FF
返回:FE 07 21 90 00 00 21 01 00 FF
模塊信息:地址為0x0001。
網(wǎng)絡(luò)ID
1. 設(shè)置新網(wǎng)絡(luò)ID
信息名 | 長度 | 說明 | 舉例 |
---|---|---|---|
包頭 | 2 Byte | 包頭由FE和包的長度組成,長度為包的數(shù)據(jù)長度加4。 | FE 07 |
源端口號 | 1 Byte | 包的源端口號。 | 0x91 |
目的端口號 | 1 Byte | 包的目的端口號。 | 0x21 |
遠(yuǎn)程地址 | 2 Byte | 目標(biāo)地址為 0x0000 表示此包發(fā)給本模塊。 | 00 00 |
數(shù)據(jù) | 3 Byte | 第一個字節(jié)固定為0x12,后兩個字節(jié)為新網(wǎng)絡(luò)ID | 12 34 12 |
包尾 | 1 Byte | 固定為FF表示一個包傳輸完成。 | FF |
測試指令:修改網(wǎng)絡(luò)ID為0x1234
發(fā)送:FE 07 90 21 00 00 12 34 12 FF
發(fā)送這個數(shù)據(jù)后,模塊的網(wǎng)絡(luò) ID 將被修改為新網(wǎng)絡(luò) ID 給定的值:0x1234,除非此值不合法。操作完成后,此端口會返回一個響應(yīng)包。
返回:FE 05 21 90 00 00 00 FF
修改后模塊信息:網(wǎng)絡(luò)ID為0x1234。
2. 查詢網(wǎng)絡(luò)ID包
返回數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為0x22。 |
網(wǎng)絡(luò)ID | 2Byte | 當(dāng)前網(wǎng)絡(luò) ID,如果節(jié)點曾經(jīng)收到過設(shè)置信息包,并且沒有進(jìn)行更新,則此處返回最新設(shè)置的值。 |
測試指令:
發(fā)送:FE 05 90 21 00 00 02 FF
返回:FE 07 21 90 00 00 22 34 12 FF
模塊信息:網(wǎng)絡(luò)ID為0x1234。
信道
1. 設(shè)置信道
發(fā)送數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為0x13。 |
新信道 | 1Byte | 想要設(shè)置的新信道值,新網(wǎng)絡(luò)信道必須合法。 |
發(fā)送這個數(shù)據(jù)后,模塊的網(wǎng)絡(luò) ID 將被修改為新網(wǎng)絡(luò) ID 給定的值,除非此值不合法。操作完成后,此端口會返回一個響應(yīng)包。
測試指令:修改信道為0x0F
發(fā)送:FE 06 90 21 00 00 13 0F FF
返回:FE 05 21 90 00 00 00 FF
修改后模塊信息:信道為0x0F
2. 查詢信道
返回數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為0x23。 |
信道 | 1Byte | 當(dāng)前信道,如果節(jié)點曾經(jīng)收到過設(shè)置信息包,并且沒有進(jìn)行更新,則此處返回最新設(shè) 置的值。 |
測試指令:
發(fā)送:FE 05 90 21 00 00 03 FF
返回:FE 06 21 90 00 00 23 0F FF
模塊信息:信道為0x0F
重啟命令包
設(shè)置信息包含設(shè)置地址,設(shè)置網(wǎng)絡(luò) ID,設(shè)置波特率,設(shè)置信道四種。
這些設(shè)置信息在更新以后,不會立即執(zhí)行,模塊會使用原有的參數(shù)繼續(xù)工作,此時如果希望寫入的參數(shù)生效,則需發(fā)送重啟命令包給模塊。
在設(shè)置地址信息且沒有發(fā)送重啟命令的情況下,如果模塊斷電后再次啟動,設(shè)置的信息也將丟失。
一旦設(shè)置這些信息并發(fā)送重啟命令包,這些信息不會因為斷電和任何形式的復(fù)位丟失。
發(fā)送重啟命令
發(fā)送數(shù)據(jù) | 長度 | 意義 |
---|---|---|
命令 | 1Byte | 必須為0x10,更新信息并重啟。 |
測試指令:重啟包
發(fā)送:FE 05 90 21 00 00 10 FF
返回:無
現(xiàn)象:模塊上的燈閃爍亮2S左右
發(fā)送這個重啟命令之后,模塊的最新參數(shù)將被固化。
參考閱讀
2.4G ZigBee無線自組網(wǎng)mesh網(wǎng)絡(luò)模塊簡介
寫文不易,對你有幫助的話,
請四連鼓勵一下,謝謝各位!
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺僅提供信息存儲服務(wù)。文章僅代表作者個人觀點,不代表本平臺立場,如有問題,請聯(lián)系我們,謝謝!