Zigbee串口通信

作者:唐小新

Zigbee串口通信

一、串口基本原理

串口是开发板和用户电脑交互的一种工具,正确地使用串口对于ZigBee无线网络的学习具有较大的促进作用,使用串口的基本步骤:

①初始化串口,包括设置波特率、中断等;

②向发送缓冲区发送数据或者从接收缓冲区读取数据。

上述方法是使用串口的常用方法,但是由于ZigBee协议栈的存在,使得串口的使用略有不同,在ZigBee协议栈中已经对串口初始化所需要的函数进行了实现,用户只需要传递几个参数就可以使用串口,此外,ZigBee协议栈还实现了串口的读取函数和写入函数。

因此,用户在使用串口时,只需要掌握ZigBee协议栈提供的串口操作相关的三个函数即可。ZigBee协议栈中提供的与串口操作有关的三个函数为:

·uint8HaIUARTOpen(uint8 port,haIUARTCfg_t *config);

·uint16HaIUARTRead(uint8 port, uint8 *buf, uint16 len);

·uint16HaIUARTWrite(uint8 port,uint8 *buf,uint16 len);

二、串口通信实例

1、串口配置和初始化

ZigBee协议栈中对串口的配置是使用一个结构体来实现的,该结构体为haIUARTCfg_t。最后使用HaIUARTOpen()函数对串口进行初始化,注意,该函数将haIUARTCfg_t类型的结构体变量作为参数,因为haIUARTCfg_t类型的结构体变量已经包含了串口初始化相关的参数,所以,将这些参数传递给HalUARTOpen()函数,HalUARTOpen()函数使用这些参数对串口进行了初始化。

2、三个主要函数

HaIUARTOpen():该函数实际上是调用了HaIUARTOpenDMA函数,在HaIUARTOpenDMA()函数中对串口的波特率进行了初始化,同时对DMA接收缓冲区进行了初始化。在波特率初始化过程中,UxBAUD和UxGCR的值可以从CC2530数据手册中查找到对应的初始化值。根据haIUARTCfg_t结构体中的成员变量baudRate在初始化时设定的波特率,参考CC2530数据手册中UxBAUD和UxGCR的值,使用switch-case语句就可以完成串口波特率的初始化。
HaIUARTRead():在ZigBee协议栈中,开辟了DMA发送缓冲区和接收缓冲区,用户通过串口调试助手向串口发送数据时,数据首先存放在DMA接收缓冲区,然后用户调用HaIUARTRead函数进行读取时,实际上是读取DMA缓冲区中的数据。
HaIUARTWrite():同理,当用户调用HaIUARTWrite()函数发送数据时,实际上是将数据写入DMA发送缓冲区,然后DMA自动将发送缓冲区中的数据通过串口发送给PC机。

3、测试

测试代码如下(以下只是个人的简单测试代码,如有想自己的测试效果,只需修改缓冲区的内容即可):
#include "OSAL.h"
#include "AF.h"
#include "ZDApp.h"
#include "ZDObject.h"
#include "ZDProfile.h"
#include "GenericApp.h"
#include "DebugTrace.h"
#if !defined( WIN32 )
  #include "OnBoard.h"
#endif
#include "hal_led.h"
#include "hal_key.h"
#include "hal_uart.h"
const cId_t GenericApp_ClusterList[GENERICAPP_MAX_CLUSTERS] =
{
  GENERICAPP_CLUSTERID
};
const SimpleDescriptionFormat_t GenericApp_SimpleDesc =
{
  GENERICAPP_ENDPOINT,              //  int Endpoint;
  GENERICAPP_PROFID,                //  uint16 AppProfId[2];
  GENERICAPP_DEVICEID,              //  uint16 AppDeviceId[2];
  GENERICAPP_DEVICE_VERSION,        //  int   AppDevVer:4;
  GENERICAPP_FLAGS,                 //  int   AppFlags:4;
  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)GenericApp_ClusterList,  //  byte *pAppInClusterList;
  GENERICAPP_MAX_CLUSTERS,          //  byte  AppNumInClusters;
  (cId_t *)GenericApp_ClusterList   //  byte *pAppInClusterList;
};
endPointDesc_t GenericApp_epDesc;
byte GenericApp_TaskID;
byte GenericApp_TransID;
//static void GenericApp_MessageMSGCB(afIncomingMSGPacket_t *pkt );
static uint8 GenericApp_TxBuf[64];
static uint8 GenericApp_TxLen;
static uint8 GenericApp_TxBuf2[4]={'t','a','n','g'};
static void rxCB(uint8 port, uint8 event);
void GenericApp_Init( uint8 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_epDesc.latencyReq = noLatencyReqs;
  afRegister( &GenericApp_epDesc );
  
  uartConfig.configured   = TRUE;
  uartConfig.baudRate     = HAL_UART_BR_115200;
  uartConfig.flowControl  = FALSE;
  uartConfig.callBackFunc = rxCB;
  HalUARTOpen(0,&uartConfig);
}
uint16 GenericApp_ProcessEvent( uint8 task_id, uint16 events )
{
  return 0;
}
static void rxCB(uint8 port, uint8 event)
{
    GenericApp_TxLen = HalUARTRead(0,GenericApp_TxBuf,64);
//HaIUARTRead()oˉêy£?′ó′??ú0?áè?êy?Y2¢????′?·??úGenericApp_TxBufêy×é
    if(GenericApp_TxLen > 0)
    {
        HalUARTWrite(0,GenericApp_TxBuf2,4);


        GenericApp_TxLen = 0;
    }
}


将程序编译下载到CC2530协调器开发板,将串口调试助手与主机连接,并配置波特率为115200。然后在输入栏随意如入一串字符,如以上代码中的 “tang”,然后单击手动发送。立刻,在接收栏会接收到了开发板发过来的同样的数据 “tang”


你可能感兴趣的:(Zigbee)