0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

机智云Gokit3.X源代码分析之串口接收数据这块的机制

9GxC_IoTMaker 来源:未知 作者:李倩 2018-07-13 14:51 次阅读

昨天分享了整个程序的架构,今天重点分析一下串口接收数据这块的机制

我们知道,通过串口接收数据一般有3中方式,轮询、中断以及DMA。轮询模式为堵塞模式,必须要定时去查询收到的数据;中断模式为非堵塞模式,也是平时用的比较多的,但每次只能接收一个字节;还有一个比较好的方法那就是用串口的空闲中断+DMA实现串口数据的接收,在接收一帧数据只需要中断一次,这样就可以接收不定长数据了。机智云这里采用的方式2,即常规的中断方式。

数据通讯采用的串口2,引脚为GPIO2和GPIO3,在gizwitsInit()中进行初始化

我们进去看看

上图主要初始化了一些硬件接口,并开启中断,这也是我们一般的写法,再往下看,看到一个pRb的结构体,这是个什么呢,我们追踪下,下面是pRb的定义

我们先来解释下环形缓冲区的原理:

环形缓冲区通常有一个读指针和一个写指针。读指针指向环形缓冲区中可读的数据,写指针指向环形缓冲区中可写的缓冲区。通过移动读指针和写指针就可以实现缓冲区的数据读取和写入。在通常情况下,环形缓冲区的读用户仅仅会影响读指针,而写用户仅仅会影响写指针。

这里的rbCapacity代表缓冲区的容量,head指向了读区域,tail指向了写区域,rbBuff指向缓冲区的入口地址,示意图入下

明白了结构体的定义,我们接着往下看

rbCreate(),顾名思义,此函数的作用用于创建缓冲区,将缓冲区的head/Tail都指向缓冲区的首地址,那么rbCapacity和rbBuff在哪里赋值的呢?我们返回去看gizwitsInit();

看到这里我们就明白了,继续往下看

这个函数为删除缓冲区函数,将结构体里面的数据全部清零

这个函数为获取缓冲区的总容量,很好理解

接下来这个函数为缓冲区有多少数据可以读,有三种情况:

1、Head和Tail都指向同一个地址,可读大小为0,返回0,这种情况只会出现在缓冲区还没有数据的时候,使用之后就不会出现头尾重合的现象;

2、Head

3、Head>Tail,如下图所示,缓冲区已经写满,并且从开头处重新写了数据,可读部分为蓝灰色区域(rb_capacity(rb) - (rb->rb_head - rb->rb_tail));

接下来的函数为可写区域大小,直接用总容量rb_capacity(rb)减去可读区域大小就好了。

然后是读数据函数,从Head处开始读,读取count个数据,放到data地址开始的数据区域,如下图所示,也是分为三种情况

1、Head

2、Head>Tail,且count中的数据小于从Head到缓冲区尾部的个数,即小于下图中的蓝灰色,与第一种情况一样,直接复制相应内存,之后修改Head指针即可。

3、Head>Tail,且count中的数据大于从Head到缓冲区尾部的个数,即大于下图中的看灰色,这种情况我们就先把Head到缓冲区尾部的数据复制到data处,再把绿色区域的复制过去,这里绿色部分并不会超过Tail,写操作中做了限制。

最后是写数据函数,把从data指向的地址,写到Tail指向的地址,写count个数据,返回成功写入的个数,在这里判断了要写入的数据大小要小于可写区域大小,防止数据覆盖,如下图所示,也是分为三种情况

1、Head

2、Head

3、Head>Tail,这个因为已经做了数据合法判断,所以直接复制数据就行。如下图所示

那么明白了串口环形buff的机制,数据是从哪里进入的呢,我们找到串口中断的入口,

可以看到中断程序非常简单,中断之后直接往缓冲区丢一个数据就行了,采用这种数据结构,大大提高了程序的稳定性,同时操作起数据来也很方便,需要的时候直接去读缓冲区数据就好了。今天就先分享这么多,下期分享机智云的协议与结构体的定义,谢谢大家!

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 串口
    +关注

    关注

    14

    文章

    1483

    浏览量

    74508
  • 源代码
    +关注

    关注

    94

    文章

    2927

    浏览量

    66063
  • 机智云
    +关注

    关注

    2

    文章

    542

    浏览量

    26216

原文标题:Gokit3.0 STM32源代码分析之二

文章出处:【微信号:IoTMaker,微信公众号:机智云开发者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    机智GoKit开发板试用进程大汇总(2015.08.07已更新)

    (6.5)https://bbs.elecfans.com/jishu_486535_1_1.html3、【GoKit试用体验】+ GoKit串口
    发表于 06-05 10:40

    GoKit试用体验】+机智GoKit开发套件学习分享1开箱图

    本帖最后由 孤雨冰狐 于 2015-6-9 10:34 编辑 机智GoKit开发套件学习分享1开箱图今天我申请的机智
    发表于 06-08 17:13

    GoKit试用体验】+机智GoKit开发套件学习分享2开发板初认识

    GoKit试用体验】+机智GoKit开发套件学习分享2开发板初认识 好长时间没有更新,被催了,实在很抱歉,不是因为不想发帖,只是我本人
    发表于 07-25 11:49

    【万元大奖】机智智能硬件创新大赛

    帖图文并茂,有清晰的制作过程;项目必须链接上机智自助开发平台。2)开贴名称格式:基于Gokit 的作品:【Gokit 3
    发表于 07-06 13:42

    【试用活动】Gokit 2.XGokit 3.X 免费申请试用

    活动主题:Gokit 2.XGokit 3.X 免费申请试用(此活动长期有效)Gokit2 集成了马达、1600万色的LED、Wifi模块
    发表于 08-02 14:24

    机智想说爱你不容易 - 如何开发接入机智的物联网设备

    的功能和特性比如ECE边缘计算引擎,RTBD实时大数据平台,D3动态数据编排引擎等印象发生了很大的改观。对机智产生了浓厚的兴趣,想着做一个
    发表于 09-27 13:26

    Gokit 3试用体验】(8)微信控制Gokit体验机智宠物屋

    机智匿名注册一个机智用户,获得用户 uid 和 token9. 业务根据用户的 token 以及设备的 did 和 passcod
    发表于 10-02 12:19

    Gokit 3试用体验】(7)控制继电器

    的任务,应用里再加个应答重发机制,问题就是这样解决了。代码传上来,有相同兴趣的可以讨论一下。串口源码:机智的源码在这里,跟之前的差不多。
    发表于 10-12 23:29

    MCU代码自动生成功能,Gokit二次开发视频教学

    云端生成通用平台代码的方法,以及如何将代码一步步移植到其他平台。针对已有跨平台开发经验的小伙伴,并想在其他硬件平台上实现机智服务(至少
    发表于 10-31 18:30

    如何使用机智开发一款智能硬件产品

    Gokit3】序列2:Gokit3介绍第3篇:【原创】【魅力Gokit3】序列
    发表于 12-26 15:56

    机智在Amazon Alexa平台发布Smarthome和Custom Skill,实现亚马逊Echo直接控制Gokit

    )是一个由自服务API、工具、文件和实例代码的集合,可轻松构建你自定义的Alexa skills,然后发布。机智开源套件 Gokit 是一块标准的量产级嵌入式开发板,即代表了通用型智
    发表于 03-31 11:54

    机智2016~2017优秀项目盘点

    】之无线工业粉尘监测仪【Gokit 3仓鼠管家和OpenHamtaro开源项目【Gokit智慧宿舍【
    发表于 09-22 13:03

    机友分享 | 基于Gokit+机智的低成本MCU红外遥控器

    Gokit,通过机智的物联网平台,能够满足我的需求,那么怎么来做呢?根据经验所得,需要对这个工作拆分为几部分:机智平台
    发表于 07-07 12:19

    4G模组接入机智gokit3开发板

    )帖子的(3.代码修改),继电器部分无需参考即可。3.产品调试将编译好的代码烧录到gokit,烧录完成之后将4G卡插入ML301-GC211
    发表于 10-31 19:55

    机智Gokit3.X源代码分析之一

    将每个按键的物理GPIO以及长短按回调函数都赋值到相应数组,这里一共初始化了2个按键,之后将数组地址传到keys这个结构体变量,初始化之后就可以通过keys来调用按键的所有功能了。按键的具体控制原理后面会将。接下来是机智云协议的初始化,之后打印一串初始化成功的数据
    的头像 发表于 07-13 14:47 2989次阅读