




已阅读5页,还剩47页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1.协议栈工作流程和无线收发控制 LED实验内容:1. ZigBee 协议栈简介2. 如何使用 ZigBee 协议栈3. ZigBee 协议栈的安装、编译与下载4. 协议栈无线收发控制 LED5. 协议栈工作流程实现现象:协调器、终端上电,组网成功后 D1 灯闪烁1. ZigBee 协议栈简介什么是 ZigBee 协议栈呢?它和 ZigBee 协议有什么关系呢?协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议的,进而实现无线数据收发。 图 1 展示了 ZigBee 无线网络协议层的架构图。ZigBee 的协议分为两部分,IEEE 802.15.4 定义了 PHY(物理层)和 MAC(介质访问层)技术规范;ZigBee联盟定义了 NWK(网络层)、APS(应用程序支持子层)、APL(应用层)技术规范。ZigBee协议栈就是将各个层定义的协议都集合在一直,以函数的形式实现,并给用户提供 API(应用层),用户可以直接调用。图 1 ZigBee 无线网络协议层2. 如何使用 ZigBee 协议栈协议栈是协议的实现,可以理解为代码,函数库,供上层应用调用,协议较底下的层与应用是相互独立的。商业化的协议栈就是给你写好了底层的代码,符合协议标准,提供给你一个功能模块给你调用。你需要关心的就是你的应用逻辑,数据从哪里到哪里,怎么存储,处理;还有系统里的设备之间的通信顺序什么的,当你的应用需要数据通信时,调用组网函数给你组建你想要的网络;当你想从一个设备发数据到另一个设备时,调用无线数据发送函数;当然,接收端就调用接收函数;当你的设备没事干的时候,你就调用睡眠函数;要干活的时候就调用唤醒函数。所以当你做具体应用时,不需要关心协议栈是怎么写的,里面的每条代码是什么意思。除非你要做协议研究。每个厂商的协议栈有区别,也就是函数名称和参数可能有区别,这个要看具体的例子、说明文档。怎么使用 ZigBee 协议栈?举个例子,用户实现一个简单的无线数据通信时的一般步骤:1、组网:调用协议栈的组网函数、加入网络函数,实现网络的建立与节点的加入。2、发送:发送节点调用协议栈的无线数据发送函数,实现无线数据发送。3、接收:接收节点调用协议栈的无线数据接收函数,实现无线数据接收。是不是看上去很简单啊,其实协议栈很多都封装好了,下面我们大概看看无线发送函数:1. afStatus_t AF_DataRequest( afAddrType_t *dstAddr,2.afStatus_t AF_DataRequest( afAddrType_t *dstAddr,2. endPointDesc_t *srcEP,3.endPointDesc_t *srcEP,3. uint16 cID,4.uint16 cID,4. uint16 len,5.uint16 len,5. uint8 *buf,6.uint8 *buf,6. uint8 *transID,7.uint8 *transID,7. uint8 options,8.uint8 options,8. uint8 radius )用户调用该函数即可实现数据的无线数据的发送,此函数中有8个参数,用户需要将每个参数的含义理解以后,才能熟练使用该函数进行无线数据通信的目的。现在只讲其中最重要的两个参数,其它参数不需要死记硬背,以后用多了自然就记住了。4. uint16 len, /发送数据的长度;5. uint8 *buf,5. uint8 *buf, /指向存放发送数据的缓冲区的指针。至于调用该函数后,如何初始化硬件进行数据发送等工作,用户不需要关心,ZigBee协议栈己经将所需要的工作做好了,我们只需要调用相应的API函数即可,而不必关心具体实现细节。看起来是不是很简单呢,是不是有动手试试的冲动。先别急还要先安装ZigBee协议栈才能进行开发调试呢,下面就动手安装ZigBee协议栈吧。3. ZigBee 协议栈的安装、编译与下载解压.相关资料与软件Zigbee 开发软件ZStack-CC2530-2.3.0-1.4.0 协议栈安装文件.rar ;解压得到.exe 文件,双击进行安装,路径你可以选择默认,同样你也可以选择你想要安装的位置。也许有人就困惑了,装完之后不是应该有个桌面图标的么?其实所谓的安装协议栈只是把一些文件解压到你安装的目录下。怎么用它呢?我们先来看看这个协议栈的目录Components,顾名思义这个是放我们的库的文件夹,里面放了一些我们用到的 ZDO,driver,hal,zcl 等库的代码Documents,这个不用说大家都知道是放 TI 的开发文档的,里面很多都是讲述协议栈的 API的有空时可以看看Projects,这个文件夹放的是 TI 协议栈的例子程序,一个个例子程序都是以一个个 project的形式给我们的,学好这些例子程序里面的一两个,基本你能做事情了。Tools,这个文件夹是放 TI 的例子程序的一些上位机之类的程序,作为工具使用。好了,基本明白了基本架构之后,我们以一个简单的实验开始。先掌握一点必要的理论再实验效果比较好。4. 协议栈无线收发控制 LED打开工程:.EB25305.zigbee 协议栈应用与组网1.协议栈工作流程和无线收发控制LEDZStack-CC2530-2.3.0-1.4.0ProjectszstackSamplesSampleAppCC2530DBSampleApp.eww ,从软件开发专业角度讲建议大家复制工程到非中文目录,因为有些开发环境对中文路径支持的不好,虽然 IAR 支持但在实际工作中你想别人看到你的工程,认为你很专业就照着上面做吧。我们演示就不修改,容易引起大家误会,打开工程如下图:App:应用层目录,这是用户创建各种不同工程的区域,在这个目录中包含了应用层的内容和这个项目的主要内容。HAL:硬件层目录,包含有与硬件相关的配置和驱动及操作函数。MAC:MAC 层目录,包含了 MAC 层的参数配置文件及其 MAC 的 LIB 库的函数接口文件。MT:实现通过串口可控制各层,并与各层进行直接交互NWK:网络层目录,包含网络层配置参数文件网络层库的函数接口文件及 APS层库的函数接口。OSAL:协议栈的操作系统。Profile: Application framework 应用框架层目录,包含 AF 层处理函数文件。应用框架层是应用程序和 APS 层的无线数据接口。Security:安全层目录,包含安全层处理函数,比如加密函数等Services:地址处理函数目录,包括地址模式的定义及地址处理函数。Tools:工程配置目录,包括空间划分及 Z-Stack 相关配置信息。ZDO:ZDO 目录ZMac:MAC 层目录,包括 MAC 层参数配置及 MAC 层 LIB 库函数回调处理函数。ZMain:主函数目录,包括入口函数及硬件配置文件。Output:输出文件目录,由 IAR IDE 自动生成。带协议栈的工程怎么这么多文件夹和文件,都有什么用啊?后面实验接触多了自然就懂了。1. 编译协议器的程序,在 Workspace 下拉框中选择“CoordinatorEB-Pro”,在工程名上点右键选择”Rebuild All”,没错误提示再下载到开发板当中。尽量教大家用一些快捷方法。2.编译终端设备的程序选择“EndDeviceEB-Pro”编译下载即可。两个 zigbee 节点都下载好后,分别上电看效果吧。协调器、终端上电,组网成功后 D1 灯闪烁。看完后是不是在想怎么实现的?下面我就带着大家分析协议栈工作流程:1) zigbee 工作流程2)看源码推荐大家使用 Source_Insight,十分强大的工具,从事软件必备软件,除非你想做菜鸟,具体使用请参考相关资料与软件Zigbee 参考资料 Source Insight 使用教程.pdf。下面列出实验中涉及到比较重要的函数进行详解,由于是带协议栈第一个实验,我们对源码也进行注释,方便习惯看源码的同志学习。我建议大家先看看下面的文章,再阅读一次源码加深印象,后面的例子结构基本相同,所以学好此实验,再做后面的实验就得心应手了。用户自己添加的应用任务程序在 Zstack 中的调用过程:main()- osal_init_system()- osalInitTasks()- SampleApp_Init()下面我们就先从 main()函数开始吧。提示:如果你第一次接触 ZStack,第一个实验的代码看注释只须大概知道它们是做什么的,有点印象就行了,后面实验会徐徐渐进,慢慢带领大家搞懂整个流程和代码的。如果刚开始就啃代码,不但效率低而且信心受损。2) 打开 ZMain.c 找到 main 函数int main( void )osal_int_disable( INTS_ALL ); /关闭所有中断HAL_BOARD_INIT(); /初始化系统时钟zmain_vdd_check(); /检查芯片电压是否正常InitBoard( OB_COLD ); /初始化 I/O ,LED 、Timer 等HalDriverInit(); /初始化芯片各硬件模块osal_nv_init( NULL ); /初始化 Flash 存储器ZMacInit(); /初始化 MAC 层zmain_ext_addr(); /确定 IEEE 64 位地址zgInit(); /初始化非易失变量#ifndef NONWK/ Since the AF isnt a task, call its initialization routineafInit();#endifosal_init_system();/初始化操作系统osal_int_enable( INTS_ALL );/使能全部中断InitBoard( OB_READY ); /最终板载初始化zmain_dev_info(); /显示设备信息#ifdef LCD_SUPPORTEDzmain_lcd_init(); /初始化 LCD#endif#ifdef WDT_IN_PM1/* If WDT is used, this is a good place to enable it. */WatchDogEnable( WDTIMX );#endifosal_start_system();/ No Return from here 执行操作系统,进去后不会返回return 0; / Shouldnt get here. / main()看了上面的代码后,可能感觉很多函数不认识。没关系刚开始大概了解流程即可,main 函数先执行初始化工作,包括硬件、网络层、任务等的初始化。然后执行 osal_start_system();操作系统。进去后可不会回来了。在这里,我们重点了解 2 个函数:l 初始化操作系统 osal_init_system();l 运行操作系统 osal_start_system();3) 先来看osal_init_system();系统初始化函数,进入函数。如果用IAR看代码可在函数名上单击右键go to definition of,便可以进入函数。发现里面有6个初始化函数,这里我们只关心 osalInitTasks();任务初始化函数,继续由该函数进入。void osalInitTasks( void )uint8 taskID = 0;/ 分配内存,返回指向缓冲区的指针tasksEvents = (uint16 *)osal_mem_alloc( sizeof( uint16 ) * tasksCnt);/ 设置所分配的内存空间单元值为 0osal_memset( tasksEvents, 0, (sizeof( uint16 ) * tasksCnt);/ 任务优先级由高向低依次排列,高优先级对应 taskID 的值反而小macTaskInit( taskID+ ); /macTaskInit(0) ,用户不需考虑nwk_init( taskID+ ); /nwk_init(1),用户不需考虑Hal_Init( taskID+ ); /Hal_Init(2) ,用户需考虑#if defined( MT_TASK ) /如果定义 MT_TASK 则调用 MT_TaskInit()MT_TaskInit( taskID+ );#endifAPS_Init( taskID+ ); /APS_Init(3) ,用户不需考虑#if defined ( ZIGBEE_FRAGMENTATION )APSF_Init( taskID+ );#endifZDApp_Init( taskID+ ); /ZDApp_Init(4) ,用户需考虑#if defined ( ZIGBEE_FREQ_AGILITY ) | defined ( ZIGBEE_PANID_CONFLICT )ZDNwkMgr_Init( taskID+ );#endif/用户创建的任务SampleApp_Init( taskID ); / SampleApp_Init _Init(5),用户需考虑。重要!函数对 taskID 进行初始化,每初始化一个,taskID+。大家看到了注释后面有些写着用户需要考虑,有些则写着用户不需考虑。没错,需要考虑的用户可以根据自己的硬件平台或者其他设置,而写着不需考虑的也是不能修改的。TI 公司协议栈已完成。SampleApp_Init()是我们 应 用 协 议 栈 例 程 的 必 要 函 数 , 用 户 通 常 在 这 里 初 始 化 自 己 的 东 西 。 至 此 ,osal_init_system();大概了解完毕。4) 接下来看第二个函数 osal_start_system();运行操作系统。同样用go to definition 的方法进入该函数。void osal_start_system( void )#if !defined ( ZBIT ) & !defined ( UBIT )for(;) / Forever Loop#endifuint8 idx = 0;osalTimeUpdate(); /扫描哪个事件被触发了,然后置相应的标志位Hal_ProcessPoll(); /轮询 TIMER 与 UARTdo if (tasksEventsidx) / Task is highest priority that is ready.break; /得到待处理的最高优先级任务索引号 idx while (+idx tasksCnt);if (idx hdr.event )/ Received when a key is pressedcase KEY_CHANGE:/按键事件SampleApp_HandleKeys( (keyChange_t *)MSGpkt)-state, (keyChange_t*)MSGpkt)-keys );break;/ Received when a messages is received (OTA) for this endpointcase AF_INCOMING_MSG_CMD: /接收数据事件,调用函数 AF_DataRequest()接收数据SampleApp_MessageMSGCB( MSGpkt ); /调用回调函数对收到的数据进行处理break;/ Received whenever the device changes state in the networkcase ZDO_STATE_CHANGE: /只要网络状态发生改变,就通过 ZDO_STATE_CHANGE 事件通知所有的任务。同时完成对协调器,路由器,终端的设置SampleApp_NwkState = (devStates_t)(MSGpkt-hdr.status);/if ( (SampleApp_NwkState = DEV_ZB_COORD) /实验中协调器只接收数据所以取消发送事件if ( (SampleApp_NwkState = DEV_ROUTER) | (SampleApp_NwkState =DEV_END_DEVICE) )/这个定时器只是为发送周期信息开启的,设备启动初始化后从这里开始触发第一个周期信息的发送,然后周而复始下去。osal_start_timerEx( SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT );else/ Device is no longer in the networkbreak;default:break;/ Release the memory /事件处理完了,释放消息占用的内存osal_msg_deallocate( (uint8 *)MSGpkt );/指针指向下一个放在缓冲区的待处理的事件,返回 while ( MSGpkt )重新处理事件,直到缓冲区没有等待处理事件为止MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );/ return unprocessed events /返回未处理的事件return (events SYS_EVENT_MSG);/ Send a message out - This event is generated by a timer/ (setup in SampleApp_Init().if ( events & SAMPLEAPP_SEND_PERIODIC_MSG_EVT )/处理周期性事件,利用 SampleApp_SendPeriodicMessage()处理完当前的周期性事件,然后启动定时器开启下一个周期性事情,这样一种循环下去,也即是上面说的周期性事件了,可以做为传感器定时采集、上传任务SampleApp_SendPeriodicMessage();/ Setup to send message again in normal period (+ a little jitter)osal_start_timerEx(SampleApp_TaskID,SAMPLEAPP_SEND_PERIODIC_MSG_EVT,(SAMPLEAPP_SEND_PERIODIC_MSG_TIMEOUT + (osal_rand() & 0x00FF) );/ return unprocessed events 返回未处理的事件return (events SAMPLEAPP_SEND_PERIODIC_MSG_EVT);/ Discard unknown eventsreturn 0;7) 分析接收数据函数 SampleApp_MessageMSGCB/接收数据,参数为接收到的数据void SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt )uint16 flashTime;byte buf3;switch ( pkt-clusterId ) /判断簇 IDcase SAMPLEAPP_PERIODIC_CLUSTERID: /收到广播数据osal_memset(buf, 0 , 3);osal_memcpy(buf, pkt-cmd.Data, 2); /复制数据到缓冲区中if(buf0=D & buf1=1) /判断收到的数据是否为“D1”HalLedBlink(HAL_LED_1, 0, 50, 500); /如果是则 Led1 间隔 500ms 闪烁#if defined(ZDO_COORDINATOR) /协调器收到D1后,返回D1给终端,让终端 Led1 也闪烁SampleApp_SendPeriodicMessage();#endifelseHalLedSet(HAL_LED_1, HAL_LED_MODE_ON);break;case SAMPLEAPP_FLASH_CLUSTERID: /收到组播数据flashTime = BUILD_UINT16(pkt-cmd.Data1, pkt-cmd.Data2 );HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );break;8) 分析发送周期信息 SampleApp_SendPeriodicMessage()void SampleApp_SendPeriodicMessage( void )byte SendData3=D1;/ 调用 AF_DataRequest 将数据无线广播出去if( AF_DataRequest( &SampleApp_Periodic_DstAddr, &SampleApp_epDesc,SAMPLEAPP_PERIODIC_CLUSTERID,2,SendData,&SampleApp_TransID,AF_DISCV_ROUTE,AF_DEFAULT_RADIUS ) = afStatus_SUCCESS )elseHalLedSet(HAL_LED_1, HAL_LED_MODE_ON);/ Error occurred in request to send.9) AF_DataRequest 发送函数AF_DataRequest( &SampleApp_Periodic_DstAddr, /发送目的地址端点地址和传送模式&SampleApp_epDesc, /源(答复或确认)终端的描述(比如操作系统中任务 ID 等)源 EPSAMPLEAPP_PERIODIC_CLUSTERID, /被 Profile 指定的有效的集群号2, / 发送数据长度SendData,/ 发送数据缓冲区&SampleApp_TransID, / 任务 ID 号AF_DISCV_ROUTE, / 有效位掩码的发送选项AF_DEFAULT_RADIUS ) /传送跳数,通常设置为 AF_DEFAULT_RADIUS好了,第一次就讲这么多吧,内容很多但非常重要,最好理解后再去做后面的实现,打好坚实的基础后,再去看后面的实验相对容易很多。实验步骤1.选择CoodinatorEB-Pro, 下载到开发板A;作为协调器2.选择EndDeviceEB-Pro, 下载到开发板B;作为终端设备3.给两块开发板上电,通过观察D3来判断组网是否成功,协调器D3熄灭说明组网成功,当终端D3熄灭时说明连网成功,请观察Led1灯的变化。2.协议栈中串口基础实验实验内容:1. 掌握串口的使用实现现象:模块通过串口发送“UartInit OK”给电脑串口调试助手显示串行简介串行接口 (Serial Interface) 是指数据一位一位地顺序传送,其特点是通信线路简单,只要一对传输线就可以实现双向通信,从而大大降低了成本,特别适用于远距离通信,但传送速度较慢。一条信息的各位数据被逐位按顺序传送的通讯方式称为串行通讯。串行通讯的特点是:数据位的传送,按位顺序进行,最少只需一根传输线即可完成;成本低但传送速度慢。串行通讯的距离可以从几米到几千米;根据信息的传送方向,串行通讯可以进一步分为单工、半双工和全双工三种。串口在嵌入式开发中非常重要,一般都要使用串口通讯、调试,所以学会串口使用也是必须的。实际上这个实验非常简单,和上个实验大部分一样,增加三个语句就可使串口工作,是不是信心十足啊。使用串口步骤:1. 串口初始化2. 注册串口任务任务3. 串口发送打开.EB25305.zigbee协议栈应用与组网2.协议栈中串口基础实验ZStack-CC2530-2.3.0-1.4.0ProjectszstackSamplesSampleAppCC2530DBSampleApp.eww工程。在左边workspace目录下比较重要的两个文件夹分别是Zmain和App。我们开发主要在App文件夹进行,这也是用户自己添加自己代码的地方。主要修改SampleApp.c和SampleApp.h即可,如果增加传感器则增加相应的模块驱动到App里面,在SampleApp.c中调用就行。第一步:串口初始化 串口初始化相信大家很熟悉,就是配置串口号、波特率、校验位、数据位、停止位等等。在基础实验我们都是配置好寄存器然后使用。现在我们在workspace下找到HALTargetCC2530EBdrivers 的 hal_uart.c 文件,我们可以看到里面已经包括了串口初始化、发送、接收等函数,全都封装好了;我们只需根据自己需要修改相关配置,调用相应的接口函数就可使用串口了.如图1所示浏览一下关于串口的操作函数还是挺全的。我们看看workspace上的MT层,发觉有很多基本函数,前面带MT。包括MT_UART.C,我们打开这个文件。看到MT_UartInit()函数,这里也有一个串口初始化函数的,没错Z-stack上有一个MT层,用户可以选用MT层配置和调用其他驱动。进一步简化了操作流程。我们已经知道串口配置的方法,那么应该在那里初始化呢?当然是SampleApp_Init(),如果你还有疑问说明你上个实验还要复习一下,我们大概再说下吧。用户自己添加的应用任务程序在Zstack中的调用过程是:main() - osal_init_system()- osalInitTasks()- SampleApp_Init()我们打开APP目录下的SampleApp.c发现SampleApp_Init()函数。我们在这里加入串口初始化代码。MT_UartInit();设置串口参数1. void MT_UartInit ()2. 3. halUARTCfg_t uartConfig;4. /* Initialize APP ID */5. App_TaskID = 0;6. /* UART Configuration */7. uartConfig.configured = TRUE;8. uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;9. uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW;10. uartConfig.flowControlThreshold = MT_UART_DEFAULT_THRESHOLD;11. uartConfig.rx.maxBufSize = MT_UART_DEFAULT_MAX_RX_BUFF;12. uartConfig.tx.maxBufSize = MT_UART_DEFAULT_MAX_TX_BUFF;13. uartConfig.idleTimeout = MT_UART_DEFAULT_IDLE_TIMEOUT;14. uartCEnable = TRUE;15. #if defined (ZTOOL_P1) | defined (ZTOOL_P2)16. uartConfig.callBackFunc = MT_UartProcessZToolData;17. #elif defined (ZAPP_P1) | defined (ZAPP_P2)18. uartConfig.callBackFunc = MT_UartProcessZAppData;19. #else20. uartConfig.callBackFunc = NULL;21. #endif22. /* Start UART */23. #if defined (MT_UART_DEFAULT_PORT)24. HalUARTOpen (MT_UART_DEFAULT_PORT, &uartConfig);25. #else26. /* Silence IAR compiler warning */27. (void)uartConfig;28. #endif29. /* Initialize for ZApp */30. #if defined (ZAPP_P1) | defined (ZAPP_P2)31. /* Default max bytes that ZAPP can take */32. MT_UartMaxZAppBufLen = 1;33. MT_UartZAppRxStatus = MT_UART_ZAPP_RX_READY;34. #endif35. 第8行:uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;是配置波特率,我们go todefinition of MT_UART_DEFAULT_BAUDRATE, 可以看到:#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_38400默认的波特率是38400bps,现在我们修改成115200bps,修改如下:#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_115200第9行:uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW; 语句是配置流控的,我们进入定义可以看到:#define MT_UART_DEFAULT_OVERFLOW TRUE默认是打开串口流控的,如果你是只连了TX/RX 2根线的方式务必关流控。注意:2根线的通讯连接一定要关流控,不然是永远收发不了信息的,现在大部产品很少用流控。#define MT_UART_DEFAULT_OVERFLOW FALSE第1622行:这个是预编译,根据预先定义的 ZTOOL或者ZAPP选择不同的数据处理函数。后面的P1和P2则是串口0和串口1。我们用ZTOOL,串口0。我们可以在optionC/C+ 的CompilerPreprocessor地方加入。如图2所示。至此初始化配置完了第二步:注册串口任务任务 在SampleApp_Init();刚添加的串口初始画语句下面加入语句:MT_UartRegisterTaskID(task_id); /注册串口任务任务第三步:串口发送 经过前面两个步骤,现在串口已经可以发送信息了,增加代码如图1所示。HalUARTWrite(0,UartInit OKn, sizeof(UartInit OKn); /串口发送在项目配置选项卡中预编译处加入以下一些内容,如图3所示。ZIGBEEPROZTOOL_P1xMT_TASKxMT_SYS_FUNCxMT_ZDO_FUNCLCD_SUPPORTED=DEBUG连接仿真器和USB转串口线,选择CoordinatorEB-Pro,编译完成后点下载和调试。配置串口调试助手为:115200 8N1 并打开串口,(串口请选择自己的端口号)。在IAR点全速运行,可以看到串口调试助手收到模块发过来的字符串。也许仔细的朋友会发现xMT_TASK,xMT_SYS_FUNC,xMT_ZDO_FUNC前面都有个x, x表示不定义后面的宏,是不是很方便啊。给大家布置一个小实验,去掉上面的x,编译后下载看串口会收到什么?会在“UartInit OK”前面出现一段乱码,如果用16进制显示为FE开头的字符串,这是Z-stack MT层定义的串口发送格式,更具体的介绍会在后面的实验提到。3.广播组网-无线数据传输实验内容:1. 掌握串口的使用2. 掌握协调器和终端通讯过程实现现象:终端发“0123456789”协调器收到后通过串口发给电脑,串口调试助手显示接收到的字符串实验详解:此实验是基于“2.协议栈中串口基础实验”的,只需在原工程上增加发送和接收部分即可。打开.EB25305.zigbee协议栈应用与组网3.广播组网-无线数据传输ZStack-CC2530-2.3.0-1.4.0ProjectszstackSamplesSampleAppCC2530DBSampleApp.eww工程。在左边workspace目录下比较重要的两个文件夹分别是Zmain和App。我们开发主要在App文件夹进行,这也是用户自己添加自己代码的地方。主要修改SampleApp.c和Samp
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 泸州市中石化2025秋招笔试模拟题含答案油田工程技术岗
- 中国广电枣庄市2025秋招笔试行测题库及答案网络优化与维护类
- 梅州市中储粮2025秋招面试专业追问题库仓储保管岗
- 盐城市中储粮2025秋招笔试题库含答案
- 中国联通邵阳市2025秋招面试无领导高频议题20例
- 常德市中储粮2025秋招质检化验岗高频笔试题库含答案
- 中国移动天津市2025秋招心理测评常考题型与答题技巧
- 长沙市中储粮2025秋招面试专业追问题库基建工程岗
- 2025年中职入门考试题及答案
- 中国移动来宾市2025秋招行业解决方案岗位专业追问清单及参考回答
- 2025年秋期新部编人教版五年级上册道德与法治教学计划+进度表
- 测绘新技术之无人机的
- 2025年新九年级数学暑假衔接讲练 (人教版)专题07 一元二次方程单元测试 (学生版)
- 气象灾害应急管理课件
- 地铁站消防维保施工方案及技术措施
- 国庆司机安全培训
- 既有建筑抗震加固性能化设计规程T-ZCEAS 1001-2024知识培训
- 十五五住房和城乡建设发展思路
- 马克思主义经典原著选读-1
- T/CUWA 60055-2023城镇排水管道螺旋缠绕内衬法修复用硬聚氯乙烯(PVC-U)带状型材
- 《职业生涯概述》课件
评论
0/150
提交评论