实验二 串口数据通信实验
一、实验目的
1、理解ZigBee协议及相关知识。
2、理解掌握zstack协议栈下串口的使用方法。
二、实验原理
串口是开发板和用户电脑交互的一种工具,正确地使用串口对于ZigBee无线网络的学习具有较大的促进作用,使用串口的基本步骤:
l 初始化串口,包括设置波特率,中断等;
l 向发送缓冲区发送数据或者从接收缓冲区读取数据。
上述方法是使用串口的常用方法,但是由于ZigBee协议栈的存在,使得串口的使用略有不同,在ZigBee协议栈中已经对串口初始化所需要的函数进行了实现,用户只需要传递几个参数就可以使用串口,此外ZigBee协议栈还实现了串口的读取函数与写入函数。
因此,用户在使用串口时,只需要掌握ZigBee 协议栈提供的串口操作相关的三个函数即可。
ZigBee 协议栈中提供的与串口操作相关的三个函数为:
l uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config);
l uint16 HalUARTRead(uint8 port, uint8 *buf, uint16 len);
l uint16 HalUARTWrite(uint8 port, uint8 *buf, uint16 len)。
ZigBee协议栈中串口通信的配置使用一个结构体来实现,该结构体为hal_UARTCfg_t,不必关心该结构体的具体定义形式,只需要对其功能有个了解,该结构体将串口初始化的参数集合在一起,只需要初始化各个参数即可最后使用HalUARTOpen()函数对串口进行初始化。
三、实验环境
1、硬件:ZXBee CC2530节点板,USB接口的SmartRF04仿真器,PC机,串口线。
2、软件:PC机操作系统WinXP/win7,IAR集成开发环境,终端软件。
四、实验内容
在本节实验中设计为先启动协调器节点,协调器节点上电后进行组网操作,再启动路由节点或者终端节点,路由节点或者终端节点上电后进行入网操作,成功入网后,通过串口向路由节点或者终端节点发送开关 LED 的命令,该命令通过无线ZigBee网络发送给协调器,协调器接收到该命令对节点上的LED实行相应的操作。图2-1是本实验的数据流图。
图2-1 本实验数据流图
下面结合本实验的实验原理以及实验内容的设计,分别对终端节点、路由节点和协调器节点的源关键源程序进行解析。
1、终端节点、路由节点
根据本节内容的设计,终端节点、路由节点加入ZigBee网络后,终端节点和路由节点的任务事件都一样。根据ZStack协议栈的工作流程,在程序源代码MPEndPoint.c或 MPRouter.c中可以看到ZStack协议栈成功启动后,终端节点、路由节点都调用了节点串口的初始化函数NodeUartInit(),NodeUartInit()函数将 halUARTCfg_t 类型的结构体变量作为相关参数,配置方法如下:
/* 节点串口初始化*/
void NodeUartInit(void)
{
halUARTCfg_t uartConfig; //halUARTCfg_t类型的结构体变量
/* 串口配置*/
uartConfig.configured = TRUE;
uartConfig.baudRate = HAL_UART_BR_9600; //设置波特率为9600
//禁止硬件流控,如果你的串口只有RXD,TXD 和GND 三条线,必须这么做;
uartConfig.flowControl = FALSE;
uartConfig.rx.maxBufSize = 128; //最大接收缓冲区大小
uartConfig.tx.maxBufSize = 128; //最大发送缓冲区大小
uartConfig.flowControlThreshold = (128 / 2);
uartConfig.idleTimeout = 6; //空闲超时时间
uartConfig.intEnable = TRUE; //允许中断
uartConfig.callBackFunc = NodeUartCallBack; //设置串口接收回调函数
/* 打开串口,完成初始化的工作*/
HalUARTOpen (HAL_UART_PORT_0, &uartConfig);
}
其中NodeUartCallBack为串口接收回调函数,从串口接收到的数据可以通过此函数来处理,其代码解析如下:
/* 串口接收回调*/
void NodeUartCallBack ( uint8 port, uint8 event )
{
#define RBUFSIZE 128
(void)event; // 故意不引用的参数,作保留用
uint8 ch;
static uint8 rbuf[RBUFSIZE];
static uint8 rlen = 0;
while (Hal_UART_RxBufLen(port)) //计算并返回接收缓冲区的长度
{
HalUARTRead (port, &ch, 1); //从串口读一个数据
HalUARTWrite (port, &ch, 1); //从串口写一个数据
if (rlen >= RBUFSIZE) rlen = 0; //数据长度超过最大接收缓冲大小,则缓冲区清零
if (ch == '\r')
{ //如果读到回车字符
HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF ); //关闭LED灯
HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK ); //使LED灯闪烁
zb_SendDataRequest( 0, ID_CMD_REPORT, rlen, rbuf, 0, AF_ACK_REQUEST, 0 ); //发送数据
rlen = 0; //缓冲区清零
}else
rbuf[rlen++] = ch; //将数据写到缓冲区
}
}
2、协调器
协调器的任务就是收到终端节点、路由节点发送的数据报信息后进行处理。zigbee节点接收到数据之后,最终调用了zb_ReceiveDataIndication函数,该函数的内容如下:
/* 接收到数据提醒*/
void zb_ReceiveDataIndication( uint16 source, uint16 command, uint16 len, uint8 *pData )
{
HalLedSet( HAL_LED_1, HAL_LED_MODE_OFF ); //关闭D7
HalLedSet( HAL_LED_1, HAL_LED_MODE_BLINK ); //使D7闪烁
if (strncmp("ON", pData, len) == 0)
{ //如果收到的数据是"ON"
HalLedSet( HAL_LED_2, HAL_LED_MODE_ON ); //打开D6
} else if (strncmp("OFF", pData, len) == 0)
{ //如果收到的数据是"OFF"
HalLedSet( HAL_LED_2, HAL_LED_MODE_OFF ); //关闭D6
}
}
由于ZStack协议栈的运行涉及到很多任务,而且也比较复杂,所以在本节实验中,将终端节点、路由节点和协调器的程序流程图进行了简化,简化后的程序流程图如图2-2 所示。
图2-2 实验流程图
五、实验步骤
由于出厂源码ZigBee网络PAN ID均设置为0x2100,为了避免实验环境下多个实验平台之间网络互相串扰,每个实验平台需要修改PAD ID,修改工程内文件:Tools-> f8wConfig.cfg,将PAN ID修改为个人学号的后四位(范围 0x0001-0x3FFF)。
确认已安装ZStack的安装包。如果没有安装,打开光盘提供的安装包,路径为“03-系统代码\ZStack\ZStack-CC2530-2.4.0-1.4.0.exe”,双击之后直接安装,安装完后默认生成 C:\Texas Instruments\ZStack-CC2530-2.4.0- 1.4.0 文件夹。
打开例程:将光盘中的例程“05-实验例程\第5章\5.7-Serial\Serial”整个文件夹拷贝到C:\Texas Instruments\ZStack-CC2530-2.4.0-1.4.0\ Projects\zstack\Samples 文件夹下。双击Serial\CC2530DB\ Serial.eww”文件。
分别编译协调器、路由器、终端设备三个工程,把SmartRF04仿真器连接到CC2530无线节点,使Flash Programmer工具把上述程序分别下载到对应的CC2530无线节点板中。
用USB mini线和调试转接板将终端节点或者路由器节点与PC连接起来。
打开串口助手终端软件,设置波特率为38400,8位数据位,1位停止位。
先拨动无线协调器的电源开关为ON状态,此时D6 LED灯开始闪烁,当正确建立好网络后,D6 LED会常亮。
当无线协调器建立好网络后,拨动无线终端节点和无线路由节点的电源开关为ON状态,此时每个无线节点的D6 LED灯开始闪烁,直到加入到协调器建立的ZigBee网络中后,D6 LED 灯开始常亮。
当有数据包进行收发时,无线协调器和无线节点的D7 LED灯会闪烁。
在串口助手终端软件上输入关闭D6命令“OFF”观察协调器D6 LED灯亮灭情况;输入打开D6命令“ON”观察协调器D6 LED灯亮灭情况。
六、实验结果
在终端软件上输入关闭D6命令“OFF”,协调器D6 LED灯灭;输入打开D6命令“ON”,协调器D6 LED灯亮,命令都以回车结束。说明命令通过串口成功发送出去,实现了ZigBee 协议栈串口通信。