ZigBee串口说明

发布者:心怀梦想最新更新时间:2019-04-09 来源: eefocus关键字:ZigBee  串口说明  初始化 手机看文章 扫描二维码
随时随地手机看文章

一、串口的初始化


//系统初始化


byte osal_init_system( void )


{


……


osalInitTasks();//系统任务初始化


……


}


 


//任务初始化


void osalInitTasks( void )


{


……


#if defined( MT_TASK )//如果定义了MT_TASK就初始化MT任务,所以要使用uart必须编译MT_TASK


MT_TaskInit( taskID++ );


#endif


……


}


//MT_TASK初始化


void MT_TaskInit( byte task_id )


{


MT_TaskID = task_id;//分配任务ID


……


SPIMgr_Init();//SPI(UART)管理初始化


 


} /* MT_TaskInit() */


 


//SPI(UART)管理初始化


void SPIMgr_Init ()


{


halUARTCfg_t uartConfig;


/* Initialize APP ID */


App_TaskID = 0;//应用层TaskID初始化为0,在后面应用层如果想使用uart需要注册该TaskID


 


/* UART Configuration */


uartConfig.configured = TRUE;


uartConfig.baudRate = SPI_MGR_DEFAULT_BAUDRATE;


uartConfig.flowControl = SPI_MGR_DEFAULT_OVERFLOW;


uartConfig.flowControlThreshold = SPI_MGR_DEFAULT_THRESHOLD;


uartConfig.rx.maxBufSize = SPI_MGR_DEFAULT_MAX_RX_BUFF;


uartConfig.tx.maxBufSize = SPI_MGR_DEFAULT_MAX_TX_BUFF;


uartConfig.idleTimeout = SPI_MGR_DEFAULT_IDLE_TIMEOUT;


uartConfig.intEnable = TRUE;


 


#if defined (ZTOOL_P1) || defined (ZTOOL_P2)


uartConfig.callBackFunc = SPIMgr_ProcessZToolData; //回调函数


#elif defined (ZAPP_P1) || defined (ZAPP_P2)


uartConfig.callBackFunc = SPIMgr_ProcessZAppData; //回调函数


#else


uartConfig.callBackFunc = NULL;


#endif


/* Start UART */


#if defined (SPI_MGR_DEFAULT_PORT)


HalUARTOpen (SPI_MGR_DEFAULT_PORT, &uartConfig); //打开默认串口


#else


……


}


 


 


到这里串口的初始化基本就完成了,还有个打开串口,先不下去了,下面的水是越来越浑,过几天总结底层的…


二、串口的事件处理


 


//系统主循环


void osal_start_system( void )


{


……


Hal_ProcessPoll(); // 串口与定时器轮询函数


……


}


 


// 串口与定时器轮询函数


void Hal_ProcessPoll ()


{


HalTimerTick();


 


#if (defined HAL_UART) && (HAL_UART == TRUE)


HalUARTPoll();


#endif


}


 


//串口轮询函数


void HalUARTPoll( void )


{


……//这里会根据是DMA还是普通串口有两种不同的轮询方式,这里说普通串口


#if HAL_UART_ISR


#if HAL_UART_DMA


if ( cfg->flag & UART_CFG_DMA )


{


pollDMA( cfg );


}


else


#endif


{


pollISR( cfg );


}


#elif HAL_UART_DMA


pollDMA( cfg );


#endif


……


}


//普通串口轮询函数


static void pollISR( uartCfg_t *cfg )


{


……


 


轮询完事再次回到void HalUARTPoll函数中,看是否触发事件,如果触发了HAL_UART_RX_FULL、HAL_UART_RX_ABOUT_FULL、HAL_UART_RX_TIMEOUT三个中任意一个就调用回调函数处理。


 


if ( evt && cfg->rxCB )


{


cfg->rxCB( ((cfg->flag & UART_CFG_U1F)!=0), evt );


}


 


//串口回调函数


#define SPI_MGR_ZAPP_RX_READY 0x01


SPIMgr_ZAppRxStatus = SPI_MGR_ZAPP_RX_READY;


函数:


void SPIMgr_ProcessZAppData ( uint8 port, uint8 event )


{


 


osal_event_hdr_t *msg_ptr;


uint16 length = 0;


uint16 rxBufLen = Hal_UART_RxBufLen(SPI_MGR_DEFAULT_PORT);


//获取串口buf中数据的长度


 


……


if (event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))


{


if ( App_TaskID )//必须这里被注册


{


// 准备向上层发送数据


//如果接收状态为READY,并且数据长度大于0说明有数据了


if ((SPIMgr_ZAppRxStatus == SPI_MGR_ZAPP_RX_READY ) && (length != 0))


{


/*要读取这些数据了,先关闭接收!*/


SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_NOT_READY );


 


/* 2 more bytes are added, 1 for CMD type, other for length */


msg_ptr = (osal_event_hdr_t *)osal_msg_allocate( length + sizeof(osal_event_hdr_t) );


//分配内存一个字节存放命令event,一个字节存放长度。剩下的存放length的内存存放数据


if ( msg_ptr )


{


msg_ptr->event = SPI_INCOMING_ZAPP_DATA;


msg_ptr->status = length;//这里状态存放了数据的长度


HalUARTRead( SPI_MGR_DEFAULT_PORT, (uint8 *)(msg_ptr + 1), length );//读入buf中的数值


 


//下面是触发函数


osal_msg_send( App_TaskID, (uint8 *)msg_ptr );


//这里我觉得还要打开串口,让它接收数据啊。怎么没有来这么一句话


//SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_READY );


}


}


}


}


}


关闭接收函数:


void SPIMgr_AppFlowControl ( bool status )


{


 


/* Make sure only update if needed */


if (status != SPIMgr_ZAppRxStatus )


{


SPIMgr_ZAppRxStatus = status;


}


 


/* App is ready to read again, ProcessZAppData have to be triggered too */


if (status == SPI_MGR_ZAPP_RX_READY)


{


SPIMgr_ProcessZAppData(SPI_MGR_DEFAULT_PORT, HAL_UART_RX_TIMEOUT );


}


}


 


因为在 SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_NOT_READY )中SPI_MGR_ZAPP_RX_NOT_READY=0,而SPIMgr_ZAppRxStatus=1;所以会执行SPIMgr_ZAppRxStatus = status;,即接收状态SPIMgr_ZAppRxStatus =0;不再满足SPIMgr_ZAppRxStatus == SPI_MGR_ZAPP_RX_READY。所以不接收数据了。


重点说明:我认为在串口回调函数加上SPIMgr_AppFlowControl ( SPI_MGR_ZAPP_RX_READY )使得串口处理完一次后立即处理下一次。


但是如果在回调函数结束前(函数内)加上这句,那么就会在流控函数中再次调用了SPIMgr_ProcessZAppData()。而导致协议栈陷入一个死循环,所以最后更正为这句话加在事件处理后,即SPI_INCOMING_ZAPP_DATA事件处理以后。不加是不行的!


三、与应用层联姻


底层和应用层联姻呢?在TI的协议栈很多都是通过注册Register。按键、串口…


通过注册可以传递任务ID,即TaskID。从而利用偷梁换柱、浑水摸鱼的技术将底层的任务传到应用层


 


//注册函数


void SPIMgr_RegisterTaskID( byte taskID )


{


App_TaskID = taskID;//任务ID被偷梁换柱了


}


//如果应用层调用了这个函数,则此时App_TaskID就变成了应用层的任务ID了……


 


现在我们在回去简单看一下串口的回调函数


void SPIMgr_ProcessZAppData ( uint8 port, uint8 event )


{


 


……


if (event & ( HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT))


{


if ( App_TaskID )//这时已经被偷梁换柱了,可怜的底层,就这样被欺骗了


{


//下面是触发函数


osal_msg_send( App_TaskID, (uint8 *)msg_ptr );


//将msg_ptr发送到App_TaskID,即你注册的应用层


……


}


应用层代码:


我是在SampleApp这个例子里修改的:


事件处理函数修改:


uint16 SampleApp_ProcessEvent( uint8 task_id, uint16 events )


{


afIncomingMSGPacket_t *MSGpkt;


 


if ( events & SYS_EVENT_MSG )


{


MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SampleApp_TaskID );


while ( MSGpkt )


{


switch ( MSGpkt->hdr.event )


{


……


case SPI_INCOMING_ZAPP_DATA:


SampleApp_UART(MSGpkt);


……


}


 


void SampleApp_UART(afIncomingMSGPacket_t *pkt)


{


HalUARTWrite(0,(uint8 *)((osal_event_hdr_t *)pkt+1),pkt->hdr.status);//将串口数据写到PC(再写回去)


SPIMgr_AppFlowControl(true); //重新打开接收


}

关键字:ZigBee  串口说明  初始化 引用地址:ZigBee串口说明

上一篇:ZigBee基础实验(十一)--PWM来控制LED亮度
下一篇:ZigBee协议栈(二)--OSAL控制LED灯

推荐阅读最新更新时间:2024-03-16 16:27

基于ZigBee与S3C2440的大型停车场管理系统解决方案
在大型停车场如何快速停车是管理者与停车者之间存在的最大的难题。为了解决这个困扰社会管理的难题,文中提出了一种基于ZigBee与S3C2440的大型停车场管理系统解决方案。该系统采用CC2430和超声波传感器采集与传输停车场车位信息,并用S3C2440和MFRC522模块解决停车场收费问题,用LED点阵屏实时显示停车场车位信息以及引导停车者快速停车。整个系统能够智能地管理与引导停车者快速停车。 随着我国城市现代化、国际化的发展,城市居民汽车拥有量急剧增加,车辆的管理控制也显得越发重要。在拥挤的市区里,汽车与停车位之间的矛盾越来越突出。对于各类停车场控制管理也有着更高的要求,不仅要求可以实现对车辆的收费和停泊管理,而且要求
[单片机]
基于<font color='red'>ZigBee</font>与S3C2440的大型停车场管理系统解决方案
解读ZigBee无线终端温度测试系统电路
  随着人们生活水平的提高,食品的安全卫生越来越受到人们的重视。每年技术监督部门都要对全市各冷库食品进行抽检,检查后发现市民每年消费的农产品及其他易腐食品中有很大部分就是因为冷藏、冷冻未达到要求而变质的,因此对冷库温度的实时监测对于贮藏品的质量保证显得尤为重要。由于ZigBee应用的低带宽要求,ZigBee节点可以在大部分时间内为睡眠模式,以节省电池能量。当接收到广播信标时被唤醒并迅速发送数据,然后重新进入睡眠模式。ZigBee可以在15毫秒或更短的时间内由睡眠模式进入活动模式,因此即使处于睡眠的节点也可以实现低时延的目的。   系统硬件电路设计   单个冷库温度无线监测系统的下位机主要是由单片机与温度传感器、无线射频收发器、键盘
[测试测量]
解读<font color='red'>ZigBee</font>无线终端温度测试系统电路
__main() 和 main()
__main() 和 main()(转载) 因为我们通常在BOOTLOADER中都已做好了比较细致的初始化工作,包括代码的搬运,所以我们最好别再调用库函数__main(),因为__main()作为ADS集成好的库函数,会对系统进行初始化设置,可能会与我们的初始化发生冲突,故在我们做好初始化后最好别调用__main()。仿真时若调了__main()且没设置entry会报警告,__main()库函数代码不太了解,估计跟ADS初始化有关,库函数__main()要慎用。 当所有的系统初始化工作完成之后,就需要把程序流程转入主应用程序,即呼叫主应用程序。最简单的一种情况是: IMPORT main B
[单片机]
基于ZigBee与红外的家居监控系统设计
引言   ZigBee是一种新兴的短距离、低速率无线网络技术,主要用于近距离无线连接。早在2004年就被列为当今世界发展最快、市场前景最广阔的十大最新技术之一。ZigBee是一种无线连接技术的商业化命名,主要用于解决低成本、低功耗、低复杂度、低传输速率、近距离的设备联网应用。而红外技术因兴起早、技术简单等优点先在家电遥控市场先入为主,当前家电遥控基本都采用红外。   基于ZigBee与红外技术的无线 家居监控 系统,采用便捷、易扩展、低成本、低功耗方案实现家居的无线监控。本系统通过传感器监测节点将收集的信息传送到监视主机,监视主机可通过“网关- CC2430 无线模块-学习型红外模块”发出命令控制当前的红外遥控的家电,也可通
[安防电子]
基于<font color='red'>ZigBee</font>与红外的家居监控系统设计
贸泽开售Silicon Labs zigbee参考设计 助智能家居再上新台阶
专注于新产品引入 (NPI) 并提供极丰富产品类型的业界顶级半导体和电子元件分销商贸泽电子(Mouser Electronics) 即日起开始备货Silicon Labs的两款全新zigbee®互联家居参考设计。zigbee智能插座参考设计和zigbee占位传感器参考设计透过业界领先的zigbee网状网络技术,协助家居自动化设备开发人员加速产品上市、降低系统成本和复杂度。借助于此全面的参考设计,开发人员能够采用预先认证的无线技术、开源硬件设计文件和业界标准软件协议栈,并利用成熟的测试方案和制造方法,缩短从概念设计到最终产品的整个周期。 贸泽备货的Silicon Labs zigbee互联家居参考设计通过了FCC和UL预认证,为
[网络通信]
基于无线传感器网络的海洋水环境监测系统的设计
  引言   近几年来,随着海洋事业的迅速发展,海洋环保已经提上议事日程。因此,海洋水环境监测成为人们越来越关注的焦点。   无线传感器网络广泛应用于军事侦察、环境监测、目标定位等领域,能够实时地感知、采集和处理网络覆盖范围内的对象信息,并发送给观察者。它具有覆盖区域广,可远程监控,监测精度高,布网快速和成本低等优点。把无线传感器网络技术应用到海洋水环境监测系统中,是人们近几年来研究的焦点。   ZigBee与其他的无线通信标准相比,适用于吞吐量较小,网络建设投资小,网络安全性高,不便于频繁更换电源的场合。在工业控制领域利用传感器基于Zigbee技术组成传感器网络,可以使得数据采集和分析变得方便和容易。Zigbee网络用于传
[工业控制]
stm32---RS485初始化
u8 RS485_RX_BUF ; //接收缓冲,最大64个字节. u8 RS485_RX_CNT=0; //接收到的数据长度 /* 函数:RS485_Init 功能:串口初始化配置 参数:Baud:波特率 备注:GPIO/USART/NVIC初始化,开启串口中断,使能串口中断(中断处理函数) 步骤: 1---GPIO/USART1/NVIC初始化结构体定义 2---开启串口USART,GPIO端口时钟 3---复位串口 4---USART2_TX/USART2_RX 串口接受/发送端口配置寄存器结构体参数配置 5---NVIC 中断控制器配置 6---USART2 初始化设置 7---开启中断 8---
[单片机]
飞思卡尔在Package解决方案中推出单芯片ZigBee平台
超低功率无线平台旨在实现长达20年的电池寿命,提供2Mbps的TurboLink技术性能 得克萨斯州奥斯汀-2007年3月27日 -飞思卡尔半导体宣布推出一种基于ZigBee规范的单芯片平台解决方案,旨在实现业界最低的功耗和最高的性能。MC1322x平台的设计目标是将电池寿命延长到20年,即当前ZigBee解决方案的两倍。 飞思卡尔的MC1322x在Platform in Package(PiP)解决方案中提供。该解决方案在单一封装中集成了ZigBee应用的所有必要组件,从而可减少组件数量并降低系统成本。MC1322x平台包括一个32位微控制器(MCU),一个完全符合IEEE 802.15.4标准的收发器,以及不平衡变压器和
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved