在使用ZigBee进行数据透传的时候,我遇到了这样的情况:负责采集数据的两个单片机之间的波特率不相同,一个是38400,另一个是115200,但是负责传输数据的CC2530除了波特率之外,其它的代码都一样,所以使CC2530可以自适应波特率的话,那么只需要准备一份代码,一种ZCC2530模块,可以方便使用。
  处理的逻辑是这样的:38400波特率的单片机上电之后不停给CC2530发送数据“0x55”,CC2530上电默认波特率38400,如果收到“0x55”,则返回一个字符“#”,此单片机收到“#”后不再发送0x55,开始处理自己的业务。
  如果与CC2530加入网络后一定时间内(比如3s)没有收到“#”,则说明与之相连的不是38400波特率的单片机,则把自己的波特率改为115200。
CC2530的串口初始化:

static  halUARTCfg_t uartConfig;//将串口的配置结构体申请为全局的uartConfig.configured           = TRUE;              // 2x30 don't care - see uart driver.uartConfig.baudRate             = HAL_UART_BR_38400;uartConfig.flowControl          = FALSE;uartConfig.flowControlThreshold = SERIAL_APP_THRESH; // 2x30 don't care - see uart driver.uartConfig.rx.maxBufSize        = SERIAL_APP_RX_SZ;  // 2x30 don't care - see uart driver.uartConfig.tx.maxBufSize        = SERIAL_APP_TX_SZ;  // 2x30 don't care - see uart driver.uartConfig.idleTimeout          = SERIAL_APP_IDLE;   // 2x30 don't care - see uart driver.uartConfig.intEnable            = TRUE;              // 2x30 don't care - see uart driver.uartConfig.callBackFunc         = SerialApp_CallBack;HalUARTOpen (SERIAL_APP_PORT, &uartConfig);

串口接收数据的处理函数。使用bdrOKflag来标记是否已经确定波特率。

static void SerialApp_CallBack(uint8 port, uint8 event)
{(void)port;if ((event & (HAL_UART_RX_FULL | HAL_UART_RX_ABOUT_FULL | HAL_UART_RX_TIMEOUT)) &&
#if SERIAL_APP_LOOPBACK(SerialApp_TxLen < SERIAL_APP_TX_MAX))
#else!SerialApp_TxLen)
#endif{SerialApp_TxLen = HalUARTRead(SERIAL_APP_PORT, SerialApp_TxBuf, SERIAL_APP_TX_MAX); //将串口数据读入bufif(SerialApp_TxLen > 0){if(bdrOKflag)//波特率的确定标志{HalLedBlink(HAL_LED_2,2,50,200);//转发消息  绿灯闪2下SerialApp_OTAData(&SerialApp_TxAddr,SERIALAPP_CLUSTERID1,SerialApp_TxBuf, SerialApp_TxLen);}if (0x55 == SerialApp_TxBuf[0]){HalLedBlink(HAL_LED_1,2,50,200);//红灯闪两下  说明是38400的波特率uint8 a = '#';HalUARTWrite(SERIAL_APP_PORT, &a, 1); //通过串口发送给网关         bdrOKflag = 1;}}SerialApp_TxLen = 0;}
}

  设置一个事件用于改变波特率。在ZDO_STATE_CHANGE,也就是设备加入网络的时候设置一个事件定时器,3s后执行。
  在3s后触发事件CHANGEBAUDRATE_EVT ,如果bdrOKflag 没被标记为1,则更换波特率。

UINT16 SerialApp_ProcessEvent( uint8 task_id, UINT16 events )
{(void)task_id;  // Intentionally unreferenced parameterif ( events & SYS_EVENT_MSG ){afIncomingMSGPacket_t *MSGpkt;while ( (MSGpkt = (afIncomingMSGPacket_t *)osal_msg_receive( SerialApp_TaskID )) ){switch ( MSGpkt->hdr.event ){
。。。。。。。。case ZDO_STATE_CHANGE:SampleApp_NwkState = (devStates_t)(MSGpkt->hdr.status);if(SampleApp_NwkState == DEV_END_DEVICE) //判定当前设备类型{HalLedSet(HAL_LED_1,HAL_LED_MODE_ON);//红灯亮。绿灯闪烁5下HalLedBlink(HAL_LED_2,5,50,200);osal_start_timerEx(SerialApp_TaskID, CHANGEBAUDRATE_EVT, 3000);}break;default:break;}osal_msg_deallocate( (uint8 *)MSGpkt );}
。。。。。。。。。。return ( events ^ SYS_EVENT_MSG );}
。。。。。。。。。。。。。if ( events & CHANGEBAUDRATE_EVT ) //切换波特率的事件{if (bdrOKflag == 0){uartConfig.baudRate             = HAL_UART_BR_115200;HalUARTOpen (SERIAL_APP_PORT, &uartConfig);bdrOKflag = 1;}return ( events ^ CHANGEBAUDRATE_EVT );}
。。。。。。。。。。。。。。。

ZIGBEE(CC2530,ZSTACK)串口波特率自适应相关推荐

  1. ZigBee TI ZStack CC2530 3.18 串口01-发送

    (配套源码.软件.开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 这一节,基于<ZigBee CC2530 Z-Stack 06 创建基于Z-Stack的全新工程>一节 ...

  2. zigbee zstack 串口,按键,消息,定时器

    协议栈中的串口接收流程 串口在底层使用的是中断,轮询还是DMA呢??答案从下面这个文件定义的宏可以得知 在C:\Texas Instruments\ZStack-CC2530-2.3.0-1.4.0\ ...

  3. ZigBee TI ZStack CC2530 2.4 IAR软件版本

    (配套源码.软件.开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 一.IAR IAR,全称IAR Systems.公司总部位于北欧的瑞典,在美国.日本.英国.德国.比利时.巴西和中 ...

  4. ZigBee TI ZStack CC2530 3.10 IO口01-输入输出

    [配套源码.文档.软件.硬件等资源,入口见文末] 一.前言 本博客ZigBee分支关于CC2530的IO口部分的介绍,分为如下三篇文章: 1.ZigBee TI ZStack CC2530 3.9 I ...

  5. zigbee CC2530 系列教程 7 串口数据收发实验

    4.6串口数据收发实验 4.6.1 实验目的 1.了解串口通信的相关知识: 2.学习CC2530单片机串口相关寄存器配置,实现串口通信功能: 4.6.2 实验讲解 CC2530芯片有两个串行接口UAR ...

  6. ZigBee,ZStack

    http://antkillerfarm.github.io/ ZigBee应用导读 1.设备类型 Zigbee组网设备分为三类: 1.Coordinator(图中黑色的节点).发起网络,并确定PAN ...

  7. CC2530的串口实验

    CC2530的串口实验主要有编程主要有一下几个步骤: 一.串口初始化函数(设置时钟频率-->选择用来当做串口的IO-->设置波特率-->发送中断设为0) 二.字符串发送函数(U0DB ...

  8. zigbee之Zstack协议栈使用

    zigbee之Zstack协议栈使用 前言 基于zstack协议栈开发的步骤 一.OSAL操作系统 1.操作系统工作流程 2.OSAL初始化函数 3.系统启动函数 (1)任务 (2)事件 4.OSAL ...

  9. zigbee CC2530 系列教程 0 课程介绍

    本课程主要是CC2530的系列课程,并附上源码. 课程内容大体安排如下: 理论课程: 第一章:ZigBee简介 第二章:ZigBee软件开发平台的搭建 zigbee CC2530 系列教程 3 点亮1 ...

最新文章

  1. Linux-DNS服务器的配置与管理(上)
  2. 一步步写一个符合Promise/A+规范的库 1
  3. 三大运营商借5G消息围攻微信,就问张小龙怕不怕
  4. JSP 9 大内置对象详解
  5. SSL/TLS握手过程
  6. ubuntu16.04安装MATLAB R2017b步骤详解(附完整破解文件包)
  7. [总结]SqlServer中如何实现自动备份数据!
  8. js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量)...
  9. 第三季-第27课-Shell脚本高级编程
  10. 181009词霸有道扇贝每日一句
  11. 四线温度探头怎么接线_热电阻的接线方式
  12. App消息推送的原理
  13. 结存对数据库性能的影响压测
  14. LigerUi的Form表单展示
  15. 专访HTML5 Boilerplate项目核心成员——石川
  16. 鸿蒙os5月后还能申请吗,鸿蒙12月申请过现在还能申请吗?
  17. Self-attention中为什么softmax要除d_k
  18. ISA, x86,x86_64, AMD64, 指令集等名词解析
  19. acwing 217.绿豆蛙的归宿
  20. 群老大——区块链社群将成为主流的生产组织

热门文章

  1. ATM交换机通讯管理基础
  2. css 文字 3d旋转动画,CSS3 简单的三维文字旋转动画
  3. stm32与三极管8050NPN集电极开路驱动电路---1
  4. cinahl数据库怎么进入_CINAHL数据库基本检索教学指南-EBSCOHelp.ppt
  5. textarea的高度自适应
  6. uniapp的APP证书、秘钥、应用包名、应用签名
  7. SQL--盲注和宽字节注入
  8. 计算机三级网络技术最全知识点总结【9】
  9. Unity中实现模型外发光——HighlightingSystem插件
  10. 线性代数学习笔记7-1:特征值、特征向量、特征值的虚实性、迹、相似不变量