1、刚开始,我们确实需要借助官方模板,添加简单的代码,做出通信基本收发实验,建立感性的认识。
2、然后,在官方代码基本实验基础上,了解相关的概念,掌握通信过程中原理,结合自己的理解,自己动手做一个个性化实验,验证我们的理解。
单播
在Zigbee网络里,模块之间要进行通信,发射模块非常明确知道接收模块的网络地址,以这个地址发送数据给接收模块,叫单播。
Zigbee模块的地址特点:
模块在入网的时候,父节点随机分配网络地址给子节点。但是协调器模块在网络里的地址永远是0x0000.
在同一个工程里面通过选项卡控制不同的文件的编译细节!复制SimonAPP.c文件作为Enddevice.c文件,然后选择不同选项卡,通过文件的option设置,利用Exclude from build选项设置某个文件在某个选项卡下是否参与编译!!!
发送单个字符
发送模块—终端节点
在Enddevice.c文件里的SimonApp_MY_EVT事件处理中按钮1 按下的相关处理代码:
if ( events & SimonApp_MY_EVT )
{
if(0==P1_1)
{//按钮3按下
LS164_BYTE(3);
char theMessageData[] ={8};
SimonApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
SimonApp_DstAddr.addr.shortAddr = 0x0000;
// Take the first endpoint, Can be changed to search through endpoints
SimonApp_DstAddr.endPoint =SimonApp_ENDPOINT ;
AF_DataRequest( &SimonApp_DstAddr, &SimonApp_epDesc,
SimonApp_CLUSTERID,
1,//(byte)osal_strlen( theMessageData ) + 1,
(byte *)&theMessageData,
&SimonApp_TransID,
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
P1SEL &=0Xfe;// 翻转LED
P1DIR |=0X01;
P1_0 ^=1;
}
if(0==P2_0)
{//按钮4按下
LS164_BYTE(4);
}
if(0==P0_5)
{//按钮5按下
LS164_BYTE(5);
}
return (events ^ SimonApp_MY_EVT);
}
接收模块—协调器
接收的大概过程是,当终端模块发送数据时候,协调器模块底层任务拿到这个无线数据,给我们应用层任务发送一个AF_INCOMING_MSG_CMD在消息处理里,我们把有用数据拿出来在数码管上显示。
SimonAPP.c里面:
void SimonApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )
{
switch ( pkt->clusterId )
{
case SimonApp_CLUSTERID:
// "the" message
#if defined( LCD_SUPPORTED )
HalLcdWriteScreen( (char*)pkt->cmd.Data, "rcvd" );
#elif defined( WIN32 )
WPRINTSTR( pkt->cmd.Data );
#endif
LS164_BYTE(pkt->cmd.Data[0]);
break;
}
}
发送字符串
发送模块
在Enddevice.c文件里的SimonApp_MY_EVT事件处理中按钮1 按下的相关处理代码:
if ( events & SimonApp_MY_EVT )
{
if(0==P1_1)
{//按钮3按下
LS164_BYTE(3);
char theMessageData[] ="Hello Simon";
SimonApp_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;
SimonApp_DstAddr.addr.shortAddr = 0x0000;
// Take the first endpoint, Can be changed to search through endpoints
SimonApp_DstAddr.endPoint =SimonApp_ENDPOINT ;
AF_DataRequest( &SimonApp_DstAddr, &SimonApp_epDesc,
SimonApp_CLUSTERID,
(byte)osal_strlen( theMessageData ) + 1,
(byte *)&theMessageData,
&SimonApp_TransID,
AF_DISCV_ROUTE, AF_DEFAULT_RADIUS );
P1SEL &=0Xfe;// 翻转LED
P1DIR |=0X01;
P1_0 ^=1;
}
if(0==P2_0)
{//按钮4按下
LS164_BYTE(4);
}
if(0==P0_5)
{//按钮5按下
LS164_BYTE(5);
}
return (events ^ SimonApp_MY_EVT);
}
接收模块
1.因为要接收字符串,移植串口模块化文件,添加UART.C UART.h头文件到 工程源文件目录!!!
2.在ZMain.c文件的main 靠近模块void InitUart();初始化串口!!!
3.取消TI默认对串口的配置,在main函数找到 HalDriverInit函数,通过该函数修该宏定义:
把宏#define HAL_UART FALSE
4.在ZMain,c添加UART.h头文件初始化算完成了
5.在SimonApp_MessageMSGCB函数中添加:
Uart_Send_String(pkt->cmd.Data,pkt->cmd.DataLength);
记得在SDApp.c文件添加UART.h头文件