實(shí)現(xiàn)功能
- 模塊0x0002通過PC端的串口助手發(fā)送數(shù)據(jù)包“FE 06 A0 A1 01 00 01 00 FF”,點(diǎn)亮最小系統(tǒng)板上的LED指示燈;
- 模塊0x0002通過PC端的串口助手發(fā)送數(shù)據(jù)包“FE 06 A0 A1 01 00 01 01 FF”,熄滅最小系統(tǒng)板上的LED指示燈;
- 按最小系統(tǒng)板上的白色按鍵,實(shí)現(xiàn)通過0x0001模塊點(diǎn)亮0x0002模塊上的紅燈亮5S。
原理圖
最小系統(tǒng)板底板與ZigBee模塊連接原理圖
ZigBee模塊底板連接原理圖
此底板與ZigBee模塊連接之后,只需要一根Micro USB線即可實(shí)現(xiàn)對(duì)ZigBee模塊的各種功能調(diào)試,此底板相當(dāng)于一個(gè)USB轉(zhuǎn)TTL線的作用,底板上的主芯片為CH340C。
測(cè)試網(wǎng)絡(luò)是否正常
通過與地址0x0002模塊相連的COM14發(fā)送測(cè)試數(shù)據(jù),
例如發(fā)送:
FE 05 91 20 00 00 32 FF
或者:
FE 05 91 20 02 00 32 FF
讓自己模塊上的紅色LED點(diǎn)亮5秒。
==>證明硬件連接沒有問題。
然后測(cè)試網(wǎng)絡(luò)是否正常,發(fā)送測(cè)試數(shù)據(jù):
FE 05 91 20 01 00 32 FF
此指令將使地址0x0001的模塊亮5S。
==>證明網(wǎng)絡(luò)是正常的。
PC 串口助手發(fā)送數(shù)據(jù)
如下圖所示,發(fā)送如下數(shù)據(jù)包:
FE 06 A0 A1 01 00 01 00 FF
地址0x0002的模塊收到數(shù)據(jù)包之后,會(huì)將數(shù)據(jù)發(fā)送至目標(biāo)地址0x0001模塊,STM32最小系統(tǒng)板接收地址0x0001模塊收到的數(shù)據(jù),進(jìn)而對(duì)收到的數(shù)據(jù)進(jìn)行解析,然后點(diǎn)亮最小系統(tǒng)板上的綠色LED。
要想實(shí)現(xiàn)對(duì)數(shù)據(jù)包的解析,要完成如下幾部分工作:
- 正確接收完整數(shù)據(jù)包
- 可以采用空閑中斷接收
- 采用定時(shí)器的方式,保證接收數(shù)據(jù)的完整
- 對(duì)數(shù)據(jù)包進(jìn)行解析
根據(jù)DL-LN33模塊協(xié)議及自定義協(xié)議,綜合解析數(shù)據(jù)包內(nèi)容。
此Demo可用于模擬根據(jù)需要自動(dòng)觸發(fā)某個(gè)動(dòng)作或者自動(dòng)上傳傳感器數(shù)據(jù)至其他模塊。
自定義通訊協(xié)議說明
- 數(shù)據(jù)位中第一位01代表綠色指示燈:
- 數(shù)據(jù)位中第二位代表輸出電平:
- 0x00代表輸出低電平
- 0x01代表輸出高電平
通訊協(xié)議自己可以根據(jù)需要隨意定義,只要能保證數(shù)據(jù)傳輸?shù)臏?zhǔn)確性、解析數(shù)據(jù)包后的結(jié)果唯一性即可,因?yàn)楸纠皇菍?shí)現(xiàn)點(diǎn)燈功能,所以通訊協(xié)議設(shè)定的比較簡(jiǎn)單。
按鍵觸發(fā)數(shù)據(jù)傳輸
按鍵按下將發(fā)送如下數(shù)據(jù)包:
FE 05 91 20 02 00 32 FF
點(diǎn)擊核心板上的按鍵,上面數(shù)據(jù)將通過地址0x0001的模塊傳輸出去,地址0x0002的模塊收到數(shù)據(jù)之后,模塊上的紅燈亮5S。
按鍵觸發(fā)代碼
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;
}
}
這里注意封裝的函數(shù):
u8 zigbee_send_cmd_by_lens(u8 *cmd,u8 lens,u8 *ack,u16 waittime);
由于發(fā)送的指令中,會(huì)存在0x00,所以串口發(fā)送函數(shù)要有一個(gè)發(fā)送字節(jié)長(zhǎng)度的參數(shù)才行,否則發(fā)送的數(shù)據(jù)可能不全。
參數(shù)ack可以傳進(jìn)去一個(gè)返回值的數(shù)組,用于校驗(yàn)指令返回值是否正確,進(jìn)而判斷指令是否發(fā)送成功。
因?yàn)辄c(diǎn)亮模塊上的紅色LED的指令,屬于內(nèi)部端口指令,沒有返回值,所以咱們的ack參數(shù)傳進(jìn)去一個(gè)空字符串即可。
結(jié)果展示
小結(jié)
這是DL-LN33 ZigBee模塊介紹的最后一篇,有什么問題大家可以留言區(qū)交流