cc2530串口通信流程

//串口发送接收流程

main:  //主函数
    ->osal_init_system();  //操作系统初始化
       ->osalInitTasks();    //任务初始化
          -->ZDApp_Init(taskID++); //该函数初始化后,协调器建立网络、终端将加入网络
              -->ZDOInitDevice(0);  //设备初始化
                 -->ZDAPP_NetworkInit(extendedDelay); //网络初始化
                    -->osal_start_timeEx(....,ZDO_NETWORK_INIT,..) //发送消息
                    -->ZDApp_event_loop()  //事件
                        -->ZDO_StartDevice((uint8)ZDO_Config.............) //开始设备
                            -->NLME_NetworkDiscoveryRequest() 建立网络
                            -->ZDO_NetworkFormationConfirmCB()  //给予ZDO层发聩信息

                                -->osal_set_event(..,ZDO_NETWORK_START)启动网络事件   协调器
                                   -->ZDApp_NetworkStartEvt();  //处理网络启动事件
                                       -->osal_set_event(....,ZDO_STATE_CHANGE_EVT); //设置网络状态改变事件
                                       -->ZDAPP_event_loop();  //网络改变事件函数

                                -->ZDApp_SendMsg(....,ZDO_NWK_DISC_CNF,...);  //终端、路由器,
                                   -->ZDApp_ProcessOSALMsg()  //请求加入
                                   -->ZDO_JoinConfirmCB()  //终端设备加入网络
                                       -->ZDApp_SendMsg(...,ZDO_NWK_JOIN_IND,..); 将ZDO_NWK_JOIN_IND事件发生给ZDO层
                                       -->ZDApp_ProcessOSALMsg()
                                           -->ZDApp_ProcessNetworkJoin();  //设备加入网络
                                              -->osal_set_event(...,ZDO_STATE_CHANGE_EVT);  //终端设备
                                              -->NLME_StartRouteRequest(0,0,false);  //路由器
                                              -->osal_set_event(...,ZDO_ROUTER_START);

    ->osal_start_system();  //此时开始执行操作系统,不断检测操作系统是否有事件发生,有则跳去执行

zigbee中afIncomingMSGPacket_t结构体描述的是什么?
typedef struct
{
  osal_event_hdr_t hdr;     /* OSAL Message header *///OSAL消息头
  uint16 groupId;           /* Message‘s group ID - 0 if not set *///消息组ID
  uint16 clusterId;         /* Message‘s cluster ID *///消息族ID
  afAddrType_t srcAddr;     /* Source Address, if endpoint is STUBAPS_INTER_PAN_EP,
                               it‘s an InterPAN message *///源地址类型
  uint16 macDestAddr;       /* MAC header destination short address *///MAC物理地址
  uint8 endPoint;           /* destination endpoint */ //目的端点
  uint8 wasBroadcast;       /* TRUE if network destination was a broadcast address *///广播地址
  uint8 LinkQuality;        /* The link quality of the received data frame */ //接收数据帧的链路质量
  uint8 correlation;        /* The raw correlation value of the received data frame *///接收数据帧的未加工相关值。
  int8  rssi;               /* The received RF power in units dBm *///接收的射频功率。
  uint8 SecurityUse;        /* deprecated *///弃用
  uint32 timestamp;         /* receipt timestamp from MAC *///收到时间标记。
  afMSGCommandFormat_t cmd; /* Application Data */应用程序数据
} afIncomingMSGPacket_t;    //无线数据包格式结构体

typedef struct
{
  uint8  event;
  uint8  status;
} osal_event_hdr_t;

// Generalized MSG Command Format
typedef struct
{
  uint8   TransSeqNumber;
  uint16  DataLength;              // Number of bytes in TransData
  uint8  *Data;
} afMSGCommandFormat_t;

HalLedBlink(HAL_LED_1, 0, 50, 500);  //0是闪烁次数,但是0表示的是一直闪,不是不闪,50是百分之五十,就是亮灭各一半。500是周期,就是0.5s。

建立网络、加入网络流程分析

   协调器节点:在1-10  实验8 网络通信实验2 组播通信中

 while(MSGpkt)
   {
     switch(MSGpkt->hdr.event)
    {
    case ZDO_STATE_CHANGE:  //建立网络后,设置事件
      GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//???????
      if(GenericApp_NwkState==DEV_ZB_COORD)//把该节点已初始化为协调器,则执行下面的
      {
       HalLedBlink(HAL_LED_2,0,50,500);    //LED2 闪烁
       aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group);  //建立网路后,加入组。
       osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,5000);
      }
  路由器节点: 在1-10  实验8 网络通信实验2 组播通信中
 while(MSGpkt)
    {
      switch(MSGpkt->hdr.event)
      {
    case ZDO_STATE_CHANGE:   //加入网络后,加入族中
      GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//读取节点的设备类型
      if(GenericApp_NwkState==DEV_ROUTER)
      {
        aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group); //加入组中
      }
      break;
终端节点:1-5   实验4   串口通信2
    while(MSGpkt)
    {
      switch(MSGpkt->hdr.event)
      {
    case ZDO_STATE_CHANGE:
      GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//读取节点的设备类型
      if(GenericApp_NwkState==DEV_END_DEVICE)
      {
        //当中断节点加入网络后使用osal_set_envent()函数设置SEND_DATA_EVENT事件,当事件发生时,执行事件处理函数
        osal_set_event(GenericApp_TaskID,SEND_DATA_EVENT);//??????????????????????????
      }
      break; 

而上面的 GenericApp_NwkState是devStates_t GenericApp_NwkState;这样定义的,用于//保存节点状态   

[cpp] view plain copy
typedef enum
{
  DEV_HOLD,               // Initialized - not started automatically
  DEV_INIT,               // Initialized - not connected to anything
  DEV_NWK_DISC,           // Discovering PAN‘s to join
  DEV_NWK_JOINING,        // Joining a PAN
  DEV_NWK_REJOIN,         // ReJoining a PAN, only for end devices
  DEV_END_DEVICE_UNAUTH,  // Joined but not yet authenticated by trust center
  DEV_END_DEVICE,         // Started as device after authentication
  DEV_ROUTER,             // Device joined, authenticated and is a router
  DEV_COORD_STARTING,     // Started as Zigbee Coordinator
  DEV_ZB_COORD,           // Started as Zigbee Coordinator
  DEV_NWK_ORPHAN          // Device has lost information about its parent..
} devStates_t;
刚开始时,都是在GenericApp_Init()函数中将GenericApp_NwkState=DEV_INIT。然后再通过哪几步转到为上面三种情况DEV_ZB_COORD、DEV_ROUTER、DEV_END_DEVICE中的一种。
TI协议栈是半开源的,网络层代码并不开源。运行于端口0的ZDO负责应用层用户程序和网络层之间的通信。

网络层的建立过程是由ZDO来实现的。网络建立后应用层会接受到ZDO_STATE_CHANGE消息。使用下面语句就可以读取当前网络的状态。

GenericApp_NwkState=(devStates_t)(MSGpkt->hdr.status);//读取节点的设备类型  
时间: 2024-11-05 14:37:44

cc2530串口通信流程的相关文章

三菱FX2N PLC串口通信流程

串口初始化 D8120说明:※ 根据MD320的通讯协议,无帧头和帧尾,则(bit9,bit8)=(0,0).※ bit13-15是计算机链接通讯时的设定项目,使用RS指令时必须设定为0.※ RS485未考虑设置控制线的方法,使用FX2N-485-BD.FX0N-485ADP时,(bit11,bit10 )=(1,1).※ 若PLC和变频器之间的通讯参数如下:8位数据位,无校验,2位停止位,波特率9600,无帧头无帧尾,无协议模式,则D8120=H0C89(H表示16进制)(0000 1100

Zstack 串口通信

目标:实现PC与CC2530的串口通信,选择P0-2,P0-3 功能:PC发送任意字符串给单片机,单片机再把数据返回给PC电脑 首先说下执行流程:  1.打开zmain函数,这是整个zstack执行的主函数                           2. 定位到  osal_init_system();这个函数是系统初始化函数(zstack嵌入了osal操作系统)                           3.go to define of   osal_init_syste

嵌入式Linux裸机开发(七)——UART串口通信

嵌入式Linux裸机开发(七)--UART串口通信 一.UART串口通信简介 通用异步收发器简称UART,即UNIVERSAL ASYNCHRONOUS RECEIVER AND TRANSMITTER, 它用来传输串行数据.发送数据时, CPU 将并行数据写入UART,UAR按照一定的格式在一根电线上串 行发出:接收数据时, UART检测另一根电线的信号,将串行收集在缓冲区中, CPU 即可读取 UART 获得这些数据. 在 S5PV210中, UART提供了 4 对独立的异步串口I/O端口,

转:Qt编写串口通信程序全程图文讲解

转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Qt Creator中进行,如果在Linux下或直接用源码编写,程序稍有不同,请自己改动.) 在Qt中并没有特定的串口控制类,现在大部分人使用的是第三方写的qextserialport类,我们这里也是使用的该类.我们可以去 http://sourceforge.net/projects/qextser

java下的串口通信-RXTX

关于java实现的串口通信,使用的是开源项目RXTX,之前sun公司也有JCL项目,不过已经很久没有更新了,RXTX项目地址:点击打开,但是两个项目的API用法是一样的,只是导入的包不一样而已.简单的入门可以参照官方的wiki. 对应你的开发环境(Linux.window.Mac)下载对应的文件(下载地址),这里说下具体的安装方法,官方给的有点啰嗦,在Eclipse下使用,下载后里面的文件: RXTXcomm.jar包放到你项目的lib文件夹下,Java Builder Path---->Add

Z-Stack串口通信使用心得

最近在做一个智能家居的项目,用到了TI的CC2530芯片以及对应的zstack协议栈,其中串口通信部分使用的最多,下面就分享一下Z-Stack对串口封装的使用心得. Z-Stack中对串口操作的封装主要在hal_uart.h,hal_uart.c中, 支持DMA和ISR两种处理方式, 真正的实现则都封装在_hal_uart_dma.c 和_hal_uart_isr.c中,  但系统只推荐使用DMA方式, 可以通过修改宏定义来改为ISR的方式,宏定义在hal_board_cfg.h中. Z-Sta

ZStack串口通信

要使用ZStack就不得不先了解ZStack的OSAL工作原理 http://blog.csdn.net/qinpeng_zbdx/article/details/20990797 http://wenku.baidu.com/link?url=OILW1kTqP0nnNnLmuiCa9v... 了解事情的本质后,操作就很简单了 根据这篇博客可以很清楚的了解如何在ZStack下使用CC2530开发板进行串口通信 http://home.eeworld.com.cn/my/space-uid-53

51单片机串口通信

一.原理简介 51 单片机内部有一个全双工串行接口.什么叫全双工串口呢?一般来说,只能接受或只能发送的称为单工串行:既可接收又可发送,但不能同时进行的称为半双工:能同时接收和发送的串行口称为全双工串行口.串行通信是指数据一位一位地按顺序传送的通信方式,其突出优点是只需一根传输线,可大大降低硬件成本,适合远距离通信.其缺点是传输速度较低. 与之前一样,首先我们来了解单片机串口相关的寄存器. SBUF 寄存器:它是两个在物理上独立的接收.发送缓冲器,可同时发送.接收数据,可通过指令对SBUF 的读写

C#实现简单的串口通信

前言 本着学习研究的态度,用c#语言实现简单的串口通信工具. 一.串口通信原理 串口通信 串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节.尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据.它很简单并且能够实现远距离通信.由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据.其他线用于握手,但不是必须的.串口通信最重要的参数是波特率.数据位.停止位和奇偶校验.对于两个进行通信的