一、前言
上一篇分析了主机主动发送断连指令给到从机,主机上报的断连原因,接下来本来是要分析从机打印的断连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。
202