实验课程

THIS NAME

实验课程

当前位置: 首页 >> 实验课程 >> 正文

无线传感器网络-串口数据通信实验

发布日期:2024-12-25    作者:陆其美     来源:     点击:


实验二  串口数据通信实验

一、实验目的

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本实验的数据流图。

undefined

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

//禁止硬件流控,如果你的串口只有RXDTXD 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 所示。

  1. undefined

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 协议栈串口通信。


下一条:无线传感器网络-信息广播/组播实验

关闭