由浅入深_蓝牙4.0BLE协议栈开发攻略大全(4)

合集下载

BLE4.0教程四新增特征值(CC2541)

BLE4.0教程四新增特征值(CC2541)

BLE4.0教程四新增特征值(CC2541) 注:(本⽂基于我⾃⼰定义的⼀个服务TEMProfile,但适⽤其他服务)1.特征值是什么 ⼀个蓝⽛协议栈中,包含了多个服务,⼀个服务⾥⼜包含了多个特征值,每个特征值都有其相关的⼀些信息。

我们与蓝⽛进⾏通信的时候,就是通过读写这些特征值,来获得数据。

2.特征值的属性 ⼀个特征值⾥⾯基本需要的变量是—— 1.UUID码 2.权限属性:基本就是可读、可写、可通知这些了。

(通知是表⽰允许数据主动发送) 3.内容 4.描述:这个特征值的名称3.属性表 ⼀个服务⾥,所有的特征值中的每个变量都有相应的属性,所有的属性都放在⼀个数组中,这个数组称之为属性表。

⼀个变量的属性表包含四个内容,1.type2.permission3.handle4.pValue 属性表其实就是定义了⼀个 gattAttribute_t类型的数组。

需要注意的是,属性表中,除了特征值的属性,第⼀个还要添加服务的属性1//TEMProfile Service2 {3 {ATT_BT_UUID_SIZE,primaryServiceUUID}, //type4 GATT_PERMIT_READ, //permissions50, //handle6 (uint8*)&TEMProfileService //pValue7 },4.增添⼀个新的特征值 (1)Define出配置属性的数值,⽤以填写配置属性。

1// Profile Parameters2#define TEMPROFILE_CHAR1 03#define TEMPROFILE_CHAR2 145// Simple Profile Service UUID6#define TEMPROFILE_SERV_UUID 0xFF0078// Key Pressed UUID9#define TEMPROFILE_CHAR1_UUID 0xFF0110#define TEMPROFILE_CHAR2_UUID 0xFF021112// Simple Keys Profile Services bit fields13#define TEMPROFILE_SERVICE 0x000000011415// Length of Characteristic 2 in bytes16#define TEMPROFILE_CHAR2_LEN 12 其中UUID号有特定的范围,应避免与其他服务UUID冲突。

BLE4.0教程一蓝牙协议连接过程与广播分析

BLE4.0教程一蓝牙协议连接过程与广播分析

BLE4.0教程⼀蓝⽛协议连接过程与⼴播分析1.蓝⽛简介什么是蓝⽛4.0蓝⽛⽆线技术是使⽤范围最⼴泛的全球短距离⽆线标准之⼀,蓝⽛4.0版本涵盖了三种蓝⽛技术,即传统蓝⽛、⾼速蓝⽛和低功耗蓝⽛技术,将三种规范合⽽为⼀。

它继承了蓝⽛技术在⽆线连接上的固有优势,同时增加了⾼速蓝⽛和低功耗蓝⽛的特点。

这三个规格可以组合或者单独使⽤。

蓝⽛4.0规范的核⼼是低功耗蓝⽛(Low Energy),即蓝⽛4.0BLE。

该技术最⼤特点是拥有超低的运⾏功耗和待机功耗,蓝⽛低功耗设备使⽤⼀粒纽扣电池可以连续⼯作数年之久。

蓝⽛4.0技术同时还拥有低成本、向下兼容、跨⼚商互操作性强等特点。

蓝⽛4.0 BLE的特点蓝⽛4.0 BLE技术具有如下特点:1.⾼可靠性对于⽆线通信⽽⾔,由于电磁波在传输过程中容易受很多因素的⼲扰,例如,障碍物的阻挡、天⽓状况等。

因此,⽆线通信系统在数据传输过程中,具有内在的不可靠性。

蓝⽛技术联盟(SIG)在制定蓝⽛4.0规范时已经考虑到了这种数据传输过程中的内在的不确定性,所以在射频、基带协议、链路管理协议(LMP)中采⽤可靠性措施,包括:差错检测和校正、进⾏数据编解码、差错控制、数据加噪等,极⼤地提⾼了蓝⽛⽆线数据传输的可靠性。

另外,使⽤⾃适应跳频技术,最⼤程度地减少和其他2.4GHz ISM频段⽆线电波的串扰。

2.低成本、低功耗低功耗蓝⽛⽀持两种部署⽅式:双模⽅式和单模⽅式。

(1)双模⽅式,低功耗蓝⽛功能集成在现有的经典蓝⽛控制器中,或在现有经典蓝⽛技术(2.1+EDR/3.0+HS)芯⽚上增加低功耗堆栈,整体架构基本不变,因此成本增加有限。

(2)单模⽅式,⾯向⾼度集成、紧凑的设备,使⽤⼀个轻量级连接层(Link Layer)提供超低功耗的待机模式操作。

蓝⽛4.0BLE技术可以应⽤于8bit MCU,⽬前TI公司推出的兼容蓝⽛4.0BLE协议的SoC芯⽚CC2540/CC2541,外接PCB天线和⼏个阻容器件构成的滤波电路即可实现蓝⽛⽹络节点的构建。

BLE协议栈UART调试指南

BLE协议栈UART调试指南

BLE协议栈UART调试指南近年来,蓝牙低功耗(BLE)技术得到了广泛应用和推广,成为物联网设备间无线通信的重要方式之一、在BLE通信过程中,调试是非常重要的一环。

本文将介绍BLE协议栈UART调试指南,帮助开发人员更好地进行BLE调试工作。

一、BLE协议栈概述BLE协议栈是指蓝牙低功耗通信协议的各个层级的软件堆栈。

在BLE 通信中,BLE协议栈分为控制器和主机两部分。

控制器负责底层的物理层和链路层处理,而主机负责高层的GAP(通用接入配置文件)和GATT(通用属性配置文件)协议。

二、BLE协议栈UART调试UART(通用异步收发传输)是一种常用的串行通信接口,可以实现设备之间的数据传输。

在BLE开发中,UART常常被用于与目标设备进行通信,进行调试工作。

1.硬件准备首先,需要准备一台电脑和一个BLE开发板。

开发板上应该有一个UART接口,用于与电脑连接。

在连接之前,确保电脑已经安装了相关的串口驱动程序。

2.配置串口通过设备管理器找到开发板连接的串口,然后配置正确的串口参数,包括波特率、数据位、停止位和校验位等。

这些参数需要与开发板上的串口设置一致。

3.使用串口工具使用串口调试工具,如TeraTerm、Putty等,连接到BLE开发板。

在工具中配置正确的串口参数,并打开串口连接。

4.选择调试输出在BLE开发过程中,可以选择输出不同的调试信息。

根据具体的需要,可以选择输出GAP、GATT、L2CAP(逻辑链路控制和适配层协议)或HCI(主机控制接口)层的调试信息。

通过配置参数,可以将这些调试信息打印到UART接口。

5.调试输出分析一旦开启了BLE协议栈的调试输出,就可以在UART调试工具中观察到相应的调试信息。

这些信息通常包括与设备的连接状态、数据包的传输过程、GAP和GATT命令的处理等。

通过分析这些信息,可以快速定位、排查问题。

6.数据分析与解析BLE通信过程中的数据包是经过特定格式编码和解码的。

深入浅出低功耗蓝牙(BLE)协议栈

深入浅出低功耗蓝牙(BLE)协议栈

深入浅出低功耗蓝牙(BLE)协议栈低功耗蓝牙(BLE)协议栈是一种用于低能耗设备间通信的无线通信技术。

它主要用于物联网设备、传感器和其他低功耗设备之间的通信。

本文将深入浅出地介绍BLE协议栈的工作原理和主要组件,以及其在物联网和其他领域的应用。

BLE协议栈由多个层级组成,包括物理层(PHY)、链路层(LL)、主机控制器接口(HCI)、主机层(Host)和应用层(Application)。

每个层级负责不同的功能,并通过各自的接口与上下层通信。

物理层是BLE协议栈的最底层,负责将数据转化为无线信号进行传输。

BLE使用2.4GHz频段进行通信,采用频率跳变技术来抵抗干扰和提高传输稳定性。

链路层建立在物理层之上,负责处理与设备之间的连接和数据传输。

它包括广播(Advertisement)和连接(Connection)两种传输模式。

广播模式用于设备之间的发现和配对,而连接模式用于实际的数据传输。

主机控制器接口(HCI)是链路层与主机层之间的接口,负责传输控制命令和事件信息。

主机层负责处理设备的连接管理、数据传输和高层协议等任务。

应用层则是最上层,负责处理具体的业务逻辑和应用程序。

BLE协议栈的工作流程一般分为广播、扫描、连接和数据传输四个阶段。

在广播阶段,设备会周期性地发送广播包,以便其他设备发现和连接。

扫描阶段是其他设备主动并发现正在广播的设备。

连接阶段是建立起连接后的设备之间进行数据传输。

数据传输阶段则是实际进行数据交换的阶段。

BLE协议栈的优势在于其低功耗、简单易用和成本低廉。

它适用于大量的物联网设备,如健康追踪器、智能家居设备等。

同时,BLE协议栈也在其他领域有着广泛的应用,例如无线鼠标、键盘、耳机等。

总之,低功耗蓝牙(BLE)协议栈是一种用于低能耗设备间通信的无线通信技术,具有低功耗、简单易用和成本低廉等优势。

它在物联网和其他领域有着广泛的应用,为设备间的通信提供了可靠和高效的解决方案。

蓝牙4.0BLE学习之协议栈

蓝牙4.0BLE学习之协议栈

在线学习好工作/蓝牙4.0BLE学习之协议栈蓝牙4.0BLE协议栈介绍问题:什么是BLE协议栈?BLE协议栈与BLE协议的关系?顾名思义,人类之间需要一种语言才能沟通,机器之间,电子之间也有一个标准,也就是作为通讯标准,也就是通讯协议。

协议:定义了一系列通讯标准,通讯双方都按照这一标准,进行数据通讯。

协议栈:协议的具体实现形式,实现的函数库,固件库。

把个个协议集合到了一起,以函数库的形式实现,并用这些给用户提供一些应用层的API接口,用户可以进行一些调度。

问题:如何使用BLE协议栈进行开发?三个步骤:1.不需要具体了解BLE协议栈的具体复杂的过程,只需要知道它的数据从哪里来,需要到哪里去就行了。

2.根据BLE协议栈调用它里面的函数,实现自己的一些功能。

3.可以自己编写一些函数,实现自己需要特定的功能。

协议结构图第一层:physicallayer(物理层)信道带宽提供2M,提供三个广播信道1M。

第二层:link layer(链路层)执行一些基带协议,底层的数据包管理协议。

第三层:host controller interface (主机控制接口层)提供主机与控制层的通讯方式,以及命令格式,重用蓝牙标准,比如一些串口,USB等等。

第四层:L2CAP(逻辑链路于适配器协议层)为它上层提供数据业务,提供端到端的逻辑数据通信。

第五层:security manager(SM)安全管理层层与层之间会有通信,它是建立数据交换安全方面的数据知识。

第六层:attribute protocol(ATT)通用接入层定义了一些通用接口,供应用层和底层之间的调用,比如你要调底层的硬件模块的东西,就需要这个层的底层的驱动模块去实现它的一些功能,所以它会同时封装一些API的函数设置。

第七层:generic attribute profile(GATT)(属性协议层)允许设备以属性的形式向外设备暴露它的一些数据,就像广播者与观察者之间,它一直在广播自己的属性,数据出去。

低功耗蓝牙4.0(BLE)主从通信模块及主透传协议

低功耗蓝牙4.0(BLE)主从通信模块及主透传协议

实际转发速率 V0 (byte/s) V0 = L*1000/TS
备注
80 200 200 80 70
TS >= T 即可,若取 TS=20ms TS >= T*3 即可, 若取 TS=70ms TS >= T*3 即可, 若取 TS=80ms TS >= T 即可,若取 TS=35ms TS >= T 即可,若取 TS=30ms
目录
目录................................................................................................................................................ 3 � 概述......................................................................................................................................... 4 � 工作模式示意图........................................................................................................................ 5 � 封装尺寸脚位定义.................................................................................................................... 6 � CC2540TA1 版..................................................................................................................... 6 � BM-S01 版(BQB 认证)...................................................................................................... 6 � 串口透传协议说明(透传模式)............................................................................................... 8 � 串口 AT 指令:....................................................................................................................... 10 � 全局扫描.......................................................................................................................... 11 � 全局发起......................................................................................................................... 12 � 设置待机模式.................................................................................................................. 13 � 软件复位......................................................................................................................... 13 � 操作流程................................................................................................................................ 14 � 联系我们................................................................................................................................ 15

深入浅出低功耗蓝牙(BLE)协议栈

深入浅出低功耗蓝牙(BLE)协议栈

深⼊浅出低功耗蓝⽛(BLE)协议栈BLE协议栈为什么要分层?怎么理解BLE“连接”?如果BLE协议只有ATT层没有GATT层会发⽣什么?协议栈框架⼀般⽽⾔,我们把某个协议的实现代码称为协议栈(protocol stack),BLE协议栈就是实现低功耗蓝⽛协议的代码,理解和掌握BLE协议是实现BLE协议栈的前提。

在深⼊BLE协议栈各个组成部分之前,我们先看⼀下BLE协议栈整体架构。

如上图所述,要实现⼀个BLE应⽤,⾸先需要⼀个⽀持BLE射频的芯⽚,然后还需要提供⼀个与此芯⽚配套的BLE协议栈,最后在协议栈上开发⾃⼰的应⽤。

可以看出BLE协议栈是连接芯⽚和应⽤的桥梁,是实现整个BLE应⽤的关键。

那BLE协议栈具体包含哪些功能呢?简单来说,BLE协议栈主要⽤来对你的应⽤数据进⾏层层封包,以⽣成⼀个满⾜BLE协议的空中数据包,也就是说,把应⽤数据包裹在⼀系列的帧头(header)和帧尾(tail)中。

具体来说,BLE协议栈主要由如下⼏部分组成:PHY层(Physical layer物理层)。

PHY层⽤来指定BLE所⽤的⽆线频段,调制解调⽅式和⽅法等。

PHY层做得好不好,直接决定整个BLE芯⽚的功耗,灵敏度以及selectivity等射频指标。

LL层(Link Layer链路层)。

LL层是整个BLE协议栈的核⼼,也是BLE协议栈的难点和重点。

像Nordic的BLE协议栈能同时⽀持20个link(连接),就是LL层的功劳。

LL层要做的事情⾮常多,⽐如具体选择哪个射频通道进⾏通信,怎么识别空中数据包,具体在哪个时间点把数据包发送出去,怎么保证数据的完整性,ACK如何接收,如何进⾏重传,以及如何对链路进⾏管理和控制等等。

LL层只负责把数据发出去或者收回来,对数据进⾏怎样的解析则交给上⾯的GAP或者GATT。

HCI(Host controller interface)。

HCI是可选的(),HCI主要⽤于2颗芯⽚实现BLE协议栈的场合,⽤来规范两者之间的通信协议和通信命令等。

蓝牙技术协议栈

蓝牙技术协议栈

蓝牙技术协议栈蓝牙技术是一种短距离无线通信技术,它允许电子设备之间进行数据交换。

这种技术的核心是其协议栈,它是一套定义了设备如何相互通信的规则和程序。

本文将介绍蓝牙技术协议栈的基本结构和主要组成部分。

蓝牙协议栈概述蓝牙协议栈是一个分层的结构,每一层都有特定的功能和责任。

从底层的物理传输到高层的应用层,每一层都为上一层提供服务,同时依赖于下一层的支持。

整个协议栈可以分为以下几个主要部分:1. 物理层:负责无线电信号的发送和接收。

2. 链路层:控制设备的物理连接,包括频率跳变和信道管理。

3. 适配层:提供不同设备之间的适配功能,确保数据的正确传输。

4. 协议层:包括逻辑链路控制和适配协议(L2CAP)、服务发现协议(SDP)、串行端口协议(SPP)等,它们为上层应用提供必要的服务。

5. 应用层:包括各种基于蓝牙的应用协议,如音频/视频传输、文件传输等。

主要协议介绍物理层物理层是蓝牙协议栈的基础,它定义了蓝牙设备之间的无线电通信方式。

这一层负责频率选择、功率控制和信号调制解调等功能。

蓝牙技术支持多种频段操作,但最常见的是在2.4 GHz ISM频段内工作。

链路层链路层也称为基带层,它管理蓝牙设备之间的物理连接。

这一层负责处理设备的地址分配、信道选择、连接建立和释放等任务。

链路层还实现了一种称为“微微网”的概念,即一个主设备与多个从设备形成的网络。

适配层适配层的主要作用是为不同类型的蓝牙设备提供互操作性。

这一层通过适配协议来转换不同设备之间的数据格式,确保信息能够正确传输。

例如,L2CAP协议就是适配层中的一个重要协议,它提供了更高级别的服务,如分段和重组、服务质量(QoS)信息传递等。

协议层协议层包含了多个重要的协议,它们为应用层提供了必要的支持。

例如,SDP协议使得设备能够发现并利用其他设备提供的服务;而SPP协议则提供了一个模拟传统串行端口的方法,使得蓝牙设备能够像使用有线连接一样进行数据传输。

应用层应用层是蓝牙协议栈的最高层,它直接面向最终用户。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

本系列教程将结合TI推出的CC254x SoC 系列,讲解从环境的搭建到蓝牙4.0协议栈的开发来深入学习蓝牙4.0的开发过程。

教程共分为六部分,本文为第四部分:第四部分知识点:第十六节协议栈LED实验第十七节协议栈LCD显示第十八节协议栈UART实验第十九节协议栈五向按键第二十节协议栈Flash数据存储有关TI 的CC254x芯片介绍,可点击下面链接查看:主流蓝牙BLE控制芯片详解(1):TI CC2540同系列资料推荐:由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(1)由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(2)由浅入深,蓝牙4.0/BLE协议栈开发攻略大全(3)有关本文的工具下载,大家可以到以下这个地址:朱兆祺ForARM第十六节协议栈LED实验TI的协议栈中在HAL层已经有了LED的驱动,我们只需要针对我们的开发板进行配置即可,我们的开发板有两个LED,分别对应P1.0和P1.1。

这个在裸机开发的时候已经介绍了。

为了保持协议栈原有的代码不变,我们在BLE-CC254x-1.4.0\Components\hal\target 目录下新建一个文件夹,使它适应我们的开发板。

打开LED实验工程LEDExample,选择MT254xboard,并且在工程配置中要定义HAL_LED=TRUE,下载到开发板运行,可以看到两个LED同时在闪烁。

那我们的实现代码在哪里呢?其实在协议栈中实现这个很简单,在启动事件中我们调用了一个HalLedSet函数,并且设置了两个LED同时闪烁。

就是这么简单,协议栈已经把其它事情做好了,只需要我们调用设置函数即可。

设置的模式总共有5种。

#define HAL_LED_MODE_OFF 0x00 // 关闭LED#define HAL_LED_MODE_ON 0x01 // 打开LED#define HAL_LED_MODE_BLINK 0x02 // 闪烁一次#define HAL_LED_MODE_FLASH 0x04 // 不断的闪烁,最多255次#define HAL_LED_MODE_TOGGLE 0x08 // 翻转LED状态为了适应不同的需求,我们可能需要更改LED的输出引脚,如图板级配置在hal_board_cfg.h文件中。

这里我们的开发板只有两个LED,所以我们在这里根据开发板的实际情况修改相应的IO 口。

第十七节协议栈LCD显示实验打开LCD12864的实验工程,一样的在工程配置中打开LCD,选择MT254xboard然后直接编译下载,我们可以看到LCD上已经有显示了。

这些显示来自哪里呢?在初始化函数中可以看到图中的函数调用,这里是将字符串显示到LCD的第一行。

在事件回调函数中可以看到这里将本机地址显示到第二行,将字符串Initialized显示到第三行,但是为什么我们在第三行没有看到这行字符串呢?而显示的字符串是Advertising ,这是因为系统启动后运行非常快,在我们还没反应过来的时候已经进入了广播状态,并且将原来的字符串覆盖了,所以我们最后只能看到Advertising 了。

HalLcdWriteString是将第一个参数指向的字符串显示到第二个参数指定第几行中,例如我们需要在第5行显示系统启动信息,我们可以在启动事件中,添加如下代码。

这里我们来介绍一下Lcd驱动的实现,在Hal_lcd.h文件中申明了以下函数,这些函数的功能都有英文注释,这里我就不再累述了。

/** Initialize LCD Service*/extern void HalLcdInit(void);/** Write a string to the LCDextern void HalLcdWriteString ( char *str, uint8 option);/** Write a value to the LCD*/extern void HalLcdWriteValue ( uint32 value, const uint8 radix, uint8 option);/** Write a value to the LCD*/extern void HalLcdWriteScreen( char *line1, char *line2 );/** Write a string followed by a value to the LCD*/extern void HalLcdWriteStringValue( char *title, uint16 value, uint8 format,uint8 line );/** Write a string followed by 2 values to the LCD*/extern void HalLcdWriteStringValueValue( char *title, uint16 value1, uint8 format1, uint16 value2, uint8 format2, uint8 line );/** Write a percentage bar to the LCDextern void HalLcdDisplayPercentBar( char *title, uint8 value );协议栈中很多地方都调用了这些函数,我们如果要使我们的硬件能够兼容协议栈,被协议栈使用,就需要实现这些函数的定义,当然,为了适应我们的开发板,我已经实现了这些函数,实现都在hal_lcd.c中。

第十八节协议栈UART实验协议栈中已经用了串口的驱动,我们要做的只是对串口进行初始化,然后就可以进行串口数据的收发了。

用使用串口,第一步,需要打开使能串口功能,通过配置工程来实现,这里注意,我们现在不使用USB的CDC类来实现串口,所以HAL_UART_USB=FALSE。

HAL_UART=TRUEHAL_UART_USB=FALSE要使用串口必须先初始化相应的串口,那该如何初始化呢?在Hal_uart.h文件中我们可以看到如下函数。

uint8 HalUARTOpen(uint8 port, halUARTCfg_t *config);这个函数就是用来初始化串口的,这个函数有两个参数,第一个指定串口号,第二个是串口的配置参数。

我们来看看这个结构体的定义:typedef struct{bool configured; // 配置与否uint8 baudRate; // 波特率bool flowControl; // 流控制uint16 flowControlThreshold;uint8 idleTimeout; // 空闲时间halUARTBufControl_t rx; // 接收halUARTBufControl_t tx; // 发送bool intEnable; // 中断使能uint32 rxChRvdTime; // 接收数据时间halUARTCBack_t callBackFunc; // 回调函数}halUARTCfg_t;这个结构体成员很多,但是我们在使用串口的时候并不需要使用所有的成员。

void Serial_Init(void){halUARTCfg_t SerialCfg = {0};SerialCfg.baudRate = HAL_UART_BR_115200; // 波特率SerialCfg.flowControl = HAL_UART_FLOW_OFF; // 流控制SerialCfg.callBackFunc = SerialCb; // 回调函数SerialCfg.intEnable = TRUE;SerialCfg.configured = TRUE;HalLcdWriteString(“Open Uart0”, HAL_LCD_LINE_5 ); // 在第5行显示启动信息HalUARTOpen(HAL_UART_PORT_0, &SerialCfg);HalUARTWrite(HAL_UART_PORT_0,“Hello MT254xBoard\r\n”, osal_strlen(“Hello MT254xBoard\r\n”));}在串口回调函数中我们只做一件事,将串口接收到的数据显示到LCD中并且原样的从串口输出。

回调函数的实现如下:static void SerialCb( uint8 port, uint8 events ){uint8 RxBuf[64]={0};if((events & HAL_UART_TX_EMPTY)||( events & HAL_UART_TX_FULL )) // 发送区满或者空{return;}uint16 usRxBufLen = Hal_UART_RxBufLen(HAL_UART_PORT_0); // 读取接收据量usRxBufLen = MIN(64,usRxBufLen);uint16 readLen = HalUARTRead(HAL_UART_PORT_0, RxBuf, usRxBufLen);HalUARTWrite(HAL_UART_PORT_0, RxBuf, usRxBufLen);}实验现象,从实验现象中可以看到,一开始在串口中输出了一个标志字符串,然后我们通过串口发送了0123456789,然后数据原样的从串口输出了,这和我们预期的结果是一样的。

但是我们发现LCD上的显示和我们预期的不一样,LCD上只显示了6789,前面的数据并没有显示,这是怎么一回事呢?进行单步调试可以发现,我们发送一次数据,回调函数被回调了两次,第一次回调只接受到了012345,第二次回调接收到了6789,而在LCD上的显示第二次覆盖了第一次的显示,所以我们会看到这种现象,解决的办法,我们需要定义一个数据帧的时间间隔,当接收数据的间隔超过了此间隔就认为接收结束。

下面我们改写接收处理,我们在接收到数据后开启定时器,定时5ms这样,当接收间隔大于5ms后,我们就可以在定时事件中处理串口接收到的数据。

static void SerialCb( uint8 port, uint8 events ){if((events & HAL_UART_TX_EMPTY)||( events & HAL_UART_TX_FULL )) // 发送区满或者空{return;}uint16 usRxBufLen = Hal_UART_RxBufLen(HAL_UART_PORT_0); // 读取接收据量if(usRxBufLen){usRxBufLen = MIN(128,usRxBufLen);uint16 readLen = HalUARTRead(HAL_UART_PORT_0, &SerialRxBuf[RxIndex],usRxBufLen); // 读取数据到缓冲区RxIndex += readLen;readLen %= 128;osal_start_timerEx(simpleBLEPeripheral_TaskID, UART_EVENT, 5); // 启动定时器}}事件处理代码:if ( events & UART_EVENT ){HalLcdWriteString((char*)SerialRxBuf, HAL_LCD_LINE_6 ); // 在第5行显示启动信息HalUARTWrite(HAL_UART_PORT_0, SerialRxBuf, osal_strlen(SerialRxBuf));osal_memset(SerialRxBuf, 0, 128);return (events ^ UART_EVENT);}经过这样的处理后,可以发现我们刚刚的问题已经解决了。

相关文档
最新文档