BLE协议栈UART调试指南
android蓝牙介绍二蓝牙代码架构及其uart 到rfcomm流程

Android bluetooth介绍(二)android 蓝牙代码架构及其uart 到rfcomm 流程一、Android Bluetooth Architecture蓝牙代码架构部分(google 官方蓝牙框架)Android的蓝牙系统,自下而上包括以下一些内容如上图所示:1、串口驱动Linux的内核的蓝牙驱动程、Linux的内核的蓝牙协议的层2、BlueZ的适配器BlueZ的(蓝牙在用户空间的函式库)bluez代码结构Bluetooth协议栈BlueZ分为两部分:内核代码和用户态程序及工具集。
(1)、内核代码:由BlueZ核心协议和驱动程序组成Bluetooth协议实现在内核源代码 kernel/net/bluetooth中。
包括hci,l2cap,hid,rfcomm,sco,SDP,BNEP等协议的实现。
(2)、驱动程序:kernel/driver/bluetooth中,包含Linuxkernel对各种接口的Bluetooth device的驱动,如:USB接口,串口等。
(3)、用户态程序及工具集:包括应用程序接口和BlueZ工具集。
BlueZ提供函数库以及应用程序接口,便于程序员开发bluetooth应用程序。
BlueZ utils是主要工具集,实现对bluetooth设备的初始化和控制。
3、蓝牙相关的应用程序接口Android.buletooth包中的各个Class(蓝牙在框架层的内容-----java)同样下图也是一张比较经典的蓝牙代码架构图(google官方提供)二、蓝牙通过Hciattach启动串口流程:1、hciattach总体流程2、展讯hciattach代码实现流程:三、具体代码分析1、initrc中定义idh.code\device\sprd\sp8830ec_nwcn\init.sc8830.rc1.service hciattach /system/bin/hciattach -n /dev/sttybt0 sprd_shark2.socket bluetooth stream 660 bluetooth bluetoother bluetooth4.group wifi bluetooth net_bt_admin net_bt inet net_raw net_admin system5.disabled6.oneshotadb 下/dev/ttybt0(不同平台有所不同)PS 进程中:hicattch2、/system/bin/hciattach 执行的Main函数idh.code\external\bluetooth\bluez\tools\hciattach.cservice hciattach /system/bin/hciattach -n /dev/sttybt0sprd_shark 传进两个参数,/dev/sttybt0 和 sprd_shark1.i nt main(int argc, char *argv[])2.{3.………………4.for (n = 0; optind < argc; n++, optind++) {5.char *opt;6.7.opt = argv[optind];8.9.switch(n) {10. case 0://(1)、解析驱动的位置;11. dev[0] = 0;12. if (!strchr(opt, '/'))13. strcpy(dev, "/dev/");14. strcat(dev, opt);15. break;16.17. case 1://(2)、解析串口的配置相关参数;18. if (strchr(argv[optind], ',')) {19. int m_id, p_id;20. sscanf(argv[optind], "%x,%x",&m_id, &p_id);21. u = get_by_id(m_id, p_id);22. } else {23. u = get_by_type(opt);24. }25.26. if (!u) {27. fprintf(stderr, "Unknown device type or id\n");28. exit(1);29. }30.31. break;32.33. case 2://(3)、通过对前面参数的解析,把uart[i]中的数值初始化;34. u->speed = atoi(argv[optind]);35. break;36.37. case 3:38. if (!strcmp("flow", argv[optind]))39. u->flags |= FLOW_CTL;40. else41. u->flags &= ~FLOW_CTL;42. break;43.44. case 4:45. if (!strcmp("sleep", argv[optind]))46. u->pm = ENABLE_PM;47. else48. u->pm = DISABLE_PM;49. break;50.51. case 5:52. u->bdaddr = argv[optind];53. break;54. }55. }56.57.………………58. if (init_speed)//初始化串口速率;59. u->init_speed = init_speed;60.………………61. n = init_uart(dev, u, send_break, raw);//(4)、初始化串口;62.………………63.64. return 0;65.}(1)、解析驱动的位置;1.if (!strchr(opt, '/'))2.strcpy(dev, "/dev/");3.service hciattach /system/bin/hciattach -n /dev/sttybt0 sprd_shark4.dev = /dev/ttyb0(2)、解析串口的配置相关参数;获取参数对应的结构体;1.u = get_by_id(m_id, p_id);2.static struct uart_t * get_by_id(int m_id, int p_id)3.{4.int i;5.for (i = 0; uart[i].type; i++) {6.if (uart[i].m_id == m_id && uart[i].p_id== p_id)7.return &uart[i];8.}9.return NULL;10.}这个函数比较简单,通过循环对比,如传进了的参数sprd_shark和uart结构体中的对比,找到对应的数组。
RC6621D 低功耗蓝牙(BLE)透传协议数据手册说明书

RC6621DQ低功耗蓝牙透传模块数据手册文档信息型号RC6621D备注名称低功耗蓝牙透传模块文档类型数据手册文档编号RCBM-H02版本日期V2.0.02020-10-18版本更新版本号文档日期更新内容V2.0.02020/10/18 第一次发布;注:本文档讲不定期更新,在使用此文档前,请确保为最新版本。
文档中的信息仅供深圳市智汉科技有限公司RF Crazy®的授权用户或许可人使用。
没有深圳市智汉科技有限公司RF Crazy®的书面授权,请勿将本文档或其他部分内容印制或者作为电子文档副本传播。
目录1.产品概述 (1)主要特点 (1)模式默认配置 (2)设备状态 (2)2.工作模式示意图 (3)3.模块尺寸及引脚 (3)4.串口透传协议说明 (5)5.BLE协议说明(APP接口) (5)Service UUID (5)BLE数据接收UUID (5)BLE数据发送UUID (6)AT指令操作UUID (6)6.AT指令 (6)AT命令表 (7)进入AT指令模式 (7)退出AT指令模式 (8)设备名称 (8)MAC地址 (8)串口回显 (9)显示设备状态 (9)广播参数 (10)连接间隔 (10)Service (11)断开连接 (12)自定义广播内容 (12)发射功率 (13)休眠模式 (14)串口波特率 (14)用户鉴权 (15)设备重启 (16)恢复出厂设置 (16)固件版本查询 (16)7.用APP测试透传功能 (16)8.IOS APP编程参考 (19)9.主机(MCU)参考代码(透传) (20)10.使用条件及注意事项 (21)联系我们................................................................................................错误!未定义书签。
附录A:BLE模块应用方案提示. (24)附录B:模块射频参数测试报告 (25)附录C:功耗测试截图 (37)1.产品概述智汉科技RF Crazy®RC6621DQ是基于OnMicro的HS6621D SoC设计开发的高性能、高灵敏、低成本的蓝牙5.2(BLE)模块。
Noridc nRF51822 BLE to UART

Gandy Huang
1 Gandy.huang@
Open
• C:\Keil\ARM\Device\Nordic\nrf51822\ Board\pca10001\s110\experimental\bl e_app_uart
2
可以修改蓝牙参数
8
蓝牙的接收数据传输
void nus_data_handler(ble_nus_t * p_nus, uint8_t * p_data, uint16_t length) { //接收入口
// // // // // }
uint32_t err_code = ble_nus_send_string(&m_nus, p_data, length); //发送函数 if (err_code != NRF_SUCCESS) { //如果不成功,需要安排重新发送 } for (int i = 0; i < length; i++) //默认是串口打印出来,这里更改为直接BLE数据返回 { simple_uart_put(p_data[i]); } simple_uart_put('\n');
7
UUID更改
1 打开ble_nus.c 2 更改下面UUID,记得APP也需要同步修改 uint32_t ble_nus_init(ble_nus_t * p_nus, const ble_nus_init_t * p_nus_init) { uint32_t err_code; ble_uuid_t ble_uuid; ble_uuid128_t nus_base_uuid = {0x9E, 0xCA, 0xDC, 0x24, 0x0E, 0xE5, 0xA9, 0xE0, 0x93, 0xF3, 0xA3, 0xB5, 0x00, 0x00, 0x40, 0x6E};
[数据手册] 发一个蓝牙UART模块的使用教程BTUART说明书
![[数据手册] 发一个蓝牙UART模块的使用教程BTUART说明书](https://img.taocdn.com/s3/m/674804385727a5e9856a610e.png)
蓝牙UART模块使用说明书(中文版)1. 蓝牙UART模块说明左图为蓝牙UART模块正面的3D图截图,左上角有两个LED指示灯。
红色指示灯在接通电源后长亮,蓝色指示灯的闪烁状态指示模块的工作状态:●慢速连续闪烁:AT模式●快速连续闪烁:BT模式时未连接设备●快闪两次循环:BT模式时已连接设备右上角有一个微型拨动开关,可以选择蓝牙工作模式,拨动到AT边即为AT模式,拨动到BT边即为BT模式(更改模式时需要断电):●AT模式:用于配置蓝牙模块的参数,例如模块的名称、配对密码、通信波特率等。
●BT模式:用于UART数据通信。
左图为模块背面引脚说明,从上到下为GND,+5V,EN,RX和TX:●GND:连接到系统接地●+5V:连接到可靠的+5V电源●EN:连接到MPU引脚,可控制模块使能。
悬空默认为“ON”。
●RX:连接MPU的TX引脚,若MPU内部无上拉电阻则此引脚需要上拉1。
●TX:连接MPU的RX引脚。
2. E-config底座说明左图为蓝牙UART模块配套的E-config底座(另购)。
该底座可以直接插上本店的蓝牙UART模块进行配置和通信。
本底座插入电脑USB端口之后,会提示安装驱动程序,在安装过正确的驱动程序之后,就可以插入蓝牙UART模块进行使用了。
在使用配置功能时,需要将蓝牙UART模块的拨动开关拨到AT位置,再插入E-config底座。
同样,在使用该底座结合蓝牙UART模块进行PC上的串口通信时,也是先拨动开关到BT位置,再插入。
插入后会看到指示灯闪烁的区别。
另外,请勿将非本店的UART模块插入E-config底座,本店对因为引脚和电压不准确引起的E-config底座损坏和您的其他设备损坏不承担任何责任。
3. Bluetooth UART++ 软件使用说明BT UART++是本店专门开发用于方便配置蓝牙UART模块的软件,可以修改和查看蓝牙UART模块的各种参数,并且可以在主机模式下搜索其他可被搜索的蓝牙设备。
详解蓝牙空中升级(BLEOTA)原理与步骤

详解蓝⽛空中升级(BLEOTA)原理与步骤如何实现BLE OTA?什么叫DFU?如何通过UART实现固件升级?⼜如何通过USB实现固件升级?怎么保证升级的安全性?什么叫双区(dual bank)DFU?什么叫单区(single bank)DFU?什么叫后台式(background)DFU?本⽂将对上述问题进⾏探讨。
DFU过程中涉及的所有操作步骤所对应的脚本都放在百度云盘上,云盘链接如下所⽰:链接: 密码: y8fb脚本是按照SDK版本进⾏分类的,建议⼤家把⾃⼰SDK版本对应的脚本下载下来,然后跟着第3章的操作步骤⼀步⼀步去实现⾃⼰的DFU。
1.概述所谓DFU(Device Firmware Update),就是设备固件升级的意思,⽽OTA(Over The Air)是实现DFU的⼀种⽅式⽽已,准确说,OTA的全称应该是OTA DFU,即通过空中⽆线⽅式实现设备固件升级。
只不过⼤家为了⽅便起见,直接⽤OTA来指代固件空中升级(有时候⼤家也将OTA称为FOTA,即Firmware OTA,这种称呼意思更明了⼀些)。
只要是通过⽆线通信⽅式实现DFU的,都可以叫OTA,⽐如2G/3G/4G/WiFi/蓝⽛/NFC/Zigbee,他们都⽀持OTA。
DFU除了可以通过⽆线⽅式(OTA)进⾏升级,也可以通过有线⽅式进⾏升级,⽐如通过UART,USB或者SPI通信接⼝来升级设备固件。
不管采⽤OTA⽅式还是有线通信⽅式,DFU包括后台式(background)和⾮后台式两种模式。
后台式DFU,⼜称静默式DFU(Silent DFU),在升级的时候,新固件在后台悄悄下载,即新固件下载属于应⽤程序功能的⼀部分,在新固件下载过程中,应⽤可以正常使⽤,也就是说整个下载过程对⽤户来说是⽆感的,下载完成后,系统再跳到BootLoader模式,由BootLoader完成新固件覆盖⽼固件的操作,⾄此整个升级过程结束。
⽐如智能⼿机升级Android或者iOS系统都是采⽤后台式DFU⽅式,新系统下载过程中,⼿机可以正常使⽤哦。
BLE协议栈简介

BLE协议栈简介协议是一系列的通信标准,通信双方需要共同按照这一标准进行正常的数据发射和接收。
协议栈是协议的具体实现形式,通俗点来理解就是协议栈是协议和用户之间的一个接口,开发人员通过使用协议栈来使用这个协议的,进而实现无线数据收发。
下图为BLE协议栈的结构框图:图 3.1BLE栈架构协议栈包括两个部分:控制器和主机。
控制器和主机在标准蓝牙BR/EDR 设备这两个部分通常是单独实现。
任何配置文件和应用程序都是建立在GAP和GATT协议层上。
·PHY层:1Mbps自适应跳频GFSK(高斯频移键控),运行在免证的2.4GHz 频段。
·LL层:RF控制器,控制设备处于准备(standby)、广播(advertising)、监听/扫描(scanning)、初始化(initiating)、连接(connected)这五种状态中一种。
·HCI层:为接口层,向上为主机提供软件应用程序接口(API),对外为外部硬件控制接口,可以通过串口、SPI、USB来实现设备控制。
·L2CAP层:为上层提供数据封装服务,允许逻辑上的端到端数据通信。
·SM层:提供配对和密匙分发服务,实现安全连接和数据交换。
·GAP层:直接与应用程序或配置文件(profiles)通信的接口,处理设备发现和连接相关服务。
另外还处理安全特性的初始化。
·ATT层:导出特定的数据(称为属性)到其他设备。
·GATT层:定义了使用ATT的服务框架和配置文件(profiles)的结构。
BLE中所有的数据通信都需要经过GATT。
TI的这款CC2540器件可以单芯片实现BLE蓝牙协议栈结构图的所有组件,包括应用程序。
通过上面的介绍,我们基本了解了BLE协议栈的各层功能,其中需要我们直接接触的主要是GAP和GATT这两个层。
传感网应用开发(高级)课件5.5 基于BLE协议栈的串口透传
1、在Profiles中添加特征值(P237) 2、特征值的定义(P238-239)注:P239代码纠错
3、特征值的相关函数与初始化(P239-P244)注:P239代码纠错
任务实施
1. 系统构成
本案例要求搭建一个基于BLE协议栈的串口透传系统,所需设备: PC机两台 蓝牙模块两个 串口线两条 NEWLab两台
③ 先给从机上电,再给主机上电,主从机串口打印输出信息
任务实施
任务实施
3. 实现主机向从机单方向传输
(1)主机采用UUID方式读取CHAR6句柄(P248-P249) (2)修改主机的串口回调函数代码(P249-P250) (3)修改从机的特征值改变回调函数(P250) (4)编译、下载主从机程序,并依次复位从机、主机(P251)
任务实施
2. 实现主从机上电自动连接
(1)添加扫描节点设备的代码(P245-P246) (2)添加连接设备代码(P246-P247) (3)给主从设备上电,实现自动连接:
① 编辑程序并下载到主机中,在workspace栏内选择 “CC2541EM”
② 从机采用任务5.2和任务5.3的SimpleBLEPeripheral.eww ,只要在LCD上显示的内容能在串口显示就可以
任务实施
3. 添加从机向主机发送数据代码,实现主从机串口透传
(1)主机打开CHAR7的通知功能(P252-P253); (2)主机响应CHAR7的通知,并得到从机发送的数据,上传给PC 机(P253); (3)打开SimpleBLEPeripheral工程SimpleBLEPeripheral.c文 件,从机接收串口数据,并更新CHAR7特征值数据;(P253-P254) (4)打开SimpleBLEPeripheral工程simpleGATTprofile.c文件
协议栈的串口实验
协议栈的串口实验前言:串口作为一种最简单的协议栈和调试者接口,在BLE的学习和应用过程中具有非常重要的作用。
所以,在进行蓝牙无线发送之前,我们需要先学习在协议栈里加入串口功能。
实现平台:WeBee CC2540模块及功能底板。
图 3.13网蜂CC2540模块及功能底板1.1.1串口发送实验现象:模块通过串口发送“HELLO WEBEE!”给电脑串口调试助手打印出来。
整个实验在协议栈(BLE-CC254x-1.2.1)中进行。
实验讲解:整个例程很简单,两步就能实现串口的发送,步骤如下:1、串口初始化2、串口发送打开BLE目录下的:Projects\ble\SimpleBLEPeripheral\CC2540DB里面的SimpleBLEPeripheral.eww工程。
这次试验我们直接基于协议栈的SimpleBLEPeripheral工程来进行的。
经过上节的讲解,我们对工程有初步的了解,下面主要在simpleBLEPeripheral.c中进行串口初始化。
需要修改的文件主要有simpleBLEPeripheral.c/h OnBoard.c/h。
打开工程后,在workspace下的选项选择CC2540图 3.14工程界面直接编译,无任何错误。
第一步:串口初始化在workspace下找到HAL\Target\CC2540EB\drivers的hal_uart.c文件,我们可以看到里面已经包括了串口初始化、发送、接收等函数,我们可以直接调用。
图 3.15hal_uart.c文件但在BLE跟Z-stack不一样,并没有MT层,所以不能直接调用MT层的串口初始化函数。
接下来就要添加串口初始化函数,串口初始化其实就是配置串口号、波特率、流控、校验位等等。
我们把它添加OnBoard.c文件中。
打开TOOLS下的OnBoard.c,添加自己想要的串口初始化配置代码:#include"hal_uart.h"1.void UartInit(void)2.{3.halUARTCfg_t uartConfig;4./*UART Configuration*/5.uartConfig.configured=TRUE;6.uartConfig.baudRate=HAL_UART_BR_115200;7.uartConfig.flowControl=HAL_UART_FLOW_OFF;8.uartConfig.flowControlThreshold=MT_UART_THRESHOLD;9.uartConfig.rx.maxBufSize=MT_UART_RX_BUFF_MAX;10.uartConfig.tx.maxBufSize=MT_UART_TX_BUFF_MAX;11.uartConfig.idleTimeout=MT_UART_IDLE_TIMEOUT;12.uartConfig.intEnable=TRUE;13.uartConfig.callBackFunc=NULL;14.15.HalUARTOpen(HAL_UART_PORT_0,&uartConfig);16.}第6行:uartConfig.baudRate是配置波特率,这里我们配置为115200,想要修改其它波特率,可以go to definition of HAL_UART_BR_115200选择其它设置:图 3.16波特率选择第7行:uartConfig.flowControl是配置流控的,这里选择关闭。
ble协议栈工作流程及原理
ble协议栈工作流程及原理
BLE协议栈工作流程及原理如下:
工作流程:BLE协议栈主要用来对应用数据进行层层封包,以生成一个满足BLE 协议的空中数据包,把应用数据包裹在一系列的帧头和帧尾中。
工作原理:
BLE协议栈主要由四部分组成,分别是:
1.PHY层。
用来指定BLE所用的无线频段、调制解调方式和方法等。
2.LL层。
是整个BLE协议栈的核心,负责选择射频通道、识别空中数据包、
保证数据完整性等。
3.GAP层。
对LL payload进行一些规范和定义,实现广播、扫描和发起连接
等功能。
4.L2CAP层。
提供一对一的、多点的和广播连接机制。
uart驱动调试方法
uart驱动调试方法UART(通用异步收发转换器)是一种广泛应用于嵌入式系统中的串行通信接口。
在调试UART驱动的过程中,需要注意以下几个方面:1.环境准备:调试UART驱动需要一台具备UART接口的开发板和一个串口调试工具(如Tera Term)。
首先确保开发板和电脑通过串口连接,并且对应的串口驱动已经正确安装。
2.模块加载和设备树配置:对于Linux系统,需要根据硬件设备配置信息修改设备树文件,并重新生成设备树。
然后通过insmod命令加载UART驱动模块。
在Windows系统中,需要确保正确安装UART驱动程序。
3.设置串口参数:在调试UART驱动之前,需要根据实际情况设置串口参数,包括波特率、数据位、校验位、停止位等。
通常通过调用相应的API函数来设置这些参数,如`tcgetattr(`和`cfsetospeed(`。
4.调试输出信息:在UART驱动中,使用调试输出信息可以帮助判断是否正常工作。
可以通过在代码中插入`printk(`函数或使用调试框架(如`debugfs`)来输出调试信息。
在Linux系统中,可以使用`dmesg`命令或在`/var/log/messages`文件中查看输出的消息。
5.错误处理和调试分支:在UART驱动调试过程中,可能会遇到各种错误情况,如数据传输错误、接收中断丢失等。
可以通过在代码中插入错误处理分支和调试分支来定位和解决问题。
可以使用断点调试工具(如GDB)来跟踪代码执行流程,查看寄存器和变量的值,以及检查堆栈情况等。
6.数据收发测试:调试UART驱动的最重要的一部分是测试数据的收发。
可以编写测试代码来发送和接收数据,并通过端口控制工具(如Tera Term)来检查数据的正确性。
在编写测试代码时,可以使用相关的API函数(如`read(`和`write(`)来进行数据的读写操作。
7.性能优化:在调试UART驱动时,也可以对性能进行优化。
可以通过调整中断和DMA等参数,优化数据传输的速度和效率。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
ghostyu.taobao.com
1
BLE协议栈UART调试指南
Ghostyu
2013-05
ghostyu.taobao.com
2
版本
V1.0 2013-05 初始版发布
ghostyu.taobao.com
3
目的
很多时候我们会用到芯片的uart连接一些外围设备,CC2540的UART基础代码我们已测试OK并放在源
码的源码目录下,但这远远不能达到我们的要求:如何在TI的ble协议栈中使用uart功能,例如开发蓝
牙串口透传的程序等等,本来就是针对协议栈中使用UART过程中遇到的问题的记录。
阅读本文档前,请先阅读下列文档
OSAL编程指南
ghostyu.taobao.com
4
1 概述
TI BLE协议栈中已经做了UART底层驱动,因此并不需要我们重头编写UART的驱动代码,而是直接调
用hal_uart.c中的api函数。该驱动源文件在如下目录:
\BLE-CC254x-1.3\Components\hal\target\CC2540EB\hal_uart.c
注意红色字体,我们的开发板平台是SmartRF-CC2540,TI还有其他的平台,如果USBDongle-CC2540、
SensorTag-CC2541、Keyfob-CC2540,尤其是在打开IAR工程后,请注意区分这几个配置。
2 新建带有UART的SimpleBLEPeripheral
2.1我们在SimpleBLEPeripheral基础上添加串口功能,为了不影响原先代码,复制
SimpleBLEPeripheral文件夹为SimpleBLEPeripheral_SerialApp,然后打开
SimpleBLEPeripheral_SerialApp的IAR工程
2.2然后在IAR的Workspace中选择合适的Configuration(在概述中提到的开发平台),这里我们选
择CC2540,注意其他的配置。在其他的IAR工程中类似。
2.3打开该配置的Option属性,右击SimpleBLEPeripheral,在出现的对话框中选择左边的
C/C++Compiler选项。
ghostyu.taobao.com
5
然后再单击右边的Preprocessor选项卡,并在Defined symbols中添加HAL_UART=TRUE,如下图:
虽然协议栈代码中是包含UART驱动源码的,但是由宏定义HAL_UART来决定是否开启UART,这里提供
一个预处理的宏定义,这样IAR工程就会包含UART,在配合自己编写的UART初始化代码就可以在协议栈中
使用UART功能了。
2.3添加UART初始化代码
在SimpleBLEPeripheral的APP目录下创建两个文件:SerialApp.c和SerialApp.h,我们将UART的
相关配置放到这两个文件里。
SerialApp.h截图如下:
ghostyu.taobao.com
6
SerialApp.c中有三个非常重要的函数,首先是uart配置:
另一个是uart回调函数,在回调函数中接收可用的串口数据
ghostyu.taobao.com
7
最后是供外部调用的初始化接口函数:
2.4 将代码集成到BLE协议栈任务函数中
在任务函数中调用刚才提到的初始化接口函数即可;
2.5 编译IAR工程并测试
使用直连串口线连接开发板与PC,在串口调试助手里发送任务的字符串,将能够在开发板的LCD显示
屏上显示,如下图
ghostyu.taobao.com
8
对应的代码如下图:
2.6 调试中的问题
在得到上面的结果并不是很顺利,主要遇到了下面的两个比较大问题
2.6.1 回调函数中接收的数据不完整
单步调试时回调函数会被调用两次,第一次只能接收一个字符,第二次会接收剩余的字符,也就是在上图
的sbpSerialAppCallback()函数中,第一次Hal_UART_RxBufLen()函数只返回1或者2,不能完整的返回整
个字符串的长度,最后查到的问题是回调函数调用后需等待一小段时间在调用Hal_UART_RxBufLen函数,
这样就能一次性读到完整的数据。在上图的回调函数中,有一条不起眼的语句:
就已经达到了延时的作用。
2.6.2正常运行时,调试助手发送的数据,cc2540不能及时接收到,有数据丢失,并且会隔很久。
这个问题是由于开启了POWER_SAVING,我临时的解决办法取消了POWER_SAVING宏定义预处理,如下图: