ZIGBEE(CC2530,ZSTACK)串口波特率自适应
在使用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)串口波特率自适应相关推荐
- ZigBee TI ZStack CC2530 3.18 串口01-发送
(配套源码.软件.开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 这一节,基于<ZigBee CC2530 Z-Stack 06 创建基于Z-Stack的全新工程>一节 ...
- zigbee zstack 串口,按键,消息,定时器
协议栈中的串口接收流程 串口在底层使用的是中断,轮询还是DMA呢??答案从下面这个文件定义的宏可以得知 在C:\Texas Instruments\ZStack-CC2530-2.3.0-1.4.0\ ...
- ZigBee TI ZStack CC2530 2.4 IAR软件版本
(配套源码.软件.开发板等资源,可移步博客同名QQ群/TB店铺:拿破仑940911) 一.IAR IAR,全称IAR Systems.公司总部位于北欧的瑞典,在美国.日本.英国.德国.比利时.巴西和中 ...
- ZigBee TI ZStack CC2530 3.10 IO口01-输入输出
[配套源码.文档.软件.硬件等资源,入口见文末] 一.前言 本博客ZigBee分支关于CC2530的IO口部分的介绍,分为如下三篇文章: 1.ZigBee TI ZStack CC2530 3.9 I ...
- zigbee CC2530 系列教程 7 串口数据收发实验
4.6串口数据收发实验 4.6.1 实验目的 1.了解串口通信的相关知识: 2.学习CC2530单片机串口相关寄存器配置,实现串口通信功能: 4.6.2 实验讲解 CC2530芯片有两个串行接口UAR ...
- ZigBee,ZStack
http://antkillerfarm.github.io/ ZigBee应用导读 1.设备类型 Zigbee组网设备分为三类: 1.Coordinator(图中黑色的节点).发起网络,并确定PAN ...
- CC2530的串口实验
CC2530的串口实验主要有编程主要有一下几个步骤: 一.串口初始化函数(设置时钟频率-->选择用来当做串口的IO-->设置波特率-->发送中断设为0) 二.字符串发送函数(U0DB ...
- zigbee之Zstack协议栈使用
zigbee之Zstack协议栈使用 前言 基于zstack协议栈开发的步骤 一.OSAL操作系统 1.操作系统工作流程 2.OSAL初始化函数 3.系统启动函数 (1)任务 (2)事件 4.OSAL ...
- zigbee CC2530 系列教程 0 课程介绍
本课程主要是CC2530的系列课程,并附上源码. 课程内容大体安排如下: 理论课程: 第一章:ZigBee简介 第二章:ZigBee软件开发平台的搭建 zigbee CC2530 系列教程 3 点亮1 ...
最新文章
- Linux-DNS服务器的配置与管理(上)
- 一步步写一个符合Promise/A+规范的库 1
- 三大运营商借5G消息围攻微信,就问张小龙怕不怕
- JSP 9 大内置对象详解
- SSL/TLS握手过程
- ubuntu16.04安装MATLAB R2017b步骤详解(附完整破解文件包)
- [总结]SqlServer中如何实现自动备份数据!
- js中单引号和双引号的区别(html中属性规范是用双引号,js中字符串规定是用单引号)(js中单引号区别和php很像:单引号快,双引号可转义字符,双引号可解析变量)...
- 第三季-第27课-Shell脚本高级编程
- 181009词霸有道扇贝每日一句
- 四线温度探头怎么接线_热电阻的接线方式
- App消息推送的原理
- 结存对数据库性能的影响压测
- LigerUi的Form表单展示
- 专访HTML5 Boilerplate项目核心成员——石川
- 鸿蒙os5月后还能申请吗,鸿蒙12月申请过现在还能申请吗?
- Self-attention中为什么softmax要除d_k
- ISA, x86,x86_64, AMD64, 指令集等名词解析
- acwing 217.绿豆蛙的归宿
- 群老大——区块链社群将成为主流的生产组织