ZigBee协议栈串口应用

合集下载

ZigBee协议栈串口应用

ZigBee协议栈串口应用

• ZigBee协议栈中提供的与串口操作有关的 三个函数为 可在zmain.c和hal_uart.c中查看相关函数 • uint8 HalUARTOpen(uint8 halUARTCfg_t *config); • uint16 HalUARTRead(uint8 port,uint8 *buf,uint16 len); • Uint16 HalUARTWrite(uint8 prot,uint *buf,uint16 len);
PC机
Hale Waihona Puke ZigBee网络EndDevice
Coordinator
Coordinator.c
• • • • • • • • • • • • • • • #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include <String.h> #include "Coordinator.h" #include "DebugTrace.h" #if !defined( WIN32 ) #include "OnBoard.h" #endif #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h"
回调函数:通过指针(函数地址)调用的函数。如果把函数 的地址作为参数传递给另一个函数,当通过这个指针 调用它所指向的函数时,称为函数的回调。

zigbee基础应用(五)uart串口通信

zigbee基础应用(五)uart串口通信

zigbee基础应用(五)uart串口通信#include <iocc2530.h>#include <string.h>#define uint unsigned int#define uchar unsigned char//定义控制灯的端口#define LED1 P1_0#define LED2 P1_1void initUART0(void);void InitialAD(void);void UartTX_Send_String(uchar *Data,int len);uchar Recdata[30]="hello zigbee!\n";uchar RXTXflag = 1;uchar temp;uint datanumber = 0;uint stringlen;/************************************************************** **串口发送字符串函数*************************************************************** */void UartTX_Send_String(uchar *Data,int len){int j;for(j=0;j<len;j++){U0DBUF = *Data++;while(UTX0IF == 0);UTX0IF = 0;}}#if 0/************************************************************** **初始化串口0函数*************************************************************** */void initUART0(void){CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振while(CLKCONSTA & 0x40); //等待晶振稳定CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZPERCFG = 0x00; //位置1 P0口P0SEL = 0x3c; //P0用作串口P2DIR &= ~0XC0; //P0优先作为UART0 U0CSR |= 0x80; //串口设置为UART方式U0GCR |= 11;U0BAUD |= 216; //波特率设为115200UTX0IF = 1; //UART0 TX中断标志初始置位1U0CSR |= 0X40; //允许接收IEN0 |= 0x84; //开总中断,接收中断}/************************************************************** **串口接收一个字符:一旦有数据从串口传至CC2530,则进入中断,将接收到的数据赋值给变量temp.*************************************************************** */#pragma vector = URX0_VECTOR__interrupt void UART0_ISR(void){URX0IF = 0; //清中断标志temp = U0DBUF;}#else/************************************************************** **初始化串口0函数*************************************************************** */void initUART0(void){CLKCONCMD &= ~0x40; //设置系统时钟源为32MHZ晶振while(CLKCONSTA & 0x40); //等待晶振稳定CLKCONCMD &= ~0x47; //设置系统主时钟频率为32MHZPERCFG = 0x00; //位置1 P0口P0SEL = 0x3c; //P0用作串口P2DIR &= ~0XC0; //P0优先作为UART0 U0CSR |= 0x80; //串口设置为UART方式U0GCR |= 11;U0BAUD |= 216; //波特率设为115200UTX0IF = 1; //UART0 TX中断标志初始置位1U0CSR |= 0X40; //允许接收// IEN0 |= 0x84; //开总中断,接收中断}/************************************************************** **主函数*************************************************************** */void main(void){P1DIR = 0x03; //P1控制LEDLED1 = 1;LED2 = 1; //关LEDinitUART0();stringlen = strlen((char *)Recdata);UartTX_Send_String(Recdata,stringlen);while(1){if(RXTXflag == 1) //接收状态{if( URX0IF == 1){LED2=0; //接收状态指示URX0IF = 0; //清中断标志temp = U0DBUF;if((temp!='#')&&(datanumber<50)) //’#‘被定义为结束字符,最多能接收50个字符{Recdata[datanumber++] = temp;}else{RXTXflag = 3; //进入发送状态}if(datanumber == 50){RXTXflag = 3;}temp = 0;LED2=1; //接收状态指示}}if(RXTXflag == 3) //发送状态{UartTX_Send_String("send:",5);LED2 = 1; //关LED2LED1 = 0; //发送状态指示U0CSR &= ~0x40; //不能收数UartTX_Send_String(Recdata,datanumber); UartTX_Send_String("\n",1);U0CSR |= 0x40; //允许接收RXTXflag = 1; //恢复到接收状态datanumber = 0; //指针归0LED1 = 1; //关发送指示memset(Recdata, 0, sizeof(Recdata));}}}#endif。

ZIGBEE技术规范与协议栈分析

ZIGBEE技术规范与协议栈分析

ZIGBEE技术规范与协议栈分析篇一:ZigBee知识无线龙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 协议栈协议栈是协议的实现,可以理解为代码,函数库,供上层应用调用,协议较底下的层与应用是相互独立的。

商业化的协议栈就是给你写好了底层的代码,符合协议标准,提供给你一个功能模块给你调用。

你需要关心的就是你的应用逻辑,数据从哪里到哪里,怎么存储,处理;还有系统里的设备之间的通信顺序什么的,当你的应用需要数据通信时,调用组网函数给你组建你想要的网络;当你想从一个设备发数据到另一个设备时,调用无线数据发送函数;当然,接收端就调用接收函数;当你的设备没事干的时候,你就调用睡眠函数;要干活的时候就调用唤醒函数。

所以当你做具体应用时,不需要关心协议栈是怎么写的,里面的每条代码是什么意思。

TI_zigbee协议栈结构分析应用

TI_zigbee协议栈结构分析应用

Ver:1:网络层目录,包括着网络层TI ZStack的编译与烧写§ 点击跳出对话框(如右 图)中的“Open existing workspace” 按钮.打开TI ZStack附 带的实例SampleAppTI ZStack的编译与烧写§ 我们可以选择菜单Project->Options、 右击菜单options或者通过热键( ALT+F7)打开工程属性设置。

右击TI ZStack的编译与烧写§ 选择Project->Rebuild all或者工程 右击菜单中的Rebuild all重新编译 所有文件。

右击此处单击此处进行编译 编译错误总数, 数量为0时才能 完成编译操作。

编译警告总数,警告一般 是指可能存在错误或者使 用非常规语句。

就算有警 告也能通过编译TI ZStack的编译与烧写§ 选择Project->Debug或者热键 (Ctrl+D )给开发板上的Zigbee模块下载程序也可以点击此 按钮进行烧写TI ZStack的编译与烧写§ 执行Zigbee模块烧写程序时,如果计算机连接 了多个Zigbee USB工具则会出现如下对话框 ,让我们选择目标板Zigbee编程器编号。

我们 要选择与目标板(装有Zigbee模块的开发板或 者我们生产的产品)相连接的Zigbee编程器。

点击目标编程器或双击选中选择按钮TI ZStack的编译与烧写§ 如果选择了Debug模式,我们要实现在线调试程序功能,编译时EW8051 功能按钮说明如下图所示: 调试菜单 进入函数体执行 退出函数返回到上一层执行退回程序入口单步执行程序 执行到 鼠标位置 全速执行退出调试状态工程选项设置注意事项§ Debug模式和Release模式选择。

点击此选项更改默认输出文件名 建议扩展名改为hex选择Debug模式 选择Release模式 选择输出文件格式 一般选择intel ext模式工程选项设置注意事项§ 如果选择了Debug模式,我们还要记得 选择硬件仿真,当然我们也可以使用软 件仿真。

zigbee串口应用

zigbee串口应用
CLKCONCMD &= ~0x47;
SLEEPCMD |= 0x04;
PERCFG = 0x00;
P0SEL = 0x3c;
P2DIR &= ~0xC0;
U0CSR |= 0x80;
U0GCR |= 10;
U0BAUD |= 216;
}
3)串口发送函数编写
将需要发送的数据写入到U0DBUF中
void uarttx(uchar *data,uint len)
【实验日期】
2018.5.29
【教师对报告的最终评价及处理意见】
成绩(百分制):(涂改无效)
教师:年 月 日
【实验报告】
一、实验目的:
掌握使用串口想PC机发送数据。
掌握数据采集并通过串口发送至PC端
二、实验内容:
1)实现串口发送学生的姓名至PC端
2)实现AD采集电压值并通过串口传输至PC端
三、实验设备:
void uartinit();
void uarttx(uchar *data,uint len);
2)串口初始化函数
a.系统时钟初始化;
b.选择串口作为I/O外设的引脚连接位置;
c..设置串口模式;
代码如下:
void uartinit()ቤተ መጻሕፍቲ ባይዱ
{
CLKCONCMD &= ~0x40;
while(!(SLEEPSTA & 0x40));
实 验 报 告
【2017-2018学年第2学期】
【基本信息】
【开课部门】
青软实训
【实验课程】
ZigBee技术及应用实验
独立□ 非独立□
【实验项目】
实验三:串口应用

ZigBee之Z-Stack协议栈MT层串口应用

ZigBee之Z-Stack协议栈MT层串口应用

ZigBee之Z-Stack协议栈MT层串口应用By:Timeandspace7Date:20171029 At:YSU-B3071.包含头文件#include“MT_UART.h”,2.在用户的init函数中添加MT_UartInit ();MT_UartRegisterTaskID(task_id); //注册串口任务任务注意:在MT_UartInit ()函数中,可以修改串口的波特率,uartConfig.baudRate = MT_UART_DEFAULT_BAUDRATE;,即修改#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_38400重要:uartConfig.flowControl = MT_UART_DEFAULT_OVERFLOW语句是配置流控的,我们进入定义可以看到:#define MT_UART_DEFAULT_OVERFLOW TRUE默认是打开串口流控的,如果你是只连了TX/RX 2 根线的方式务必关流控,注意:2 根线的通讯连接一定要关流控,不然是永远收发不了信息的,现在大部产品很少用流控。

也即:将宏定义修改为#define MT_UART_DEFAULT_OVERFLOW FALSE极其重要:在项目配置选项卡中预编译处加入以下一些内容ZIGBEEPROZTOOL_P1xMT_TASKxMT_SYS_FUNCxMT_ZDO_FUNCLCD_SUPPORTED=DEBUG也即是将原来的ZIGBEEPROZTOOL_P1MT_TASKMT_SYS_FUNCMT_ZDO_FUNCLCD_SUPPORTED=DEBUG分别MT_TASK,MT_SYS_FUNC,MT_ZDO_FUNC加上x。

事实上真正的宏是MT_TASK,MT_SYS_FUNC,T_ZDO_FUNC,加x 表示不定义它们了,如果去掉上面的x,编译后下载看串口会在你想输出的数据“xxxxx”前面出现一段乱码,如果用16 进制则会显示为FE 开头的字符串,这是Z-stack MT 层定义的串口发送格式。

zigbee,协议栈,串口

zigbee,协议栈,串口

zigbee,协议栈,串口篇一:ZigBee简易串口透传第十六讲ZigBee串口透传一、串口透明传输工程说明串口透明传输工程是在SampleApp工程基础之上进行修改而成,主要功能是完成简单的串口透明传输,功能要求:1、设备上电后自动选择设备类型。

第一个启动的设备为协调器,后续启动的为路由器。

(所有设备中程序相同)2、路由器的232串口接收到数据后将数据以单播的形式发送到协调器。

当路由器接收到来自空中的数据包将数据写入232串口。

3、协调器的232串口接收到数据后将数据以广播的形式发送到网络中所有的设备。

当协调器接收到来自空中的数据包将数据写入232串口。

图X 串口透明传输应用二、编译选项说明串口透明传输工程在SampleApp工程基础之上进行修改,但是编译选项使用原SampleApp工程的编译选项,SampleApp工程编译选项具体如下:CC2430EB、ZTOOL_P1、MT_TASK、SOFT_ST ART 通过编译选项ZTOOL_P1编译选项SOFT_START。

三、工程初始化与事件处理函数串口透明传输工程来源于对SampleApp工程的修改,工程初始化函数与SampleApp工程的初始化函数完全相同,读者可以参见前面章节。

串口透明传输工程事件处理函数在SampleApp工程事件处理函数的基础之上添加了对事件UART_RX_CB_EVT的处理,具体代码如下。

程序代码:uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ){if ( events &amP1说明原SampleApp工程默认使用Z-T ool,我们这里对其修改,将其在串口初始化中的回调函数函数进行修改。

程序代码:void SPIMgr_Init () { …… #if defined (ZTOOL_P1) || defined (ZTOOL_P2)uartConfig.callBackFunc= rxCB; …… } 相应我们在SPIMgr.c文件中添加该回调函数rxCB( uint8 port, uint8 event ),具体代码如下。

ZigBee串口透明传输

ZigBee串口透明传输

使用的协议栈版本信息: ZigBee2006\ZStack-1.4.3-1.2.1因为用现在这模块SerialApp没做成功,上电后按键没反应……两块无线龙小板子已经买来N年了. 自己想在SampleApp例子基础上修改实现串口透明传输:串口调试助手1<————>模块1 <-----OTA-----> 模块2<————>串口调试助手2程序修改主要如下:**************************************************************************************** **************************************************************************************** 1、宏定义事件#define UART_RX_CB_EVT 0x0002 (SampleApp.h)全局变量声明: (SPIMgr.h)extern uint8 rxlen; //接收数据长度extern uint8* databuf; //接收数据指针**************************************************************************************** ****************************************************************************************2、串口回调函数rxCB: (SPIMgr.c,直接在SPIMgr_Init()中进行修改)#if defined (ZTOOL_P1) || defined (ZTOOL_P2)uartConfig.callBackFunc = rxCB;//uartConfig.callBackFunc = SPIMgr_ProcessZToolData; //回调函数**************************************************************************************** **************************************************************************************** 3、十六进制转字符函数(SampleApp.c) 这两个函数由[青竹]编写.uint8 hextoword1(uint8 t ){uint8 abc;uint8 cba;uint8 xx1;abc=t;cba=0xf0;abc=(abc&cba)>>4;if(abc<10){xx1=abc+48;}else{xx1=abc+55;}return xx1;}uint8 hextoword2(uint8 t){uint8 abc;uint8 cba;uint8 xx2;abc=t;cba=0x0f;abc=abc&cba;if(abc<10){xx2=abc+48;}else{xx2=abc+55;}return xx2;}**************************************************************************************** ****************************************************************************************4、定义串口回调函数rxCB() (SPIMgr.c)static void rxCB( uint8 port, uint8 event ){// uint8 rxlen; //接收数据长度// uint8* dataybuf;//接收数据块指针extern uint8 SampleApp_TaskID;uint16 short_ddr;uint8 short_ddr_H;uint8 short_ddr_L;// uint8 *pointer1;// uint8 word_buffer[8];short_ddr=NLME_GetShortAddr();short_ddr_H=(uint8)((short_ddr&0xff00)>>8);short_ddr_L=(uint8)short_ddr;rxlen=Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT); //接收缓冲区数据长度,字节为单位databuf=osal_mem_alloc(rxlen+1+2); //多分配3字节,分配如下databuf[0]=rxlen; //一字节存放数据长度databuf[1]=short_ddr_H; //一字节存放源地址高8位databuf[2]=short_ddr_L; //一字节存放源地址低8位//databuf[rxlen+1]='\n'; //一字节存放换行符HalUARTRead ( SPI_MGR_DEFAULT_PORT, databuf+3, rxlen);//读接收缓冲区数据到内存databuf+ 3/* 回显数据(测试用)word_buffer[0]='l';word_buffer[1]='e';word_buffer[2]='n';word_buffer[3]=':';word_buffer[4]=databuf[0]/100+48;word_buffer[5]=(databuf[0]%100)/10+48;word_buffer[6]=databuf[0]%10+48;word_buffer[7]='\n';pointer1=word_buffer;// HalUARTWrite()写入串口正确说明数据已经正确地存储在databuf中!HalUARTWrite ( SPI_MGR_DEFAULT_PORT, pointer1, 8 );HalUARTWrite ( SPI_MGR_DEFAULT_PORT, databuf+1, rxlen+1 );//把数据送串口输出*/if(!rxlen)osal_mem_free( databuf ); //释放内存osal_set_event(SampleApp_TaskID,UART_RX_CB_EVT);// rxCB_to_SampleApp( databuf, rxlen );}********************************************************************************************************************************************************************************5、添加:事件处理函数(SampleApp.c)uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events ){afIncomingMSGPacket_t *MSGpkt;// 显示网络地址变量uint16 short_ddr;uint8 yy1;uint8 yy2;uint8 str_1[ ]="my short address is:";#if defined(ZDO_COORDINATOR)uint8 str_2[ ]="build the network successfully";#elseuint8 str_2[ ]="join the network successfully ";#endifuint8 str_3[ ]={'\n'};uint8 shortaddr[7];uint8 *pointer1;uint8 *pointer2;uint8 *pointer3;uint8 *pointer4;…………(省略)/*1、接收串口信息在SampleApp_MessageMSGCB()上进行修改*/ case AF_INCOMING_MSG_CMD:SampleApp_MessageMSGCB( MSGpkt );break;/*2、设备建网/入网成功则显示本地网络地址*/case ZDO_STATE_CHANGE:SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if ( (SampleApp_NwkState == DEV_ZB_COORD)|| (SampleApp_NwkState == DEV_ROUTER)|| (SampleApp_NwkState == DEV_END_DEVICE) ){//显示本地网络地址short_ddr=NLME_GetShortAddr();yy1=(uint8)((short_ddr&0xff00)>>8);yy2=(uint8)short_ddr;shortaddr[0]=48;shortaddr[1]=120;shortaddr[2]=hextoword1(yy1);shortaddr[3]=hextoword2(yy1);shortaddr[4]=hextoword1(yy2);shortaddr[5]=hextoword2(yy2);shortaddr[6]='\n';pointer1=&shortaddr[0];pointer2=&str_1[0];pointer3=&str_2[0];pointer4=&str_3[0];HalUARTWrite(0,pointer4,1);HalUARTWrite(0,pointer3,29);HalUARTWrite(0,pointer4,1);HalUARTWrite(0,pointer2,20);HalUARTWrite(0,pointer1,7);HalUARTWrite(0,pointer4,1);//***************************************}else{// Device is no longer in the network}break;…………(省略)/*3、对接收的串口数据进行处理*/if ( events & UART_RX_CB_EVT ) //串口数据处理{SampleApp_SPI_SendData( databuf, rxlen+1+2 );return (events ^ UART_RX_CB_EVT);}}**************************************************************************************** ****************************************************************************************6、定义AF层数据处理函数SampleApp_MessageMSGCB() (SampleApp.c)默认采用的簇ID为SAMPLEAPP_PERIODIC_CLUSTERIDvoid SampleApp_MessageMSGCB( afIncomingMSGPacket_t *pkt ){uint16 flashTime;uint16 short_ddr;uint8 *pointer1;uint8 *pointer2;uint8 *pointer3;uint8 *pointer4;uint8 *pointer5;uint8 *pointer6;uint8 *pointer7;uint8 *pointer8;uint8 *pointer9;uint8 str_1[ ]="Source address:";uint8 str_2[ ]="Destination address:";uint8 str_3[ ]="Data length:";uint8 str_4[ ]="Data:";uint8 str_5[ ]={'\n'};pointer1=&str_1[0];pointer2=&str_2[0];pointer3=&str_3[0];pointer4=&str_4[0];pointer9=&str_5[0];uint8 Src_short_ddr_H;uint8 Src_short_ddr_L;uint8 Des_short_ddr_H;uint8 Des_short_ddr_L;uint8 word_buffer[4];uint8 Src_shortaddr[7];uint8 Des_shortaddr[7];switch ( pkt->clusterId ) //判断簇ID{case SAMPLEAPP_PERIODIC_CLUSTERID:/*####################################################*/// flashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] ); // HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );pointer5=&(pkt->cmd.Data[3]); //pointer5:具体数据首地址word_buffer[0]=(pkt->cmd.Data[0])/100+48;word_buffer[1]=((pkt->cmd.Data[0])%100)/10+48;word_buffer[2]=(pkt->cmd.Data[0])%10+48;word_buffer[3]='\n';pointer6=word_buffer; //pointer6:数据长度//----------------Src_short_ddr_H=pkt->cmd.Data[1];Src_short_ddr_L=pkt->cmd.Data[2];Src_shortaddr[0]=48;Src_shortaddr[1]=120;Src_shortaddr[2]=hextoword1(Src_short_ddr_H);Src_shortaddr[3]=hextoword2(Src_short_ddr_H);Src_shortaddr[4]=hextoword1(Src_short_ddr_L);Src_shortaddr[5]=hextoword2(Src_short_ddr_L);Src_shortaddr[6]='\n';pointer7=&Src_shortaddr[0]; //pointer7:源地址//----------------short_ddr=NLME_GetShortAddr();Des_short_ddr_H=(uint8)((short_ddr&0xff00)>>8);Des_short_ddr_L=(uint8)short_ddr;Des_shortaddr[0]=48;Des_shortaddr[1]=120;Des_shortaddr[2]=hextoword1(Des_short_ddr_H);Des_shortaddr[3]=hextoword2(Des_short_ddr_H);Des_shortaddr[4]=hextoword1(Des_short_ddr_L);Des_shortaddr[5]=hextoword2(Des_short_ddr_L);Des_shortaddr[6]='\n';pointer8=&Des_shortaddr[0]; //pointer8:目的地址//----------------HalUARTWrite ( 0, pointer1, 15 );//源地址HalUARTWrite ( 0, pointer7, 7 );HalUARTWrite ( 0, pointer2, 20 ); //目的地址HalUARTWrite ( 0, pointer8, 7 );HalUARTWrite ( 0, pointer3, 12 ); //数据长度HalUARTWrite ( 0, pointer6, 4 );HalUARTWrite ( 0, pointer4, 5 ); //具体数据HalUARTWrite ( 0, pointer5, pkt->cmd.Data[0] ); //pkt->cmd.Data[0]=rxlen,为原始长度HalUARTWrite ( 0, pointer9, 1 ); //换行符HalUARTWrite ( 0, pointer9, 1 );//pointer1=&(pkt->cmd.Data[3]);//HalUARTWrite ( 0, pointer1, 6 );/*####################################################*/break;case SAMPLEAPP_FLASH_CLUSTERID://flashflashTime = BUILD_UINT16(pkt->cmd.Data[1], pkt->cmd.Data[2] );HalLedBlink( HAL_LED_4, 4, 50, (flashTime / 4) );break;}}******************************************************************************************************************************************************************************** 7、定义串口数据处理函数SampleApp_SPI_SendData() (SampleApp.c)我只有两个节点,所以这里采用最简单的单点传送方式.下载协调器程序时目标地址改为0x796F,下载终端程序时目标地址改为0x0000.默认ClusterID为SAMPLEAPP_PERIODIC_CLUSTERID.void SampleApp_SPI_SendData( uint8 *buf, uint8 len ){SampleApp_SPI_SendData_DstAddr.addrMode = (afAddrMode_t)Addr16Bit;SampleApp_SPI_SendData_DstAddr.endPoint = SAMPLEAPP_ENDPOINT;SampleApp_SPI_SendData_DstAddr.addr.shortAddr = 0x796F; //0x796F;0x0000// SampleApp_SendPeriodicMessage(); //测试用if ( AF_DataRequest( &SampleApp_SPI_SendData_DstAddr,(endPointDesc_t *)&SampleApp_epDesc,SAMPLEAPP_PERIODIC_CLUSTERID,len, buf,&SampleApp_TransID,0,AF_DEFAULT_RADIUS ) == afStatus_SUCCESS ){osal_mem_free( databuf ); //必须释放内存,不然造成溢出!}else{osal_mem_free( databuf );}}**************************************************************************************** ****************************************************************************************编译情况:通信结果1:(关于开头的乱码说明参考后篇记录)通信结果2:最大数据只能达到52字节:(但在修改程序过程中,达到过83字节;等修改完整后只有52字节了):测试SampleApp_SPI_SendData()中的osal_mem_free( databuf ).如果不把databuf释放,则数据只能发送几次就停止.下面是添加osal_mem_free( databuf )后两边串口自动发送,测试时间>5分钟,收发一直保持稳定.实物连接:**************************************************************************************** ****************************************************************************************注:串口调试助手A<—>节点A<—>收发----------收发<—>节点B<—>串口调试用手B若串口调试助手A发数据串口调试助手B无反应,在串口配置以及程序编译正确的前提下可参考以下四步:1、节点A是否正确接收串口发送的数据,可以通过串口回显数据进行判断2、节点A是否成功发送数据,可以在成功发送数据的程序后添加一LED闪烁指令以帮助判断3、节点B是否成功接收数据,可以在成功接收数据的程序后添加一LED闪烁指令以帮助判断4、节点B是否把接收数据正确发往串口,可以自己在节点B设置发送一些数据以进行判断我起初也是一堆错误,就是这样一块一块去测试的~今天'阿弥陀佛'同学提了个编译错误的问题:Error[e27]: Entry "MT_NwkCommandProcessing::?relay" in module MT_NWK ( C:\Texas Instrume nts\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SampleApp\CC2430DB\CoordinatorDB\Obj\MT_NWK.r51 ) redefined in module SampleApp ( C:\TexasInstruments\ZStack-1.4.3-1.2.1\Projects\zstack\Samples\SampleApp\CC2430DB\CoordinatorDB\Obj\Sampl eApp.r51 )类似我以前也碰到过,但已经忘记怎么把它搞定的,这个链接/showthread.php?p=100430里的内容也不甚明白,但'阿弥陀佛'在所调用的函数MT_NwkCommandProcessing()前面加上static搞定,但有警告.有理解的朋友烦请解释下~3Q!********************************************************************************************************************************************************************************。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

//任务初始化函数 void GenericApp_Init( byte task_id ) { halUARTCfg_t uartConfig; GenericApp_TaskID = task_id; GenericApp_TransID = 0; GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT; GenericApp_epDesc.task_id = &GenericApp_TaskID; GenericApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc; GenericApp_tencyReq = noLatencyReqs; afRegister( &GenericApp_epDesc ); uartConfig.configured = TRUE; uartConfig.baudRate = HAL_UART_BR_115200; uartConfig.flowControl = FALSE; uartConfig.callBackFunc = rxCB; HalUARTOpen (0,&uartConfig ); //串口初始化 }
//任务初始化函数 void GenericApp_Init( byte task_id ) { halUARTCfg_t uartConfig; GenericApp_TaskID = task_id; GenericApp_TransID = 0; GenericApp_epDesc.endPoint = GENERICAPP_ENDPOINT; GenericApp_epDesc.task_id = &GenericApp_TaskID; GenericApp_epDesc.simpleDesc = (SimpleDescriptionFormat_t *)&GenericApp_SimpleDesc; GenericApp_tencyReq = noLatencyReqs; afRegister( &GenericApp_epDesc );
回调函数:通过指针(函数地址)调用的函数。如果把函数 的地址作为参数传递给另一个函数,当通过这个指针 调用它所指向的函数时,称为函数的回调。
• 使用串口的基本步骤: • ①初始化串口,包括设置波特率、中断等; • ②向发送缓冲区发送数据或者从接收缓冲 区读取数据。
串口工作原理剖析
• 在ZigBee协议栈中,halUARTCfg_t结构体 是如何定义的; • 串口是如何初始化的; • 发送给串口的数据时如何接受的; • 串口是如何向PC机发送数据的。 这些问题涉及如下三个函数……
• ZigBee协议栈中提供的与串口操作有关的 三个函数为 可在zmain.c和hal_uart.c中查看相关函数 • uint8 HalUARTOpen(uint8 halUARTCfg_t *config); • uint16 HalUARTRead(uint8 port,uint8 *buf,uint16 len); • Uint16 HalUARTWrite(uint8 prot,uint *buf,uint16 len);
ZigBee串口应用
一、串口收发基础实验 二、ZigBee协议栈串口应用扩展实验
一、串口收发基础实验
实验课题:串口数据收发基础实验 实验目的:利用串口收发数据 试验步骤:ZigBee协议栈中串口通信的配置使用一个结构 体来实现,该结构体为hal_UARTCfg_t, 不必关心该结构体的具体定义形式,只需要对其功能有个 了解,该结构体将串口初始化的参数集合在一起, 只需要初始化各个参数即可 最后使用HalUARTOpen()函数对串口进行初始化,该函数将 halUARTCfg_t类型的结构体变量作为相关参数
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] = { GENERICAPP_CLUSTERID }; const SimpleDescriptionFormat_t GenericApp_SimpleDesc = { GENERICAPP_ENDPOINT, GENERICAPP_PROFID, GENERICAPP_DEVICEID, GENERICAPP_DEVICE_VERSION, GENERICAPP_FLAGS, GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList, 0, (cId_t *)NULL }; endPointDesc_t GenericApp_epDesc; byte GenericApp_TaskID; byte GenericApp_TransID; //unsigned char uartbuf[128]; //将这一行注释掉
/* typedef struct { byte endPoint; byte *task_id; SimpleDescriptionFormat_t *simpleDesc; afNetworkLatencyReq_t latencyReq; }endPointDesc_t; */ void GenericApp_MessageMSGCB( afIncomingMSGPacket_t *pckt ); void GenericApp_SendTheMessage( void ); //static void rxCB(uint8 port,uint8 event); //将这一行注释掉
( )
Coordinator.c
• • • • • • • • • • • • • • • • #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include <String.h> #include "Coordinator.h" #include "DebugTrace.h" #if !defined( WIN32 ) #include "OnBoard.h" #endif #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h" //包含头文件
//事件处理函数 UINT16 GenericApp_ProcessEvent( byte task_id, UINT16 events ) { return 0; //本实验没有进行事件处理 }
static void rxCB(uint8 port,uint8 event) { unsigned char uartbuf[128]=" "; HalUARTRead(0,uartbuf,16); //调用函数,从串口读取数据并将其 放在uartbuf数组中 if(osal_memcmp(uartbuf,"",16)) //使用 osal_memcmp()判断接收到的数据是否是“”,返回 TRUE,执行HalUARTWrite()函数 { HalUARTWrite(0,uartbuf,16); //调用函数将接收到的字符输出到 串口 } } //ZigBee协议栈使用条件编译,在GenericApp-Coordinator工程上右键 单击,options/C/C++ Compiler在Defined symbols:下拉框中添加 HAL_UART=TRUE,点击OK即可。
uartConfig.configured = TRUE; uartConfig.baudRate = HAL_UART_BR_115200; uartConfig.flowControl = FALSE; uartConfig.callBackFunc = NULL; //置空,即无需回调函数 HalUARTOpen (0,&uartConfig ); //串口初始化
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] = { GENERICAPP_CLUSTERID }; const SimpleDescriptionFormat_t GenericApp_SimpleDesc = { GENERICAPP_ENDPOINT, GENERICAPP_PROFID, GENERICAPP_DEVICEID, GENERICAPP_DEVICE_VERSION, GENERICAPP_FLAGS, GENERICAPP_MAX_CLUSTERS, (cId_t *)GenericApp_ClusterList, 0, (cId_t *)NULL }; endPointDesc_t GenericApp_epDesc; byte GenericApp_TaskID; byte GenericApp_TransID;
PC机
ZigBee网络
vice
Coordinator
Coordinator.c
• • • • • • • • • • • • • • • #include "OSAL.h" #include "AF.h" #include "ZDApp.h" #include "ZDObject.h" #include "ZDProfile.h" #include <String.h> #include "Coordinator.h" #include "DebugTrace.h" #if !defined( WIN32 ) #include "OnBoard.h" #endif #include "hal_lcd.h" #include "hal_led.h" #include "hal_key.h" #include "hal_uart.h"
相关文档
最新文档