• 正文
  • 相关推荐
申请入驻 产业图谱

BLE主机实战:芯科芯片打印LOG踩坑记录

09/07 11:33
202
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

一、前言

上一篇分析了主机主动发送断连指令给到从机,主机上报的断连原因,接下来本来是要分析从机打印的断连log的,但是在我自己进行测试的时候,发现芯科的芯片作为从机,在和手机端连接,不管是用nrf connect软件还是他们自己公司的app软件进行测试时,在打印log的时候,99%情况下都打印不出来,蓝牙协议栈直接死掉。

针对log打印不出来和蓝牙协议直接死掉的情况,我查了几天的原因,今天总算是将问题查找出来的。今天的文章内容主要是关于这一块踩坑的解决方案

二、阅读说明

1、泰凌微芯片开发学习者。2、芯科芯片开发学习者。3、蓝牙 spec学习者。

三、正文

1、使用的demo

芯科芯片:Bluetooth - SoC Blinky

2、使用VCOM进行打印的时

当用串口打开JLink CDC UART后(如下图1所示),使用手机上的APP软件,比如nrf connect,或者BLE 调试助手,搜索这个demo的广播名,然后点击连接,发现手机端一直发现不了从机的服务,30s之后就直接断连了如下图2所示,并且在此期间串口未打印出任何的log出来(如下图1所示)。

图1

图2

3、调试代码,查找原因

对代码进行debug调试,发现代码始终停在while这里,始终运行不下去。尝试屏蔽掉该while代码,如下:

屏蔽掉之后,发现手机上的app能正常连接该广播设备了,反复连接和断开好几次发现都正常,不过观察串口打印,发现打印不出信息。

4、解决打印的问题

既然已经定位到出现问题的地方了,那么就知道这是什么原因引起的了,该EUSART_Tx是负责打印的串口函数,既然程序堵塞在这里,说明当前是打印引起的。既然VCOM打印不了,那么我用RTT进行打印。

如上图所示,我安装了SEGGR RTT组件,之后对RTT进行初始化

如上图所示,在app_init()函数中增加如下初始化代码:

  SEGGER_RTT_Init();  SEGGER_RTT_printf(0, "Blinky app initrn");

备注:SEGGER_RTT_printf是打印函数,读者在需要打印的时候可以进行调用。下图是使用RTT进行打印的log,注意在进行RTT打印的时候,需要将串口关闭,并且开发板需要重新复位,不然仍然会卡死。

Blinky app initBlinky example initializedonnection openedConnection closed,the reason is= 1013onnection openedConnection closed,the reason is= 1013

上述的log需要自行添加,如下图所示,是我添加的位置

5、使用VCOM打印

如果读者不想要用RTT进行打印,只想用VCOM进行打印,有一个办法可以实现,将串口的流控关掉,按照下图所示的步骤来进行操作:

串口打印如下图所示:

00[I] Blinky example initialized.[I] Connection opened.[I] Connection closed,,the reason is= 1013[I] Connection opened.[I] Connection closed,,the reason is= 1013

四、结尾

本篇介绍了芯科芯片打印方面的bug。

相关推荐

专注BLE实战开发,也分享物联网、嵌入式等相关技术

微信公众号