基于ZigBee Mesh网络的无线串口设计
RS-232串行通信是异步通信中应用最广的标准总线,在没有Modem的情况下,一般传输距离限制在15 m内,使得远距离串口通信受到较大限制。无线技术是当今设备通信中取代有线技术的必然趋势。
本文利用ZigBee无线技术组成Mesh网络实施串口通信,网络中任意两个模块的传输距离可达100 m,如果模块有功放,传输距离可上升至1.5 km。因为Mesh网络的多跳性,数据能够多跳传输,所以数据的传输距离取决于跳数的多少,如图1所示S4经过3跳把数据传送到S1,如果每一跳距离是1 km,则传输距离达3 km,这有效地解决了有线串口传送的距离限制问题。同时,ZigBee网络中最大的数传速率为250 kb·s-1,完全能满足一般用户的要求。
1 ZigBee无线串口设计原理
1.1 节点入网后的初始化
根据ZigBee技术的要求,ZigBee网络中存在3种角色,协调器、路由和终端设备,协调器负责建立网络,路由器负责路由,终端设备只能收发数据。协调器和路由统称为全功能设备(FFD)。
在此,所有的设备都统称为节点(node),只是所扮演的角色不一样,每个节点都人为地在程序里给它们取名,如:01、02、03表示节点1、节点2、节点3,00保留给协调器。
协调器(00)加电后组建网络,各节点自动发现并加入网络,根据本文的设计,节点在加入网络后都会自动地向网络中的其他节点广播其16位网络地址和名字,网络中的其他节点接收到这广播数据后将该数据储存在数组NodeAddress[]中,然后以单播的方式向新加入节点反馈自己的网络地址和名字,新节点也将该数据保存在数组NodeAddress[]中,从而保证网络中的每个节点都知道其他节点的网络地址和名字。具体流程如图2所示。
1.2 串口数据的格式
当节点串口有数据要发送的时候,必须要指明,数据的发送目的地,所以从串口输入的数据必须满足一定的格式,本设计规定该格式为:××……;××为要发送的目的节点名字,……为要发送的数据。譬如向节点01发送数据“ZigBee”,格式为:01 ZigBee。因为节点在加入网络的时候,已经建立了名字和网络地址的对应表,所以发送节点会自动将01解释为网络地址0x0023,从而将数据准确地发送到节点01上。
2 无线串口硬件设计
2.1 系统框图
串口接收、发送系统可以是PC或者其他嵌入式系统,ZigBee控制系统负责组网和接收发送数据。这里主要研究ZigBee控制系统。
2.2 芯片选择
选择TI公司的2.4 GHz片上系统解决方案CC2530。CC2530是用于IEEES02.15.4、ZigBee和RF4CE应用的一个片上系统解决方案。它能以较低的总材料成本建立强大的网络节点。CC2530结合了领先的RF收发器的优良性能,业界标准的增强型8051CPU,使操作更容易,具备不同的运行模式,尤其适应超低功耗要求的系统。
2.3 无线串口电路设计
CC2530中的P0_1和P0_2为TTL电平的串口接收发送管脚,可直接与TTL电平的串口系统相连,如果与PC机连,要加上MAX232模块。可见该无线串口与其他系统的兼容性很强,而且连接方便。
3 软件设计
3.1 ZigBee协议栈简介
ZigBee协议栈以IEEE 802.15.4标准为基础,IEEES02.15.4工作组主要负责制定物理层(PHY)、媒体访问控制层(MAC)。ZigBee联盟提供了网络层和应用层(APL)框架的设计。其中,应用层的框架包括了应用支持子层(APS)、ZigBee设备对象(ZDO)及由制造商制定的应用对象。如图5所示。
采用TI公司的Z—Stack 07协议栈实现ZigBee协议。Z—Stack 07协议栈,对之前几个版本的协议进行了改进,使得网络稳定性更强,组网更灵活。
3.2 主体程序流程与任务
TI的Z—Stack 07/PRO协议栈,对应的开发环境为IAR 7.51A。在安装完Z—Stack 07协议栈之后,用IAR打开工程文件GenericApp,GenericApp是TI公司专门为开发者提供的开发模板,在此借助该模板实现无线串口。
打开GenericApp后,如图6所示,App文件夹即为应用层代码文件夹。利用模板只需在GenericApp.c中加入实现代码,就可以实现无线串口。
Z—Stack采用操作系统的思想来构建,采用任务轮循机制,当各层初始化之后,系统进入低功耗模式,当任务有事件发生时,唤醒系统,开始进入中断处理任务事件,结束后继续进入低功耗模式。如果同时有几个事件发生,判断优先级,逐次处理事件。Z—Stack的工作流程如图7所示。
3.3 无线串口程序流程
因为Z—Stack是采用任务轮循机制,GenericApp是属于其中的一个任务,在文件GenericApp.c中的任务初始化函数GenericApp_Init()中添加串口初始化代码,在GenericApp_ProcessEven()函数中添加无线串口收发事件Serial_RecEven和Serial_TranEven的处理函数。图8和图9是GenericApp_Init()函数流程图和GenericApp_ProcessEven()函数流程图。
图中初始化NV Flash是用以储存其他节点网络地址名字对应表。
当节点上电加入ZigBee网络后,便会执行GenericApp_Init()函数,初始化串口,并向网络中的其他节点以广播的方式发送其网络地址和名字。
当网络中的其他节点接收到数据时,便会触发接收数据事件,GenericApp_ProcessEven()函数判断是串口接收数据命令还是储存网络地址命令,如果是前者,便将数据写到串口;如果是后者则先判断是否来自于广播方式发送来的数据:若是则储存该网络地址和名字,并且以单播的方式回馈本节点的网络地址,保证网络中的各个节点都知道其他节点的地址和名字;若不是就储存该网络地址和名字,不用反馈本节点的网络地址和名字。
当GenericApp_ProcessEven()函数检测到Serial_TranEven事件发生时,便读串口并将数据按照约定的格式发送出去。
4 结束语
利用ZigBee无线技术组成Mesh网络实施串口通信,无线通信距离取决于单跳距离和跳数,而默认最大跳数为20,但多跳的出现会导致数据延时,出现误码。建议跳数控制在5跳之内,此时数据传输稳定、时延短、误码率低,能有效地解决有线串口距离限制的问题。
|