SEGGER RTT 输出格式是如何定义的?

  • 2小时前

前一段时间没怎么写代码,以至于调试生疏了很多,很多调试软件用起来总是不尽兴,log信息使用串口打印还是稍微繁琐了一些,而且,每次换一个单片机,就得移植一遍串口。

看来,与生俱来的调试助手,还得是RTT,做一个单片机的板子,至少得流出SWD接口来。

其实RTT也不是很爽,每次打开还得选择MCU,遇上国产小品牌的MCU,选型列表里没有,只能选个M0先试试。

另外,RTT能展现的内容也不够丰富,也就是个打印,想显示曲线,还得换软件。不够轻量化和易用。

对于RTT的协议扩展,最多也就是增加了几种颜色,这个功能,我在封装的RTT模块中已经写好了,不过,当初写的时候,没在意其中的数据结构,今天正好想自己读取RTT数据来展示,就深入研究了一下。

教你如何使用SEGGER RTT优雅的实现日志系统

RTT的原理很简单,他利用printf类似的函数功能,讲我们想要发送出来的信息存储在Ram中的一个固定区域,上位机的软件,就可以通过SWD接口快速的读取这块的缓存数据,然后将它们显示在界面窗口里面。

移植RTT的时候,我们是如何增加颜色的呢?

如上面的宏定义,我们在RTT_printf外面又套了一层壳子,除了我们原本打印的数据外,我们在增加了一头一尾,让我们打印的数据被两个特殊字符包裹起来。

从定义的命名中可以看出,前面的是color,颜色。后面的是一个特殊的控制字符RESET,表示这部分颜色结束了。

在RTT的宏定义文件中是这样定义的:

我通过C#调用了JLINKARM.dll文件,读取了缓存区的数据。

我在MCU中一次性发送了两组数据,一组不带颜色,一组带颜色(LOG_ERROR)。

我在C#中调试,读取到的信息如下,是一串很长的数据,按照字符串来理解。

原始数据:"pitch: 6298 roll: -7623 yaw: 73370 nu001b[0mu001b[1;31mERR: pitch: 6298 roll: -7623 yaw: 73370 nu001b[0m"

其实,这是两串数据,我们需要把它断开,如何切断呢?

以RTTCTRLRESET来切断,也就是u001b[0m。如此以来,我们得到了两组数据。

无颜色:pitch: 6298 roll: -7623 yaw: 73370 nu001b[0m

红色:u001b[1;31mERR: pitch: 6298 roll: -7623 yaw: 73370 nu001b[0m

如此以来,我们可以在上位机来对这些颜色信息进行解释,起码可以自己做一个软件,显示出五颜六色的数据。

再者,我们只需要利用这些特殊字符,一样可以写出曲线的显示,仪表盘的显示等等。

目前的缺点是,我们还需要安装jlink驱动来实现这个功能,如果我们使用DAPLink这种不需要驱动的调试器,有没有办法可以兼容RTT的格式,同样开发一套通过SWD接口的LOG软件呢?有知道的大佬,后台指教一下,多谢。

人工客服
(售后/吐槽/合作/交友)

相关资讯

  1. 1.
  2. 2.
  3. 3.
  4. 4.
  5. 5.
  6. 6.
  7. 7.
  8. 8.
  9. 9.
  10. 10.
  11. 11.
  12. 12.
  13. 13.
  14. 14.
  15. 15.
  16. 16.
  17. 17.
  18. 18.
  19. 19.
  20. 20.
查看全部20条内容