ZigBee组网-基于协议栈的UART实验(实现收发)(保姆级)

news2024/9/27 15:22:10

目录

基于协议栈的UART实验

前言

协议栈中的TI自带UART的使用实验

UART配置基本步骤

串口初始化

串口发送

串口接收回显

实验效果

拓展

移植我们自己UART串口

移植配置过程

实验效果


基于协议栈的UART实验

前言

        与之前的Zigbee裸机实验不同,我们既可以使用CC2530的裸机串口实验的UART作为BSP支持包移植到我们的Zstack协议栈中来使用,也可以使用TI协议栈自带的UART。但这两种方法都需要进行配置。

        我今天在做Zigbee单播实验的过程中就想把前面学习的裸机串口直接改改来过来用,结果发现根本用不了,不仅串口收发不了数据,还导致CC2530模块卡死,连协议栈的其它功能也被毁掉了。

        后来通过查阅资料和自己一晚上的琢磨,成功实现了协议栈中UART的使用,实现了串口与电脑上位机的收发通信。

        接下来进行Zigbee协议栈中的UART的两种使用方法的讲解。

注:本文参考于:

https://www.cnblogs.com/sjsxk/p/5365705.html

ZigBee组网学习笔记(三 )--协议栈串口实验_协议栈 ztool_p1_李国冬的博客-CSDN博客

学习记录 | ZigBee协议栈实践——串口收发数据_keil zigbee_智慧益力多的博客-CSDN博客

协议栈中的TI自带UART的使用实验

UART配置基本步骤

我们裸机使用串口功能的步骤是:

        (1) 串口初始化;

        (2) 执行任务(发送/接收)。

其实,跟裸机实验里的串口实验一样,本实验也是按照同样的步骤来进行的,第(1)步不变;在第(1)步和第(2)步之间需要多做了一步,就是:给它登记一下;第(2)步照样执行。所以,本实验使用串口的具体步骤是:

        (1) 串口初始化;

        (2) 登记任务号;

        (3) 执行任务。

下面分别介绍各个步骤。

串口初始化

        以前,配置串口号、波特率、流控、校验位,配置好寄存器,然后使用。

        现在,在workspace下找到HAL\Target\CC2530EB\drivers的hal_uart.c文件,可以看到里面已经包括了串口初始化、发送、接收等函数。

        workspace上的MT层,发觉有很多基本函数,前面带MT。包括MT_UART.C,我们打开这个文件。看到MT_UartInit()函数,这里也有一个串口初始化函数,没错Z-stack上有一个MT层,用户可以选用MT层配置和调用其他驱动。进一步简化了操作流程。

        跟裸机的实验一样,我们也要配置串口号、波特率、流控,校验位等,以前我们要配置相关的寄存器,现在我们可以直接通过库函数来控制。打开MT_UART.c。然后找到MT_UartInit ()函数。

MT_UartInit ()函数如下面的代码所示

        我们可以看出,这跟我们普通的串口配置没有太大区别,都是要配置串口所需要的初始化,在这个实验中,我们要修改的就是波特率和流控制,波特率要修改和配置成115200,和连接串口的上位机保持一致,流控制也要关闭,赋值false,因为我们只需要用到RX、TX 两根线,所以不需要额外的流控制。

通过定位跳转,我们可以发现波特率有以下选择

同样定位发现TRUE是1,FALSE是0,所以放心修改。


注意:

#define MT_UART_DEFAULT_BAUDRATE HAL_UART_BR_38400 默认的波特率是 38400bps,波特率不能设置太低,会导致收发数据出现过高延时。

#define MT_UART_DEFAULT_OVERFLOW TRUE

默认是打开串口流控的,如果你是只连了 TX/RX 2 根线的方式务必关流控,本功能底板只连了 TX/RX 2 根线,要改为FALSE

#define MT_UART_DEFAULT_OVERFLOW FALSE

此外再次强调:2 根线的通讯连接务必关流控,不然是永远收发不了信息的。


修改完之后,我们在SampleApp_Init( uint8 task_id )函数调用配置好的MT_UartInit ()函数;然后,记得在SampleApp.c 文件开头的地方将图所示的头文件include 进去。

(由于我的Zstack被我移植过了,所有的SampleApp都被我修改成了StarryApp)

登记任务号

这也是跟裸机串口发送有所区别的地方,只有登记了任务号,系统才会执行这个函数的功能,相当于去旅店住房要去登记一样,服务员会根据客房情况给你安排房间。登记任务号我们是用MT_UartRegisterTaskID(task_id)函数,来登记串口方面的任务号。

串口发送

使用语句: HalUARTWrite(0,”Hello World\n”,12); //(串口 0,‘字符’,字符个数(不包括'\0')。)

也可以写成 HalUARTWrite(0,”Hello World\n”,sizeof("Hello World\n")-1);

我这里再main函数中调用

该函数在hal_uart.c中被定义

注意:发现烧入程序后,串口打印出来的 Hello World 后面有一小段乱码。这是 Z-stack MT 层定义的串口发送格式,还有液晶提示信息。

我们可以在预编译地方把 MT 和 LCD 相关内容 注释掉(IAR 与 KEIL 中的STM32的预定义宏有些类似)。如下:

ZTOOL_P1

xMT_TASK

xMT_SYS_FUNC

xMT_ZDO_FUNC

xLCD_SUPPORTED=DEBUG

xMT_TASK:表示没有定义 MT_TASK,也就是不定义了。

修改前:

修改后:

用 ZTOOL,串口 0。我们可以在 option——C/C++ 的 CompilerPreprocessor 里 面看到,已经默认添加 ZTOOL_P1 预编译。

(其中ZTOOL_P1 --- 串口0 ZTOOL_P2 --- 串口1 )

改好的重新编译再下载,按复位键,观察串口已经没有乱码了。

串口接收回显

下面我们继续来实现将串口收到的数据发送回给发送方上位机。

首先这里需要自己写一个串口接收回调函数,函数名可以自定义

void My_UART_RxReturn( uint8 port, uint8 event )
{
    unsigned char buf[30];
    unsigned char len;
    
    len = HalUARTRead(0,  buf, 30);//读取串口数据,返回数据长度
    if(len)
    {
        HalUARTWrite(0, buf, len);//通过串口原样返回数据 也可以修改数据返回用于区分数据
        len = 0;
    }
}

然后将其定义在hal_uart.c中,还要注意要在头文件声明

最后一定要记得把MT_UartInit中的串口回调函数改成自己刚刚定义的串口接收回调函数

实验效果

拓展

我们在协议栈里再做一个测试,在 osal_start_system()函数里 for(;;)里加入:

HalUARTWrite(0,”Hello,World\n”,12);

下载运行后发现串口不停地接收到 Hello,World。

这就证明了前一节的协议栈运行后会在这个函数里不停地循环查询任务、执行任务。

这只是一个演示用的方法,实际应用中你可 千万不能有把串口发送函数弄到这个位置,然后给 PC 发信息。

因为这 破坏了协议栈任务轮询的工作原则,相当于我们普通单片机不停用 Delay 延时函数一样,是极其低效的。

移植我们自己UART串口

移植配置过程

我们将自己的串口BSP文件拷贝并添加到工程中来,以便于与上面的TI串口收发做区分,我们自己的串口初始化使用9600波特率。

starry_uart.h

#ifndef _STARRY_UART_H
#define _STARRY_UART_H
#include <iocc2530.h>

void delay_us(void);
void Init32M(void);
void delay_ms(int ms);
void Uart_Config(void);
void String_Print(unsigned char *str);
#endif

 starry_uart.c

#include "starry_uart.h"
void delay_us(void)
{
  char k=63;
  while(k--);
}
void Init32M(void)
{
  SLEEPCMD &= ~(0x01<<1); //1111 1110 寮€鍚袱涓珮棰戞椂閽熸簮
  while(SLEEPSTA & 0x40==0);//0100 0000 绛夊緟32M绋冲畾
  delay_us();
  CLKCONCMD &= 0xF8;//浣?浣嶆竻闆?涓嶅垎棰戣緭鍑?  CLKCONCMD &= 0xBF; //1011 1111 璁剧疆32M涓虹郴缁熶富鏃堕挓
  while(CLKCONSTA & 0x40); //0100 0000 绛夊緟32M鎴愬姛閰嶇疆涓哄綋鍓嶇郴缁熶富鏃堕挓
}

void delay_ms(int ms)
{
  int i,j;
  for(i=ms;i>0;i--)
     for(j=587;j>0;j--);
}
void Uart_Config()
{
  //Baud :9600
  PERCFG &= 0xFE;//1111 1110 
  P0SEL |= 0x0C; //0000 1100  
  U0CSR |= 0xC0;
  U0GCR = 8;
  U0BAUD = 59; //9600
  EA=1;
  URX0IE=1;
}
void String_Print(unsigned char *str)
{
  for(;*str!='\0';str++)
  {
    U0DBUF=*str;
    while(UTX0IF==0);
    UTX0IF=0;
  }
}

#pragma vector=URX0_VECTOR
__interrupt void UART0_IRQ(void)
{
  char ch;
  URX0IF = 0;
  ch = U0DBUF;
  U0DBUF = ch;
  while(UTX0IF == 0);
  UTX0IF = 0;
}

将串口初始化在main函数末尾调用,并调用我们自己扳机支持包里的串口字符串发送函数

进入main函数中的HalDriverInit驱动初始化函数中

找到TI串口配置的宏定义

将宏定义改为FALSE,从而取消TI默认对串口的配置

最后下载程序即可

实验效果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712370.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神奇的MATLAB解密工具,让你轻松解密.p文件!

大家都知道&#xff0c;MATLAB是一款功能强大的数学软件&#xff0c;但是在进行代码保护和共享方面&#xff0c;却存在一些困难。这时候&#xff0c;一款优秀的MATLAB解密工具就显得尤为重要。它可以帮助我们解决诸多问题&#xff0c;比如.p文件解密、p文件转m代码等。接下来&a…

mallocstacklogging和MallocStackLoggingNoCompact引起的app文稿数据快速增加

最近由于定位一个iOS16系统适配引起的闪退设置了mallocstacklogging和MallocStackLoggingNoCompact。 配置如下&#xff1a; 在上线前测试&#xff0c;结果发现手机存储空间不足。删除了手机的很多图片后&#xff0c;测试不到两分钟&#xff0c;手机存储空间又不足了。查看app…

Flink运行原理

Apache Flink是什么&#xff1f;对于这个问题&#xff0c;Apache软件基金会官方给出了定义&#xff1a;Flink是一种框架和分布式处理引擎&#xff0c;主要用于对无界和有界数据流进行有状态计算。 本文将从以下几个方面来了解flink运行原理&#xff1a; 【Flink运行时四大组件…

骨传导耳机可以长期佩戴吗,几款佩戴舒适的骨传导耳机清单

骨传导耳机是通过耳朵传声方式&#xff0c;提高了听神经的使用频率&#xff0c;对听觉系统所产生刺激会随之下降。目前骨传导耳机主要应用于运动和娱乐两大领域&#xff0c;尤其是在运动场景中骨传导耳机能够避免传统耳机因佩戴入耳式耳机造成的听力下降问题&#xff0c;更能增…

Python批量将doc转成docx并读取docx的内容

有时候我们需要将doc的文件转成docx的格式&#xff0c;但是如果直接修改文件名后缀的话有时候会没有效果&#xff0c;今天我们利用python批量将doc后缀的word文档转成docx的格式。 也找了很多方法&#xff0c;最终还是找到了就是利用win32com去解决这个问题 很多人在执行这一…

【MySQL】不就是事务

前言 嗨咯&#xff0c;小伙伴们大家好呀&#xff0c;我已经一个星期没有更新了&#xff0c;实在抱歉&#xff01;本期我们要学习MySQL初阶中的最后一课&#xff0c;MySQL数据库中的事务也算是近几年面试必考的问题&#xff0c;所以我们一定要认真学习。 目录 前言 目录 一、事…

学会用智慧轻松的方式过生活

曾经&#xff0c;有位远在黑龙江的女性福主告诉峰民&#xff0c;她说她活不久了。 峰民很是惊讶&#xff0c;不可能吧&#xff0c;你才39岁啊&#xff0c; 她说&#xff1a;我查出了子宫有瘤&#xff0c;峰民听后就说&#xff0c;没事&#xff0c;放心&#xff0c;肯定是良性。…

Python3,处理Excel文件IO流的方法那么多,或许只有Pandas算得上靠谱。

Pandas处理Excel文件IO流的方法 1、引言2、代码实例2.1 什么是文件IO流2.1.1定义2.1.2 字节流、字符流 2.2 常见的Excel文件IO流处理方法2.3 Pandas处理Excel文件IO流2.3.1 直接读取处理2.3.2 转换io流进行处理 3、总结 1、引言 小屌丝&#xff1a;鱼哥&#xff0c; 求助。 小…

深度学习技巧应用22-构建万能数据生成类的技巧,适用于CNN,RNN,GNN模型的调试与训练贯通

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用22-构建万能数据生成类的技巧&#xff0c;适用于CNN,RNN,GNN模型的调试与训练贯通。本文将实现了一个万能数据生成类的编写&#xff0c;并使用PyTorch框架训练CNN、RNN和GNN模型。 目录&#xff1…

摄像机控制——旁轴摇移

通常摄像机进行摇移控制的时候&#xff0c;都是以摄像机正前方中心位置作为注视点进行环绕控制的&#xff0c;如果在注释点位置有物体&#xff0c;那么感受上是围绕着该物体进行观察。 但是最近公司的策划要求摇移时候的围绕点是鼠标点击的位置&#xff0c;而不是摄像机的正中心…

零基础网络安全学习路线,真的很全,建议收藏!!!

很多小伙伴在网上搜索网络安全时&#xff0c;会出来网络安全工程师这样一个职位&#xff0c;它的范围很广&#xff0c;只要是与网络安全挂钩的技术人员都算网络安全工程师&#xff0c;一些小伙伴就有疑问了&#xff0c;网络安全现在真的很火吗&#xff1f; 那么今天博主就带大…

从0实现基于Linux socket聊天室-多线程服务器模型(一)

前言Socket在实际系统程序开发当中&#xff0c;应用非常广泛&#xff0c;也非常重要。实际应用中服务器经常需要支持多个客户端连接&#xff0c;实现高并发服务器模型显得尤为重要。高并发服务器从简单的循环服务器模型处理少量网络并发请求&#xff0c;演进到解决C10K&#xf…

AntDB数据库将携创新性解决方案亮相2023可信数据库发展大会

由中国通信标准化协会指导&#xff0c;中国通信标准化协会大数据技术标准推进委员会&#xff08;CCSA TC601&#xff09;主办的“2023可信数据库发展大会”将于2023年7月4日——5日在北京国际会议中心召开。作为深耕通信行业15年的国产数据库产品&#xff0c;AntDB受邀参会&…

记录一下kibana启动链接报错问题(kibana server is not ready yet)

记录一下kibana启动链接报错问题(kibana server is not ready yet) 今天启动kibana出现该问题 先去看了看是否是elasticsearch连接出错 启动了容器 docker start elasticsearch docker start kibana进入了kibana容器 docker exec -it kibana bash进行了下面的操作&#xf…

No suitable driver found for

在学习Mbatis时候遇到的奇怪的问题&#xff0c;报错提示如图所示&#xff0c;提示找不到数据库驱动 检查db.properties文件,一开始认为没问题 drivercom.mysql.jdbc.Driver urljdbc:mysql://localhost:3306/mybatis?useSSLfalse&useUnicodetrue&characterEncodingUTF…

华为OD机试真题2023Q1 100分 + 2023 B卷(JavaPythonJavaScript)

目录 2023 5月 B卷 “新加题”&#xff08;100分值&#xff09;2023Q1 100分下面分享一道“2023Q1 200分 机器人活动区域”的解题思路一、题目描述二、输入描述三、输出描述四、解题思路五、Python算法源码六、效果展示1、输入2、输出 大家好&#xff0c;我是哪吒。 五月份之前…

react基础-生命周期render props模式高阶组件原理揭秘

组件生命周期&#xff08;★★★&#xff09; 目标 说出组件生命周期对应的钩子函数钩子函数调用的时机 概述 意义&#xff1a;组件的生命周期有助于理解组件的运行方式&#xff0c;完成更复杂的组件功能、分析组件错误原因等 组件的生命周期&#xff1a; 组件从被创建到挂…

通用机器人里程碑?谷歌展示全球首个多任务AI智能体

目录 两大硬核科技支撑通用机器人研发&#xff08;1&#xff09;自生成训练数据&#xff08;2&#xff09;基于多模态模型 科技巨头同台比拼 中国产业链凸显性价比优势发展初期硬件先行 运动模块价值量最高 已学会套圈、搭积木、抓水果…… 人工智能和机器人&#xff0c;总是不…

MES生产管理系统与ERP系统的集成以及优势

导言&#xff1a; 在当今数字化转型的浪潮中&#xff0c;企业越来越意识到整合各个部门的数据和流程的重要性。MES生产管理系统和ERP系统是两个关键的管理工具&#xff0c;它们在企业中发挥着不可或缺的作用。本文将探讨企业MES管理系统与ERP系统进行集成&#xff0c;以及这种…

它如何做到让我们持久且不感疲劳

写在前面 随着科技的进步和数字化生活的兴起&#xff0c;人们长时间使用显示器的需求增加&#xff0c;越来越多的人戴眼镜并且面临眼睛问题。显示器屏幕灯在当今社会也逐渐扮演着不可或缺的角色。 首先&#xff0c;显示器屏幕灯能够提供必要的亮度&#xff0c;确保我们在各种…