//串口发送接收流程

main:  //主函数
->osal_init_system(); //操作系统初始化
->osalInitTasks(); //任务初始化
-->ZDApp_Init(taskID++); //该函数初始化后,协调器建立网络、终端将加入网络
-->ZDOInitDevice(); //设备初始化
-->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(,,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是闪烁次数,但是0表示的是一直闪,不是不闪,50是百分之五十,就是亮灭各一半。500是周期,就是0.5s。 建立网络、加入网络流程分析 协调器节点:在1- 实验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,,,); //LED2 闪烁
aps_AddGroup(GENERICAPP_ENDPOINT,&GenericApp_Group); //建立网路后,加入组。
osal_start_timerEx(GenericApp_TaskID,SEND_TO_ALL_EVENT,);
}
路由器节点: 在1- 实验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;
终端节点:- 实验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);//读取节点的设备类型

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

  1. CC2530串口通信

    任何USART双向通信至少需要两个脚:接收数据输入(RX)和发送数据输出(TX). RX:接收数据串行输入.通过采样技术来区别数据和噪音,从而恢复数据. TX :发送数据输出.当发送器被禁止时,输出引 ...

  2. Qt编写串口通信程序全程图文解说

    (说明:我们的编程环境是windows xp下,在Qt Creator中进行,假设在Linux下或直接用源代码编写,程序稍有不同,请自己修改.) 在Qt中并没有特定的串口控制类,如今大部分人使用的是第 ...

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

    转载:http://blog.csdn.net/yafeilinux/article/details/4717706  作者:yafeilinux (说明:我们的编程环境是windows xp下,在Q ...

  4. Qt串口通信

    1. Qt串口通信类QSerialPort 在Qt5的的更新中,新增了串口通信的相关接口类QSerialPort,这使得在开发者在使用Qt进行UI开发时,可以更加简单有效地实现串口通信的相关功能. 开 ...

  5. 基于FPGA的红外遥控解码与PC串口通信

    基于FPGA的红外遥控解码与PC串口通信 zouxy09@qq.com http://blog.csdn.net/zouxy09 这是我的<电子设计EDA>的课程设计作业(呵呵,这个月都拿 ...

  6. ROS串口通信

    身处机器人行业,不想一直只做低端的单片机控制,老是待在舒适区,所以一直都想学一下ROS系统,但看了几个月资料后,感觉还是云里雾里,似懂非懂,感念似乎都很清楚,但要实际去做,却又感觉无从下手. 于是想先 ...

  7. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)

    星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...

  8. ZStack串口通信

    要使用ZStack就不得不先了解ZStack的OSAL工作原理 http://blog.csdn.net/qinpeng_zbdx/article/details/20990797 http://we ...

  9. 【嵌入式】——arm裸机开发 step by step 之 串口通信

    一.在使用S5PV210的串口发送和接收的时候,首先要对S5PV210的串口进行配置,我们使用轮询方式时的配置有哪些? 1.配置GPIO,使对应管脚作为串口的发送和接收管脚 GPA0 0 1 管脚 2 ...

随机推荐

  1. win7下将dll文件的打开方式改回系统默认

    打开注册表,定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\FileExts\.dll把除OpenWit ...

  2. Chapter 2 Open Book——22

    I dropped my head, letting my hair fall to conceal my face. 我低下了我的头,让我的头发垂下来隐藏我的脸. I was sure,though ...

  3. 用 js 做 URL 跳转带来的 Referer 丢失问题.

    http 302 重定向是可以保持 referer 的.例:在 A 页面上提交登录表单到 B,B 返回一个重定向页面到 C,在 C 处理里面检查 Referer 可知道它的来源是 A 而不是 B. 但 ...

  4. 当@PathVariable遇上中文和点

    当@PathVariable遇上中文和点 Spring MVC从3.0开始支持REST,而主要就是通过@PathVariable来处理请求参数和路径的映射.  由于考虑到SEO的缘故,很多人喜欢把新闻 ...

  5. log4j之mybatis配置

    简单记录一下,配置,因为项目要转向maven架构,所以jar有maven管理,配置完成之后发现原先的sql语句都出不来了,于是搜了一下 mybatis+log4j所需要的依赖如下(我列出我用的版本): ...

  6. redis配置密码认证

    redis配置密码 1.通过配置文件进行配置yum方式安装的redis配置文件通常在/etc/redis.conf中,打开配置文件找到 ? 1 #requirepass foobared 去掉行前的注 ...

  7. LVS + keepalived + tomcat负载均衡及高可用实现(初级)

    1.首先检测Linux服务器是否支持ipvs 执行如下命令:modprobe -l|grep ipvs 输出: kernel/net/netfilter/ipvs/ip_vs.ko kernel/ne ...

  8. vi命令的常用操作

    G:移动到底部 进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件, ...

  9. PID控制学习笔记(一)

    比例控制往往会存在稳态误差(该结论适用于0型对象) 由比例度的定义和意义,比例增益Kc越大,即直线的斜率越大,则,越快达到平衡,稳态误差越小,因此在保证系统相对稳定性一定的条件下,总是希望比例增益越大 ...

  10. HttpServletResponse对象

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象. request和response对象即然代表请求和响应,那我们 ...