《智能產(chǎn)品設(shè)計(jì)與應(yīng)用》課件-項(xiàng)目二 通信技術(shù)_第1頁
《智能產(chǎn)品設(shè)計(jì)與應(yīng)用》課件-項(xiàng)目二 通信技術(shù)_第2頁
《智能產(chǎn)品設(shè)計(jì)與應(yīng)用》課件-項(xiàng)目二 通信技術(shù)_第3頁
《智能產(chǎn)品設(shè)計(jì)與應(yīng)用》課件-項(xiàng)目二 通信技術(shù)_第4頁
《智能產(chǎn)品設(shè)計(jì)與應(yīng)用》課件-項(xiàng)目二 通信技術(shù)_第5頁
已閱讀5頁,還剩104頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

智能產(chǎn)品設(shè)計(jì)與應(yīng)用1.串口通信原理案例導(dǎo)入01/PART

ONE串口通信原理參數(shù)配置順序詳情寄存器名功能備注賦值1.引腳選擇及配置PERCFG外設(shè)控制寄存器(結(jié)合串口外設(shè)I/O引腳映射)串口0的引腳映射到位置1,即P0_2、P0_3PERCFG&=~0x01;P0SEL功能選擇(0:通用IO,1:外設(shè))將P0_2、P0_3設(shè)置成外設(shè)功能P0SEL|=0x0C;2.波特率設(shè)置UxGCRUSARTx通用控制寄存器BAUD_E[4:0]16MHz:932MHz:8U0GCR=8;//32MHzUxBAUDUSARTx波特率控制寄存器BAUD_M[7:0]U0BAUD=59;3.串口屬性相關(guān)的配置UxUCRUSARTxUART控制寄存器第7位,1U0UCR|=0X80;UxCSRUSARTx控制和狀態(tài)寄存器7:1:UART6:1:接收使能U0CSR|=0XC0;UxBUFUSARTx接收、發(fā)送數(shù)據(jù)緩沖器串口通信原理參數(shù)配置順序詳情寄存器名功能備注賦值4.中斷標(biāo)志位UTX0IFTX發(fā)送中斷標(biāo)志//清除TX發(fā)送中斷標(biāo)志UTX0IF=0;URX0IF/RX接收中斷標(biāo)志//清除RX接收中斷標(biāo)志URX0IF=0;5.中斷允許URX0IEURAT0的接收中斷使能URAT0的接收中斷URX0IE=1;

EA

總中斷//使能總中斷EA=1;串口通信原理波特率設(shè)置:串口比特率的設(shè)置UxGCRUxBAUD串口通信原理波特率設(shè)置:串口比特率的設(shè)置U0BAUD=59;串口通信原理波特率設(shè)置:串口比特率的設(shè)置U0GCR=8;串口通信原理串口屬性相關(guān)的配置U0UCR|=0x80;串口通信原理串口屬性相關(guān)的配置U0CSR|=0xC0;UxCSRUSARTx控制和狀態(tài)寄存器串口通信原理設(shè)計(jì)串口初始化函數(shù),設(shè)備的系統(tǒng)時(shí)鐘位32MHz,將USARTO的引腳映射為位置1,選擇UART模式,波特率為9600,UART禁止流控,禁止奇偶校驗(yàn),8位數(shù)據(jù)位,1位停止位,使能接收中斷和總中斷。[應(yīng)用范例]串口初始化函數(shù)串口初始化代碼:voidInit_Uart0(){//引腳配置

PERCFG&=~0x01;//串口0的引腳映射到位置1,即P0_2和P0_3

P0SEL|=0x0C;//將P0_2和P0_3端口設(shè)置成外設(shè)功能//波特率相關(guān)的配置

U0BAUD=59;//32MHz的系統(tǒng)時(shí)鐘產(chǎn)生9600BPS的波特率

U0GCR=8;串口通信原理[應(yīng)用范例]串口初始化函數(shù)//串口屬性相關(guān)的配置

U0UCR|=0x80;//禁止流控,8位數(shù)據(jù),清除緩沖器

U0CSR|=0xC0;//選擇UART模式,使能接收器//清除發(fā)送和接收中斷標(biāo)志位

UTX0IF=0;//清除TX發(fā)送中斷標(biāo)志

URX0IF=0;//清除RX接收中斷標(biāo)志//使能串口相關(guān)中斷控制位

URX0IE=1;//使能URAT0的接收中斷

EA=1;//使能總中斷}串口通信原理任務(wù)6.1串口數(shù)據(jù)發(fā)送USART0選擇UART模式,波特率9600,I/O引腳映射到備用位置1。設(shè)計(jì)看門狗初始化函數(shù),設(shè)置為定時(shí)器模式,定時(shí)間隔為1秒。看門狗中斷函數(shù)中,每隔1秒,發(fā)送一次字符串"HelloWorld!\r\n”。D1燈作為數(shù)據(jù)發(fā)送指示燈,在發(fā)送字符串前點(diǎn)亮D1,字符串發(fā)送結(jié)束后熄滅D1。set_clock_32();//1.初始化時(shí)鐘InitIO();//2.初始化端口Init_WDT();//3.初始化看門狗Init_Uart0();//4.初始化串口串口通信原理set_clock_32();//1.初始化時(shí)鐘InitIO();//2.初始化端口Init_WDT();//3.初始化看門狗Init_Uart0();//4.初始化串口While(1)WDTIF=0;清除中斷標(biāo)志while(*str!='\0')Send_Byte(*str++);N看門狗中斷函數(shù)1s時(shí)間到LED1=~LED1;Send_String("HelloWorld!!!\r\n");//發(fā)送字符串函數(shù)發(fā)送字符串函數(shù)Send_String(unsignedchar*str)發(fā)送字節(jié)函數(shù)Send_Byte(unsignedchardat)U0DBUF=dat;//將數(shù)據(jù)放入發(fā)送緩沖寄存器

while(UTX0IF==0);//等待發(fā)送完成

UTX0IF=0;//發(fā)送完成后清除中斷標(biāo)志位串口通信原理set_clock_32();//1.初始化時(shí)鐘InitIO();//2.初始化端口Init_WDT();//3.初始化看門狗Init_Uart0();//4.初始化串口voidInit_Uart0(){//引腳配置PERCFG&=~0x01;

//串口0的引腳映射到位置1,即P0_2和P0_3P0SEL|=0x0C;//將P0_2和P0_3端口設(shè)置成外設(shè)功能//波特率相關(guān)的配置U0BAUD=59;//32MHz的系統(tǒng)時(shí)鐘產(chǎn)生9600BPS的波特率U0GCR=8;//串口屬性相關(guān)的配置U0UCR|=0x80;//禁止流控,8位數(shù)據(jù),清除緩沖器U0CSR|=0xC0;//選擇UART模式,使能接收器//清除發(fā)送和接收中斷標(biāo)志位UTX0IF=0;//清除TX發(fā)送中斷標(biāo)志URX0IF=0;//清除RX接收中斷標(biāo)志//使能串口相關(guān)中斷控制位URX0IE=1;//使能URAT0的接收中斷EA=1;//使能總中斷}串口通信原理關(guān)于sprintf()函數(shù)的用法sprintf(),指的是字符串格式化函數(shù),把格式化的數(shù)據(jù)寫入某個(gè)字符串中。intsprintf(char*string,char*format[,argument.,..]);引入頭文件#include"stdio.h"例:有一個(gè)表示溫度的整型變量tmp,現(xiàn)在要將其格式化為字符串。“溫度是:XX攝氏度”,并將其通過串口0發(fā)送出去。UnsignedcharStr_buff[64];sprintf((char*)Str_buff,"溫度是:%d攝氏度",tmp);Send_String(Str_buff);串口通信原理通信方式并行通信串行通信串行同步通信串行異步通信所有設(shè)備使用同一時(shí)鐘,以數(shù)據(jù)塊為單位傳送,對硬件結(jié)構(gòu)要求高。每個(gè)設(shè)備使用自己的時(shí)鐘信號(hào),通信中雙方時(shí)鐘頻率保持一致,通信一次傳送一次。9600bps電腦串口CC2530單片機(jī)P0.2RX接收P0.3TX發(fā)送串口通信原理CC2530串口向電腦串口發(fā)送字符串信息。將開發(fā)板上按鍵次數(shù)發(fā)送給電腦串口。開發(fā)板→電腦串口當(dāng)CC2530收到電腦串口發(fā)送來的信息,修改數(shù)據(jù),發(fā)送回電腦。串口控制LED燈。電腦串口→開發(fā)板串口通信原理電腦串口CC2530單片機(jī)P0.2RX接收P0.3TX發(fā)送兩個(gè)串行通信接口USART0USART12個(gè)獨(dú)立的中斷向量對于每個(gè)USART外設(shè),有5個(gè)相關(guān)寄存器(x是USART的編號(hào),為0或者1)發(fā)送完成中斷:URX0,USART0接收完成中斷:UTX0,USART0異步UART模式同步SPI模式串口通信原理對于每個(gè)USART,有5個(gè)如下的寄存器(x是USART的編號(hào),為0或者1):UxCSR:控制和狀態(tài);UxUCR:UART控制;UxGCR:通用控制;UxBUF:接收/發(fā)送數(shù)據(jù)緩沖;UxBAUD:波特率控制。USART寄存器串口通信原理參數(shù)配置順序詳情寄存器名功能備注賦值1.引腳選擇及配置PERCFG外設(shè)控制寄存器(結(jié)合串口外設(shè)I/O引腳映射)串口0的引腳映射到位置1,即P0_2、P0_3PERCFG&=~0x01;P0SEL功能選擇(0:通用IO,1:外設(shè))將P0_2、P0_3設(shè)置成外設(shè)功能P0SEL|=0x0C;2.波特率設(shè)置UxGCRUSARTx通用控制寄存器BAUD_E[4:0]16MHz:932MHz:8U0GCR=8;//32MHzUxBAUDUSARTx波特率控制寄存器BAUD_M[7:0]U0BAUD=59;3.串口屬性相關(guān)的配置UxUCRUSARTxUART控制寄存器第7位,1U0UCR|=0X80;UxCSRUSARTx控制和狀態(tài)寄存器7:1:UART6:1:接收使能U0CSR|=0XC0;4.數(shù)據(jù)存放UxBUFUSARTx接收、發(fā)送數(shù)據(jù)緩沖器1.引腳選擇及配置PERCFG外設(shè)控制寄存器(結(jié)合串口外設(shè)I/O引腳映射)1.引腳選擇及配置PERCFG外設(shè)控制寄存器(結(jié)合串口外設(shè)I/O引腳映射)1.引腳選擇及配置PERCFG外設(shè)控制寄存器(結(jié)合串口外設(shè)I/O引腳映射)智能產(chǎn)品設(shè)計(jì)與應(yīng)用2.人機(jī)通信控制(串口)案例導(dǎo)入01/PART

ONE人機(jī)通信控制(串口)任務(wù)6.1串口數(shù)據(jù)發(fā)送USART0選擇UART模式,波特率9600,I/O引腳映射到備用位置1。設(shè)計(jì)看門狗初始化函數(shù),設(shè)置為定時(shí)器模式,定時(shí)間隔為1秒??撮T狗中斷函數(shù)中,每隔1秒,發(fā)送一次字符串"HelloWorld!\r\n”。D1燈作為數(shù)據(jù)發(fā)送指示燈,在發(fā)送字符串前點(diǎn)亮D1,字符串發(fā)送結(jié)束后熄滅D1。set_clock_32();//1.初始化時(shí)鐘InitIO();//2.初始化端口Init_WDT();//3.初始化看門狗Init_Uart0();//4.初始化串口人機(jī)通信控制(串口)set_clock_32();//1.初始化時(shí)鐘InitIO();//2.初始化端口Init_WDT();//3.初始化看門狗Init_Uart0();//4.初始化串口While(1)WDTIF=0;清除中斷標(biāo)志while(*str!='\0')

Send_Byte(*str++);N看門狗中斷函數(shù)1s時(shí)間到LED1=~LED1;Send_String("HelloWorld!!!\r\n");//發(fā)送字符串函數(shù)發(fā)送字符串函數(shù)Send_String(unsignedchar*str)發(fā)送字節(jié)函數(shù)Send_Byte(unsignedchardat)U0DBUF=dat;//將數(shù)據(jù)放入發(fā)送緩沖寄存器

while(UTX0IF==0);//等待發(fā)送完成

UTX0IF=0;//發(fā)送完成后清除中斷標(biāo)志位人機(jī)通信控制(串口)set_clock_32();//1.初始化時(shí)鐘InitIO();//2.初始化端口Init_WDT();//3.初始化看門狗Init_Uart0();//4.初始化串口voidInit_Uart0(){//引腳配置PERCFG&=~0x01;

//串口0的引腳映射到位置1,即P0_2和P0_3P0SEL|=0x0C;//將P0_2和P0_3端口設(shè)置成外設(shè)功能//波特率相關(guān)的配置U0BAUD=59;//32MHz的系統(tǒng)時(shí)鐘產(chǎn)生9600BPS的波特率U0GCR=8;//串口屬性相關(guān)的配置U0UCR|=0x80;//禁止流控,8位數(shù)據(jù),清除緩沖器U0CSR|=0xC0;//選擇UART模式,使能接收器//清除發(fā)送和接收中斷標(biāo)志位UTX0IF=0;//清除TX發(fā)送中斷標(biāo)志URX0IF=0;//清除RX接收中斷標(biāo)志//使能串口相關(guān)中斷控制位URX0IE=1;//使能URAT0的接收中斷EA=1;//使能總中斷}人機(jī)通信控制(串口)關(guān)于sprintf()函數(shù)的用法sprintf(),指的是字符串格式化函數(shù),把格式化的數(shù)據(jù)寫入某個(gè)字符串中。intsprintf(char*string,char*format[,argument.,..]);引入頭文件#include"stdio.h"例:有一個(gè)表示溫度的整型變量tmp,現(xiàn)在要將其格式化為字符串?!皽囟仁?XX攝氏度”,并將其通過串口0發(fā)送出去。UnsignedcharStr_buff[64];sprintf((char*)Str_buff,"溫度是:%d攝氏度",tmp);Send_String(Str_buff);人機(jī)通信控制(串口)任務(wù)6.3CC2530串口數(shù)據(jù)收發(fā)基礎(chǔ)USART0選擇UART模式,波特率9600,I/0引腳映射到備用位置1。串口成功接收到一個(gè)字節(jié)數(shù)據(jù)后,在中斷服務(wù)函數(shù)中,在數(shù)據(jù)原值上加1,然后發(fā)送回上位機(jī)。在主函數(shù)中,初始化完成后,進(jìn)行死循環(huán)等待。

P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2CC2530模塊人機(jī)通信控制(串口)2種接收方式查詢方式接收串口數(shù)據(jù)中斷方式接收串口數(shù)據(jù)中斷標(biāo)志位TCON.URX0IF被置1,可位尋址,需要軟件清0初始化:IEN0.URX0IE=1,第2位,可位尋址,接收中斷使能中斷服務(wù)函數(shù):對中斷標(biāo)志位TCON.URX0IF軟件清0,UxCSR.REN=1,接收允許第6位IE結(jié)尾,中斷控制位IF結(jié)尾,中斷標(biāo)志位//使能串口接收中斷控制位URX0IE=1;//串口中斷允許EA=1;//總中斷允許#pragmavector=URX0_VECTOR__interruptvoidSecrive_UR0_Recv(){…}串口初始化增加串口中斷服務(wù)程序unsignedchardat;

//定義一個(gè)無符號(hào)變量URX0IF=0;//清除標(biāo)志位dat=U0DBUF;//從數(shù)據(jù)緩存器重接收數(shù)據(jù)dat=dat+1;Send_Byte(dat);//發(fā)送數(shù)據(jù)人機(jī)通信控制(串口)UxCSR人機(jī)通信控制(串口)人機(jī)通信控制(串口)拓展任務(wù):串口命令控制燈光開關(guān)USART0選擇UART模式,波特率9600,I/O引腳映射到備用位置1。收到“0xA1",點(diǎn)亮LED1燈,操作完成后,返回“LED1isopen!”。收到“0xA2”,關(guān)閉LED1燈,操作完成后,返回“LED1isclosed!”。收到“0xB1’,點(diǎn)亮LED2燈,操作完成后,返回“LED2isopen!。收到“0xB2,關(guān)閉LED2燈,操作完成后,返回“LED2isclosed!”。收到其他數(shù)據(jù),不控制LED燈,返回“ERROR!!!”。

P1_0P1_1P0_4P0_1P2_0LED1LED2LED3K1K2CC2530模塊智能產(chǎn)品設(shè)計(jì)與應(yīng)用3.BasicRF點(diǎn)對點(diǎn)環(huán)境中在串口通信案例導(dǎo)入01/PART

ONE我是A模塊點(diǎn)燈命令正確我是B模塊LED1

點(diǎn)亮/熄滅BasicRF點(diǎn)對點(diǎn)環(huán)境中在串口通信使用2塊CC2530模塊,進(jìn)行無線數(shù)據(jù)通信。串口發(fā)送數(shù)據(jù)給A模塊,A模塊收到數(shù)據(jù),如果是0x02,發(fā)送數(shù)據(jù)給B模塊,發(fā)送“點(diǎn)燈命令正確”到串口,液晶顯示內(nèi)容如下圖。B模塊收到A發(fā)的數(shù)據(jù)為0x02,則LED1狀態(tài)取反。液晶顯示內(nèi)容如下圖。任務(wù):點(diǎn)對點(diǎn)無線通信CC2530模塊ACC2530模塊BBasicRF點(diǎn)對點(diǎn)環(huán)境中在串口通信任務(wù):點(diǎn)對點(diǎn)無線通信A模塊收到串口0x02無線數(shù)據(jù)0x02B模塊收到0x02后LED1取反發(fā)送接收電腦串口發(fā)送0X02控制層網(wǎng)絡(luò)層感知層BasicRF點(diǎn)對點(diǎn)環(huán)境中在串口通信死循環(huán)while(1)串口初始化主函數(shù)main收到數(shù)據(jù)串口中斷URX0IF=0;//清除中斷標(biāo)志F_Recv=1;

//收到數(shù)據(jù)的標(biāo)志dat_recv=U0DBUF;發(fā)送收到的數(shù)據(jù)給B模塊;F_Recv==1?F_Recv=0;dat_recv==0x02?給串口發(fā)液晶顯示“點(diǎn)燈命令正確”;液晶顯示“點(diǎn)燈命令正確”;延時(shí),液晶熄滅A模塊BasicRF點(diǎn)對點(diǎn)環(huán)境中在串口通信死循環(huán)while(1)主函數(shù)main收到數(shù)據(jù)?dat_recv==0x02?B模塊LED1=~LED1;液晶顯示:LED1點(diǎn)亮/熄滅智能產(chǎn)品設(shè)計(jì)與應(yīng)用4.基于BasicRF的點(diǎn)對點(diǎn)無線通信案例導(dǎo)入01/PART

ONE基于BasicRF的點(diǎn)對點(diǎn)無線通信BasicRF由TI公司提供,它包含了IEEE802.15.4標(biāo)準(zhǔn)的數(shù)據(jù)包的收發(fā)。這個(gè)協(xié)議只是用來演示無線設(shè)備是如何進(jìn)行數(shù)據(jù)傳輸?shù)?,不包含完整功能的協(xié)議。但是它采用了與802.15.4MA兼容的數(shù)據(jù)包結(jié)構(gòu)及ACK包結(jié)構(gòu),其功能限制如下:不提供“多跳”、“設(shè)備掃描”及Beacon。不提供不同種的網(wǎng)絡(luò)設(shè)備,如協(xié)調(diào)器、路由器等。所有節(jié)點(diǎn)同級,只實(shí)現(xiàn)點(diǎn)對點(diǎn)傳輸。傳輸時(shí)會(huì)等待信道空閑,但不按802.15.4CSMA-CA要求進(jìn)行兩次CCA檢測。不重傳數(shù)據(jù)。簡言之,BasicRF功能較為簡單,但可用來進(jìn)行無線設(shè)備數(shù)據(jù)傳輸?shù)娜腴T學(xué)習(xí)。BasicRF概述基于BasicRF的點(diǎn)對點(diǎn)無線通信BasicRF軟件包主要有四個(gè)部分:硬件層:HardwareLayerA硬件抽象層:HardwareAbstractionLayer基本無線傳輸層:BasicRFLayer應(yīng)用層:AppliactionBasicRF只是簡單的點(diǎn)對點(diǎn)無線通信協(xié)議,不具備“多跳”、“設(shè)備掃描”功能,不提供多種網(wǎng)絡(luò)設(shè)備,如協(xié)調(diào)器,所有的節(jié)點(diǎn)為同一等級,只能實(shí)現(xiàn)點(diǎn)對點(diǎn)的數(shù)據(jù)傳輸,傳輸時(shí)會(huì)等待信道空閑,但不支持?jǐn)?shù)據(jù)重傳。BasicRF概述基于BasicRF的點(diǎn)對點(diǎn)無線通信BasicRF概述基于BasicRF的點(diǎn)對點(diǎn)無線通信BasicRF的應(yīng)用開發(fā)要點(diǎn)BasicRF軟件包看起來比較復(fù)雜,而實(shí)際上BasicRF相關(guān)的核心要點(diǎn),有四個(gè)部分:無線參數(shù)的配置。無線模塊的初始化。無線數(shù)據(jù)的發(fā)送。無線數(shù)據(jù)的接收。需要配置四個(gè)無線參數(shù):本機(jī)地址、目標(biāo)地址、PandID、通信信道。注意:兩個(gè)通信節(jié)點(diǎn)的PandID和通信信道必須一致。基于BasicRF的點(diǎn)對點(diǎn)無線通信BasicRF核心函數(shù)介紹1.BasicRF無線數(shù)據(jù)發(fā)送:basicRfSendPacket()uint8basicRfSendPacket(uint16destAddr,uint8*pPayload,uint8length)功能:將待發(fā)送數(shù)據(jù)緩沖區(qū)中指定長度的數(shù)據(jù)發(fā)送給目標(biāo)地址的節(jié)點(diǎn)。返回值:SUCCESS:數(shù)據(jù)發(fā)送成功。 FAILED:數(shù)據(jù)發(fā)送失敗。參數(shù):destAddr:發(fā)送的目標(biāo)地址。

pPayload:待發(fā)送數(shù)據(jù)的緩沖區(qū)指針。 length:待發(fā)送數(shù)據(jù)的長度。基于BasicRF的點(diǎn)對點(diǎn)無線通信BasicRF核心函數(shù)介紹2.BasicRF判斷是否已收到無線數(shù)據(jù):basicRfPacketlsReady()uint8basicRfPacketIsReady(void)功能:查詢無線模塊是否成功接收到數(shù)據(jù)。返回值:返回TRUE:表示已成功接收到無線數(shù)據(jù),有數(shù)據(jù)可以讀取。基于BasicRF的點(diǎn)對點(diǎn)無線通信BasicRF核心函數(shù)介紹3.BasicRF

無線數(shù)據(jù)讀?。篵asicRfReceive()uint8basicRfReceive(uint8*pRxData,uint16len,int16*pRssi)功能:在已經(jīng)接收到的無線數(shù)據(jù)中,讀取指定長度的數(shù)據(jù)到數(shù)據(jù)接收緩沖區(qū)中。返回值:實(shí)際讀取到的數(shù)據(jù)長度。參數(shù):pRxData:存放讀取數(shù)據(jù)的緩沖區(qū)指針。

len:需要讀取數(shù)據(jù)的長度。

pRssi:保持上一次數(shù)據(jù)接收包信息變量位置,一般填NULL?;贐asicRF的點(diǎn)對點(diǎn)無線通信staticvoidappSwitch(){

//BasicRF

初始化

basicRfConfig.myAddr=SWITCH_ADDR;

if(basicRfInit(&basicRfConfig)==FAILED){

HAL_ASSERT(FALSE);}//KeepReceiveroffwhennotneededtosavepowerbasicRfReceiveOff();//Mainloopwhile(TRUE){if(halButtonPushed()==HAL_BUTTON_1){

bsicRfSendPacket(LIGHT_ADDR,pTxData,APP_PAYLOAD_LENGTH);//PutMCUtosleep.ItwillwakeuponjoystickinterrupthalIntOff();halMcuSetLowPowerMode(HAL_MCU_LPM_3);//Willturnonglobal//interruptenablehalIntOn();}}}基于BasicRF的點(diǎn)對點(diǎn)無線通信選擇左邊窗口application下的light_switch.c打開,找到main()函數(shù)里的以下代碼:

//被點(diǎn)燈的板打開此函數(shù)(appLight)appLight();//作為開關(guān)板打開此函數(shù)(appSwitch)

appSwitch();基于BasicRF的點(diǎn)對點(diǎn)無線通信通信任務(wù)及結(jié)果給兩塊開發(fā)板上電,按下A開發(fā)板的S1,B開發(fā)板的D1會(huì)被點(diǎn)亮。智能產(chǎn)品設(shè)計(jì)與應(yīng)用主講教師:肖俊芳基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用案例導(dǎo)入01/PART

ONE基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用使用2塊CC2530模塊,進(jìn)行無線數(shù)據(jù)通信A模塊按下k1,發(fā)送數(shù)據(jù)0x02給B模塊,B模塊收到數(shù)據(jù)后LED1狀態(tài)取反。B模塊按下k1,發(fā)送數(shù)據(jù)0x02給A模塊,A模塊收到數(shù)據(jù)后LED1狀態(tài)取反。RF頻道設(shè)置為25,網(wǎng)絡(luò)ID為0x2007;兩個(gè)模塊地址分別為:0x2520和0xBEEF。任務(wù):點(diǎn)對點(diǎn)無線通信CC2530模塊ACC2530模塊B基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用任務(wù):點(diǎn)對點(diǎn)無線通信A模塊按下K1無線數(shù)據(jù)0x02B模塊LED1取反發(fā)送接收B模塊按下K1無線數(shù)據(jù)0x02A模塊LED1取反發(fā)送接收基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用參數(shù)配置、初始化硬件PANID、信道、本機(jī)地址、目標(biāo)地址---結(jié)構(gòu)體如何把數(shù)據(jù)發(fā)送出去?發(fā)給誰?發(fā)什么?如何把接收到的數(shù)據(jù)準(zhǔn)確的取出來?如何知道新數(shù)據(jù)到來如何取出新數(shù)據(jù)任務(wù):點(diǎn)對點(diǎn)無線通信基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用任務(wù):點(diǎn)對點(diǎn)無線通信一、無線參數(shù)配置1.通信頻道和網(wǎng)絡(luò)ID#defineRF_CHANNEL25//RF頻道#definePAN_ID0x2007//網(wǎng)絡(luò)ID2.點(diǎn)對點(diǎn)通訊地址設(shè)置開始//#defineMY_ADDR0x2520//本機(jī)模塊地址//#defineSEND_ADDR0xBEEF//發(fā)送模塊地址#defineSEND_ADDR0x2520//本機(jī)模塊地址#defineMY_ADDR0xBEEF//發(fā)送模塊地址3.端口引腳定義#defineLED1P1_0//led1#definek1P0_14.數(shù)據(jù)定義staticbasicRfCfg_tbasicRfConfig;//這個(gè)需要unsignedchardat_send;//存放通過無線模塊要發(fā)送的數(shù)據(jù)unsignedchardat_recv;//存放通過無線模塊接收的數(shù)據(jù)typedefstruct{uint16myAddr;//本機(jī)地址uint16panId;//網(wǎng)絡(luò)ID,與其他模塊一致uint8channel;//通信信道,一致uint8ackRequest;//應(yīng)答信號(hào)#ifdefSECURITY_CCM//是否加密uint8*securityKey;uint8*securityNonce;#endif}basicRfCfg_t;basic_rf.h文件通過basicRfInit(basicRfCfg_t*pRfConfit)函數(shù),將參數(shù)寫入到無線模塊中基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用任務(wù):點(diǎn)對點(diǎn)無線通信二、無線模塊初始化voidConfigRf_Init(void){basicRfConfig.panId=PAN_ID;//網(wǎng)絡(luò)

0x2007basicRfConfig.channel=RF_CHANNEL;//RF頻道25basicRfConfig.myAddr=MY_ADDR;//本機(jī)地址0xBEEFbasicRfConfig.ackRequest=TRUE;#ifdefSECURITY_CCMbasicRfConfig.securityKey=key;#endifwhile(basicRfInit(&basicRfConfig)==FAILED);//將參數(shù)寫入到無線模塊中。basicRfReceiveOn();//開啟無線模塊的數(shù)據(jù)接收功能}hal_rf.cuint8halRfInit(void)//{FRMCTRL0|=(AUTO__ACK|AUTO__CRC)TXFILTCFG=0x09;AGCCTRL1=0x15;FSCAL1=0x00halPaLnaInit();//自動(dòng)確認(rèn)和允許隨機(jī)數(shù)產(chǎn)生halRfEnableRxInterrupt();//使能接收中斷returnSUCCESS;}該函數(shù)初始化射頻無線模塊,設(shè)置默認(rèn)配置選項(xiàng),允許自動(dòng)確認(rèn)和允許隨機(jī)數(shù)產(chǎn)生。在開發(fā)中,直接調(diào)用該函數(shù)來初始化無線模塊,不需要關(guān)注該函數(shù)的實(shí)現(xiàn)細(xì)節(jié)?;贐asicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用任務(wù):點(diǎn)對點(diǎn)無線通信三、無線數(shù)據(jù)發(fā)送先創(chuàng)建一個(gè)字節(jié)數(shù)組作為數(shù)據(jù)發(fā)送的緩沖區(qū),將要發(fā)送的內(nèi)容置于數(shù)組之中,然后調(diào)用無線數(shù)據(jù)發(fā)送函數(shù)進(jìn)行發(fā)送即可。uint8

basicRfSendPacket(

uint16

destAddr,

//發(fā)送的目標(biāo)地址

uint8*

pPayload,

//發(fā)送內(nèi)容的數(shù)組

uint8

length//發(fā)送數(shù)據(jù)的長度);

函數(shù)執(zhí)行成功返回:SUCCESS。函數(shù)執(zhí)行失敗返回:FAILED。基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用任務(wù):點(diǎn)對點(diǎn)無線通信四、無線數(shù)據(jù)接收basicRfPacketIsReady()查詢是否收到新的數(shù)據(jù)包,如果有新的數(shù)據(jù)包,則返回TRUE。新的數(shù)據(jù)包信息會(huì)存放在basicRfRxInfo_t類型結(jié)構(gòu)體的rxi中。basicRfReceive()把接收到的數(shù)據(jù)復(fù)制到自定義的緩沖區(qū)中,然后進(jìn)行使用。uint8

basicRfReceive(

uint8*

pRxData,

//數(shù)據(jù)接收緩沖區(qū)

uint8

len,

//要接收的數(shù)據(jù)長度

int16*

pRssi);

//無線信號(hào)強(qiáng)度函數(shù)執(zhí)行成功返回:接收的字節(jié)數(shù)。了解即可基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用1.通信頻道和網(wǎng)絡(luò)ID設(shè)置K1按下?發(fā)送數(shù)據(jù)basicRfSendPacket(SEND_ADDR,&dat_recv,1);如果收到數(shù)據(jù)?取出數(shù)據(jù)

basicRfReceive(&dat_recv,1,NULL);dat_recv==0x02?LED1=~LED1;main

IO端口初始化(按鍵和LED燈)2.點(diǎn)對點(diǎn)通信地址設(shè)置(發(fā)送地址和接收地址)4.數(shù)據(jù)定義:定義存放發(fā)送數(shù)據(jù)、接收數(shù)據(jù)的變量3.端口引腳定義,K1,LED1basicRfPacketIsReady()==true判斷收到的數(shù)據(jù)是否是0x02?基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用使用2塊CC2530模塊,進(jìn)行無線數(shù)據(jù)通信A模塊按下k1,發(fā)送數(shù)據(jù)0x02給B模塊,B模塊收到數(shù)據(jù)后LED1狀態(tài)取反。B模塊按下k1,發(fā)送數(shù)據(jù)0x02給A模塊,A模塊收到數(shù)據(jù)后LED1狀態(tài)取反。RF頻道設(shè)置為25,網(wǎng)絡(luò)ID為0x2007;兩個(gè)模塊地址分別為:#0x2520和0xBEEF在A模塊中顯示我是A模塊,在B模塊中顯示我是B模塊。任務(wù):點(diǎn)對點(diǎn)無線通信CC2530模塊ACC2530模塊B我是A模塊

第1次按下K1

第1次收到數(shù)據(jù)LED1點(diǎn)亮/熄滅我是B模塊

第1次按下K1

第1次收到數(shù)據(jù)LED1點(diǎn)亮/熄滅基于BasicRF的點(diǎn)對點(diǎn)無線通信應(yīng)用任務(wù):點(diǎn)對點(diǎn)無線通信

通信頻道和網(wǎng)絡(luò)ID設(shè)置

點(diǎn)對點(diǎn)通信地址設(shè)置IO端口初始化set_clock_32();//設(shè)置時(shí)鐘32Init_Uart0();//串口初始化if(halRfInit()==FAILED){HAL_ASSERT(FALSE);}//初始化射頻模塊,設(shè)置默認(rèn)配置選項(xiàng),允許自動(dòng)確認(rèn)和允許隨機(jī)數(shù)產(chǎn)生halLedSet(1);///以上不管Send_String("HELLO!\r\n");K1按下?發(fā)送數(shù)據(jù)basicRfSendPacket(SEND_ADDR,&dat_recv,1);如果收到數(shù)據(jù)?取出數(shù)據(jù)basicRfReceive(&dat_recv,1,NULL);dat_recv==0x02?LED1=~LED1;main智能產(chǎn)品設(shè)計(jì)與應(yīng)用5.zigbee協(xié)議棧案例導(dǎo)入01/PART

ONEZigBee協(xié)議棧什么是ZigBee協(xié)議棧呢?它和ZigBee協(xié)議有什么關(guān)系呢?協(xié)議是一系列的通信標(biāo)準(zhǔn),通信雙方需要共同按照這一標(biāo)準(zhǔn)進(jìn)行正常的數(shù)據(jù)發(fā)射和接收。協(xié)議棧是協(xié)議的具體實(shí)現(xiàn)形式。通俗點(diǎn)來理解就是協(xié)議棧是協(xié)議和用戶之間的一個(gè)接口,開發(fā)人員通過使用協(xié)議棧來使用這個(gè)協(xié)議的,進(jìn)而實(shí)現(xiàn)無線數(shù)據(jù)收發(fā)。ZigBee協(xié)議棧簡介ZigBee協(xié)議棧Z-Stack就是符合Zigbee協(xié)議棧規(guī)范的一個(gè)硬件和軟件平臺(tái),是Zigbee協(xié)議棧的一個(gè)具體實(shí)現(xiàn)。Z-Stack是TI公司提供的協(xié)議棧,它是個(gè)半開源的協(xié)議棧,有些核心代碼是以庫的形式提供的。ZigBee協(xié)議棧規(guī)范和Z-Stack的關(guān)系ZigBee協(xié)議棧ZigBee的協(xié)議分為兩部分,IEEE802.15.4定義了PHY(物理層);MAC(介質(zhì)訪問層)技術(shù)規(guī)范;ZigBee聯(lián)盟定義了NWK(網(wǎng)絡(luò)層);APS(應(yīng)用程序支持子層);APL(應(yīng)用層)技術(shù)規(guī)范。;ZigBee協(xié)議棧就是將各個(gè)層定義的協(xié)議都集合在一起,以函數(shù)的形式實(shí)現(xiàn),并給用戶提供API(應(yīng)用層),用戶可以直接調(diào)用。ZigBee無線網(wǎng)絡(luò)協(xié)議層的架構(gòu)圖ZigBee協(xié)議棧ZigBee無線網(wǎng)絡(luò)協(xié)議層的架構(gòu)圖ZigBee協(xié)議棧協(xié)議棧是協(xié)議的實(shí)現(xiàn),可以理解為代碼,函數(shù)庫,供上層應(yīng)用調(diào)用,協(xié)議較底下的層與應(yīng)用是相互獨(dú)立的。商業(yè)化的協(xié)議棧已寫好了底層代碼,符合協(xié)議標(biāo)準(zhǔn),提供功能模塊供調(diào)用。需要關(guān)心的是應(yīng)用邏輯,數(shù)據(jù)從哪里到哪里,怎么存儲(chǔ),處理;系統(tǒng)里的設(shè)備之間的通信順序什么的;當(dāng)應(yīng)用需要數(shù)據(jù)通信時(shí),調(diào)用組網(wǎng)函數(shù)組建網(wǎng)絡(luò);當(dāng)從一個(gè)設(shè)備發(fā)數(shù)據(jù)到另一個(gè)設(shè)備時(shí),調(diào)用無線數(shù)據(jù)發(fā)送函數(shù);當(dāng)然,接收端就調(diào)用接收函數(shù);當(dāng)設(shè)備空閑時(shí),調(diào)用睡眠函數(shù);要干活的時(shí)候就調(diào)用喚醒函數(shù)。所以當(dāng)做具體應(yīng)用時(shí),不需要關(guān)心協(xié)議棧是怎么寫的,里面的每條代碼是什么意思。如何使用ZigBee協(xié)議棧ZigBee協(xié)議棧怎么使用ZigBee協(xié)議棧?舉個(gè)例子,用戶實(shí)現(xiàn)一個(gè)簡單的無線數(shù)據(jù)通信時(shí)的一般步驟:組網(wǎng):調(diào)用協(xié)議棧的組網(wǎng)函數(shù)、加入網(wǎng)絡(luò)函數(shù),實(shí)現(xiàn)網(wǎng)絡(luò)的建立與節(jié)點(diǎn)的加入。發(fā)送:發(fā)送節(jié)點(diǎn)調(diào)用協(xié)議棧的無線數(shù)據(jù)發(fā)送函數(shù),實(shí)現(xiàn)無線數(shù)據(jù)發(fā)送。接收:接收節(jié)點(diǎn)調(diào)用協(xié)議棧的無線數(shù)據(jù)接收函數(shù),實(shí)現(xiàn)無線數(shù)據(jù)接收。如何使用ZigBee協(xié)議棧ZigBee協(xié)議棧解壓《ZStack-CC2530-2.3.0-1.4.0協(xié)議棧安裝文件.rar》;解壓得到.exe文件,雙擊進(jìn)行安裝,路徑選擇默認(rèn),也可以選擇想要安裝的位置。先來看看這個(gè)協(xié)議棧的目錄:ZigBee協(xié)議棧的安裝、編譯與下載ZigBee協(xié)議棧components,顧名思義這個(gè)是庫的文件夾,里面放了一些我們用到的ZDO,driver,hal,zcl等庫的代碼。Documents,放TI的開發(fā)文檔的,里面很多協(xié)議棧API資料。Projects,這個(gè)文件夾放的是TI協(xié)議棧的例子程序,例子程序以project的形式存放。Tools,放上位機(jī)之類的程序,作為工具使用。ZigBee協(xié)議棧的安裝、編譯與下載ZigBee協(xié)議棧ZigBee協(xié)議棧App:應(yīng)用層目錄,這是用戶創(chuàng)建各種不同工程的區(qū)域,在這個(gè)目錄中包含了應(yīng)用層的內(nèi)容和這個(gè)項(xiàng)目的主要內(nèi)容。HAL:硬件層目錄,包含有與硬件相關(guān)的配置和驅(qū)動(dòng)及操作函數(shù)。MAC:MAC層目錄,包含了

MAC層的參數(shù)配

置文件及其

MAC的

LIB庫的函數(shù)接口文件。MT:實(shí)現(xiàn)通過串口可控制各層,并與各層進(jìn)行直接交互。NWK:網(wǎng)絡(luò)層目錄,包含網(wǎng)絡(luò)層配置參數(shù)文件網(wǎng)絡(luò)層庫的函數(shù)接口文件及APS層庫的函數(shù)接口。OSAL:協(xié)議棧的操作系統(tǒng)。Profile:

Applicationframework應(yīng)用框架層目錄,包含AF層處理函數(shù)文件。應(yīng)用框架層是應(yīng)用程序和APS層的無線數(shù)據(jù)接口。Security:安全層目錄,包含安全層處理函數(shù),比如加密函數(shù)等。Services:地址處理函數(shù)目錄,包括地址模式的定義及地址處理函數(shù)。Tools:工程配置目錄,包括空間劃分及Z-Stack相關(guān)配置信息。ZDO:ZDO目錄ZMac:MAC層目錄,包括

MAC層參數(shù)配置及

MAC層

LIB庫函數(shù)回調(diào)處理函數(shù)。ZMain:主函數(shù)目錄,包括入口函數(shù)及硬件配置文件。Output:輸出文件目錄,由IARIDE自動(dòng)生成。ZigBee協(xié)議棧打開工程在Projects\zstack\Samples\SampleApp\CC2530DB\xxxxx.eww(1)編譯協(xié)議器的程序,在Workspace下拉框中選擇“CoordinatorEB-Pro”,在工程名上點(diǎn)右鍵選擇“RebuildAll”,沒錯(cuò)誤提示再下載到開發(fā)板當(dāng)中。ZigBee協(xié)議棧的安裝、編譯與下載ZigBee協(xié)議棧(2)編譯終端設(shè)備的程序選擇“EndDeviceEB-Pro”編譯下載即可。兩個(gè)zigbee

節(jié)點(diǎn)都下載好后,分別上電看效果。ZigBee協(xié)議棧的安裝、編譯與下載智能產(chǎn)品設(shè)計(jì)與應(yīng)用主講教師:肖俊芳Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目案例導(dǎo)入01/PART

ONEZstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目1組網(wǎng)終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器協(xié)調(diào)器收到D1后,LED1閃爍,同時(shí)發(fā)送D1給終端終端收到D1,LED1閃爍任務(wù):協(xié)議棧無線收發(fā)控制LED通信Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目1數(shù)據(jù)收發(fā)系統(tǒng)事件0X8000周期性事件接收屬于本應(yīng)用任務(wù)SampleApp的消息按鍵事件0xC0接收數(shù)據(jù)事件0x1A網(wǎng)絡(luò)狀態(tài)發(fā)生改變0xD1按鍵處理函數(shù)SampleApp_HandleKeys信息處理函數(shù)SampleApp_MessageMSGCB協(xié)調(diào)器終端節(jié)點(diǎn)顯示內(nèi)容觸發(fā)周期性事件周期性事件處理函數(shù)SampleApp_SendPeriodicMessage用戶應(yīng)用任務(wù)的事件處理函數(shù)SampleApp_ProcessEventZstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目1數(shù)據(jù)收發(fā)接收數(shù)據(jù)事件0x1A信息處理函數(shù)SampleApp_MessageMSGCB//接收數(shù)據(jù),參數(shù)為接收到的數(shù)據(jù)voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){…}typedefstruct{byteTransSeqNumber;uint16DataLength;//存放收到數(shù)據(jù)的長度byte*Data;//存放收到的數(shù)據(jù)}afMSGCommandFormat_t;Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目1數(shù)據(jù)收發(fā)接收數(shù)據(jù)事件0x1A信息處理函數(shù)SampleApp_MessageMSGCB//接收數(shù)據(jù),參數(shù)為接收到的數(shù)據(jù)voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){uint16flashTime;bytebuf[3];switch(pkt->clusterId)//判斷簇ID{caseSAMPLEAPP_PERIODIC_CLUSTERID://=1,收到廣播數(shù)據(jù)osal_memset(buf,0,3);//為一字符串集體賦同一數(shù)值,buf,全部清0

osal_memcpy(buf,pkt->cmd.Data,2);//復(fù)制數(shù)據(jù)到緩沖區(qū)中

……..caseSAMPLEAPP_FLASH_CLUSTERID://=2,收到組播數(shù)據(jù)flashTime=BUILD_UINT16(pkt->cmd.Data[1],pkt->cmd.Data[2]);HalLedBlink(HAL_LED_4,4,50,(flashTime/4));break;}}typedefstruct{byteTransSeqNumber;uint16DataLength;

//存放收到數(shù)據(jù)的長度

byte*Data;//存放收到的數(shù)據(jù)}afMSGCommandFormat_t;Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目2任務(wù)要求:協(xié)調(diào)器和終端節(jié)點(diǎn)液晶顯示不同字符串組網(wǎng)液晶顯示:在協(xié)調(diào)器液晶屏幕的第3行,顯示“I’mA!”;在終端節(jié)點(diǎn)液晶屏幕的第3行,顯示“I’mB!”終端發(fā)送數(shù)據(jù)給協(xié)調(diào)器:終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器接收數(shù)據(jù):協(xié)調(diào)器收到D1后,LED1閃爍,同時(shí)發(fā)送D1給終端終端收到D1,LED1閃爍任務(wù):協(xié)調(diào)器、終端節(jié)點(diǎn)分別顯示字符串………I’mA!………I’mB!協(xié)調(diào)器終端節(jié)點(diǎn)Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目21.協(xié)調(diào)器和終端分別顯示信息ZDO_STATE_CHANGE網(wǎng)絡(luò)狀態(tài)發(fā)生變化0xD1如果是協(xié)調(diào)器,顯示“I’mA!”如果是終端:1.顯示“I‘mB!”2.設(shè)置周期性事件(每3s觸發(fā)一次,發(fā)送數(shù)據(jù))osal_start_timerEx(…)SAMPLEAPP_SEND_PERIODIC_MSG_EVTif(SampleApp_NwkState==DEV_ZB_COORD)//如果是協(xié)調(diào)器{

HalLcdWriteString(“I’mA!”,3);//協(xié)調(diào)器的第3行顯示I’mA!}

if((SampleApp_NwkState==DEV_ROUTER)||(SampleApp_NwkState==DEV_END_DEVICE))//如果是路由終端或終端節(jié)點(diǎn){HalLcdWriteString(“I‘mB!”,3);//終端的第3行顯示I’mB!}Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目22.終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器SAMPLEAPP_SEND_PERIODIC_MSG_EVT0x0001周期性發(fā)送數(shù)據(jù)事件SampleApp_SendPeriodicMessage();//終端節(jié)點(diǎn)周期性發(fā)送"D1"給寫協(xié)調(diào)器如果是終端:1.顯示“I‘mB!”2.設(shè)置周期性事件(每3s觸發(fā)一次,發(fā)送數(shù)據(jù))osal_start_timerEx(…)SAMPLEAPP_SEND_PERIODIC_MSG_EVTosal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,//0x0001SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);//3000if(events&SAMPLEAPP_SEND_PERIODIC_MSG_EVT)//0X0001,每3s執(zhí)行一次{SampleApp_SendPeriodicMessage();//終端節(jié)點(diǎn)周期性發(fā)送"D1"給寫協(xié)調(diào)器osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+(osal_rand()&0x00FF)));//設(shè)置下一次周期事件}Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目22.終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器byteSendData[3]="D1";//調(diào)AF_DataRequest將數(shù)據(jù)無線廣播出去if(AF_DataRequest(…2,//發(fā)送數(shù)據(jù)長度

SendData,//發(fā)送數(shù)據(jù)緩沖區(qū)…)發(fā)送數(shù)據(jù)Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目22.終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器SampleApp_SendPeriodicMessage();

//處理周期性事件,終端節(jié)點(diǎn)周期性發(fā)送"D1"給協(xié)調(diào)器byteSendData[3]=“D1”;//要發(fā)送的數(shù)據(jù)//調(diào)用AF_DataRequest將數(shù)據(jù)無線廣播出去if(AF_DataRequest(&SampleApp_Periodic_DstAddr,

//發(fā)送目的地址+端點(diǎn)地址和傳送模式//在這個(gè)函數(shù)SampleApp_Init中,定義了廣播,端口號(hào),廣播地址,&SampleApp_epDesc,//源(答復(fù)或確認(rèn))終端的描述(比如操作系統(tǒng)中任務(wù)ID等)源EPSAMPLEAPP_PERIODIC_CLUSTERID,//被Profile指定的有效的集群號(hào)

2,//發(fā)送數(shù)據(jù)長度SendData,//發(fā)送數(shù)據(jù)緩沖區(qū)&SampleApp_TransID,//任務(wù)ID號(hào)AF_DISCV_ROUTE,//有效位掩碼的發(fā)送選項(xiàng)AF_DEFAULT_RADIUS)==afStatus_SUCCESS)

//傳送跳數(shù),通常設(shè)置為AF_DEFAULT_RADIUS{//發(fā)送數(shù)據(jù)成功,什么都不做}

else{HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);//0X01,0X01//發(fā)送數(shù)據(jù)失敗,LED1點(diǎn)亮}}Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目22.終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器SampleApp_Periodic_DstAddr.addrMode=(afAddrMode_t)AddrBroadcast;//廣播SampleApp_Periodic_DstAddr.endPoint=SAMPLEAPP_ENDPOINT;//指定端點(diǎn)號(hào)20SampleApp_Periodic_DstAddr.addr.shortAddr=0xFFFF;//指定目的網(wǎng)絡(luò)地址為廣播地址typedefstruct{union{uint16shortAddr;//網(wǎng)絡(luò)地址ZLongAddr_textAddr;}addr;afAddrMode_taddrMode;byteendPoint;uint16panId;}afAddrType_t;typedefenum{afAddrNotPresent=AddrNotPresent,afAddr16Bit=Addr16Bit,//單播afAddr64Bit=Addr64Bit,afAddrGroup=AddrGroup,//組播afAddrBroadcast=AddrBroadcast//廣播}afAddrMode_t;地址定義:afAddrType_tSampleApp_Periodic_DstAddr;協(xié)調(diào)器地址0x0000,如果只發(fā)給協(xié)調(diào)器,地址就是0x0000在任務(wù)初始化中給出了發(fā)送方式SampleApp_InitZstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目2協(xié)調(diào)器收到D1后,LED1閃爍,同時(shí)發(fā)送D1給終端,終端收到D1,LED1閃爍3.終端和協(xié)調(diào)器收到數(shù)據(jù)AF_INCOMING_MSG_CMD//收到數(shù)據(jù)0x1ASampleApp_MessageMSGCB(MSGpkt);處理收到的數(shù)據(jù)如果是D1?LED1間隔500ms閃爍如果是協(xié)調(diào)器?發(fā)送D1數(shù)據(jù)給終端Events=0X8000系統(tǒng)事件caseAF_INCOMING_MSG_CMD://接收數(shù)據(jù)事件,調(diào)用函數(shù)AF_DataRequest()接收數(shù)據(jù)SampleApp_MessageMSGCB(MSGpkt);//調(diào)用回調(diào)函數(shù)對收到的數(shù)據(jù)進(jìn)行處理break;Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目2協(xié)調(diào)器收到D1后,LED1閃爍,同時(shí)發(fā)送D1給終端,終端收到D1,LED1閃爍3.終端和協(xié)調(diào)器收到數(shù)據(jù)AF_INCOMING_MSG_CMD//收到數(shù)據(jù)0x1ASampleApp_MessageMSGCB(MSGpkt);處理收到的數(shù)據(jù)如果是D1?LED1間隔500ms閃爍如果是協(xié)調(diào)器?發(fā)送D1數(shù)據(jù)給終端Events=0X8000系統(tǒng)事件

bytebuf[3];//定義一個(gè)存放收到數(shù)據(jù)的數(shù)組變量switch(pkt->clusterId)//判斷簇ID{

caseSAMPLEAPP_PERIODIC_CLUSTERID://收到廣播數(shù)據(jù)1osal_memset(buf,0,3);//為一字符串集體賦同一數(shù)值,buf,全部清0osal_memcpy(buf,pkt->cmd.Data,2);//復(fù)制數(shù)據(jù)到緩沖區(qū)中

if(buf[0]=='D'&&buf[1]=='1')//判斷收到的數(shù)據(jù)是否為"D1"

{HalLedBlink(HAL_LED_1,0,50,500);//如果是則Led1間隔500ms閃爍#ifdefined(ZDO_COORDINATOR)//協(xié)調(diào)器收到"D1"后,返回"D1"給終端,讓終端Led1也閃爍SampleApp_SendPeriodicMessage();//發(fā)送數(shù)據(jù)#endif}else{HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);}break;caseSAMPLEAPP_FLASH_CLUSTERID://收到組播數(shù)據(jù)Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目2協(xié)調(diào)器收到D1后,LED1閃爍,同時(shí)發(fā)送D1給終端,終端收到D1,LED1閃爍3.終端和協(xié)調(diào)器收到數(shù)據(jù)HalLedBlink(HAL_LED_1,

0,

50,

500);//如果是則Led1間隔500ms閃爍HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);LED1閃爍次數(shù)0:一直閃爍亮滅比例50%周期:500ms#defineHAL_LED_MODE_OFF0x00#defineHAL_LED_MODE_ON0x01#defineHAL_LED_MODE_BLINK0x02#defineHAL_LED_MODE_FLASH0x04#defineHAL_LED_MODE_TOGGLE0x08點(diǎn)亮熄滅智能產(chǎn)品設(shè)計(jì)與應(yīng)用6.Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目案例導(dǎo)入01/PART

ONEZstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目1組網(wǎng)終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器協(xié)調(diào)器收到D1后,LED1閃爍,同時(shí)發(fā)送D1給終端終端收到D1,LED1閃爍任務(wù):協(xié)議棧無線收發(fā)控制LED通信Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目1數(shù)據(jù)收發(fā)系統(tǒng)事件0X8000周期性事件接收屬于本應(yīng)用任務(wù)SampleApp的消息按鍵事件0xC0接收數(shù)據(jù)事件0x1A網(wǎng)絡(luò)狀態(tài)發(fā)生改變0xD1按鍵處理函數(shù)SampleApp_HandleKeys信息處理函數(shù)SampleApp_MessageMSGCB協(xié)調(diào)器終端節(jié)點(diǎn)顯示內(nèi)容觸發(fā)周期性事件周期性事件處理函數(shù)SampleApp_SendPeriodicMessage用戶應(yīng)用任務(wù)的事件處理函數(shù)SampleApp_ProcessEventZstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目1數(shù)據(jù)收發(fā)接收數(shù)據(jù)事件0x1A信息處理函數(shù)SampleApp_MessageMSGCB//接收數(shù)據(jù),參數(shù)為接收到的數(shù)據(jù)voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){…}typedefstruct{byteTransSeqNumber;uint16DataLength;//存放收到數(shù)據(jù)的長度byte*Data;//存放收到的數(shù)據(jù)}afMSGCommandFormat_t;Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目1數(shù)據(jù)收發(fā)接收數(shù)據(jù)事件0x1A信息處理函數(shù)SampleApp_MessageMSGCB//接收數(shù)據(jù),參數(shù)為接收到的數(shù)據(jù)voidSampleApp_MessageMSGCB(afIncomingMSGPacket_t*pkt){uint16flashTime;bytebuf[3];switch(pkt->clusterId)//判斷簇ID{caseSAMPLEAPP_PERIODIC_CLUSTERID://=1,收到廣播數(shù)據(jù)osal_memset(buf,0,3);//為一字符串集體賦同一數(shù)值,buf,全部清0

osal_memcpy(buf,pkt->cmd.Data,2);//復(fù)制數(shù)據(jù)到緩沖區(qū)中

……..caseSAMPLEAPP_FLASH_CLUSTERID://=2,收到組播數(shù)據(jù)flashTime=BUILD_UINT16(pkt->cmd.Data[1],pkt->cmd.Data[2]);HalLedBlink(HAL_LED_4,4,50,(flashTime/4));break;}}typedefstruct{byteTransSeqNumber;uint16DataLength;

//存放收到數(shù)據(jù)的長度

byte*Data;//存放收到的數(shù)據(jù)}afMSGCommandFormat_t;Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目2任務(wù)要求:協(xié)調(diào)器和終端節(jié)點(diǎn)液晶顯示不同字符串組網(wǎng)液晶顯示:在協(xié)調(diào)器液晶屏幕的第3行,顯示“I’mA!”;在終端節(jié)點(diǎn)液晶屏幕的第3行,顯示“I’mB!”終端發(fā)送數(shù)據(jù)給協(xié)調(diào)器:終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器接收數(shù)據(jù):協(xié)調(diào)器收到D1后,LED1閃爍,同時(shí)發(fā)送D1給終端終端收到D1,LED1閃爍任務(wù):協(xié)調(diào)器、終端節(jié)點(diǎn)分別顯示字符串………I’mA!………I’mB!協(xié)調(diào)器終端節(jié)點(diǎn)Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目21.協(xié)調(diào)器和終端分別顯示信息ZDO_STATE_CHANGE網(wǎng)絡(luò)狀態(tài)發(fā)生變化0xD1如果是協(xié)調(diào)器,顯示“I’mA!”如果是終端:1.顯示“I‘mB!”2.設(shè)置周期性事件(每3s觸發(fā)一次,發(fā)送數(shù)據(jù))osal_start_timerEx(…)SAMPLEAPP_SEND_PERIODIC_MSG_EVTif(SampleApp_NwkState==DEV_ZB_COORD)//如果是協(xié)調(diào)器{

HalLcdWriteString(“I’mA!”,3);//協(xié)調(diào)器的第3行顯示I’mA!}

if((SampleApp_NwkState==DEV_ROUTER)||(SampleApp_NwkState==DEV_END_DEVICE))//如果是路由終端或終端節(jié)點(diǎn){HalLcdWriteString(“I‘mB!”,3);//終端的第3行顯示I’mB!}Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目22.終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器SAMPLEAPP_SEND_PERIODIC_MSG_EVT0x0001周期性發(fā)送數(shù)據(jù)事件SampleApp_SendPeriodicMessage();//終端節(jié)點(diǎn)周期性發(fā)送"D1"給寫協(xié)調(diào)器如果是終端:1.顯示“I‘mB!”2.設(shè)置周期性事件(每3s觸發(fā)一次,發(fā)送數(shù)據(jù))osal_start_timerEx(…)SAMPLEAPP_SEND_PERIODIC_MSG_EVTosal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,//0x0001SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT);//3000if(events&SAMPLEAPP_SEND_PERIODIC_MSG_EVT)//0X0001,每3s執(zhí)行一次{SampleApp_SendPeriodicMessage();//終端節(jié)點(diǎn)周期性發(fā)送"D1"給寫協(xié)調(diào)器osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT+(osal_rand()&0x00FF)));//設(shè)置下一次周期事件}Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目22.終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器byteSendData[3]="D1";//調(diào)AF_DataRequest將數(shù)據(jù)無線廣播出去if(AF_DataRequest(…2,//發(fā)送數(shù)據(jù)長度

SendData,//發(fā)送數(shù)據(jù)緩沖區(qū)…)發(fā)送數(shù)據(jù)Zstack協(xié)議組網(wǎng)程序設(shè)計(jì)項(xiàng)目22.終端設(shè)備聯(lián)網(wǎng),發(fā)送D1給協(xié)調(diào)器SampleApp_SendPeriodicMessage();

//處理周期性事件,終端節(jié)點(diǎn)周期性發(fā)送"D1"給協(xié)調(diào)器byteSendData[3]=“D1”;//要發(fā)送的數(shù)據(jù)//調(diào)用AF_DataRequest將數(shù)據(jù)無線廣播出去if(AF_DataRequest(&SampleApp_Periodic_DstAddr,

//發(fā)送目的地址+端點(diǎn)地址和傳送模式//在這個(gè)函數(shù)SampleApp_Init中,定義了廣播,端口號(hào),廣播地址,&SampleApp_epDesc,//源(答復(fù)或確認(rèn))終端的描述(比如操作系統(tǒng)中任務(wù)ID等)源EP

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論