Python实现RTT客户端,源码+详细讲解,绝对原创!申请置酷!

2019-12-12 18:13发布

不知道RTT是什么、怎么用的请看下面这两个帖子:
JLINK RTT,完爆各种printf形式,从此swo是路人
开贴研究:JLINK RTT,完爆各种printf形式,从此swo是路人

RTT确实是调试神器,可RTT的电脑客户端太不给力,只能显示文字不说,连复制、清除这些基本功能都没有,所以就想自己做一个RTT客户端出来

经过几天的刻苦 摸索加上神器Python的加持,终于制作出了初版可用的RTT客户端,之前得到很多莫友的各种帮助,所以赶快贡献出来,希望对各位莫友有用。。

首先上效果图:
文本显示:
QQ截图20160319160914.png (6.26 KB, 下载次数: 0) 下载附件 2016-3-19 16:08 上传
unpack函数的第一个参数是解析字符串,,其中16s表示16个字符的字符串,L表示4字节的int,24x表示跳过24字节不管,,struct的更详细的用法可去网站上去搜索看一下
通过对照SEGGER_RTT_CB结构体的定义可以知道上面15个数值的具体含义

至此,我们已经完成了通过JLINK读取内存,并解析出_SEGGER_RTT结构体变量各个域的值,,然后我们通过解析出SEGGER_RTT_RING_BUFFER中pBuffer指向的内存,就能读取出用户要显示的数据

当然,读取完数据后还需要通过JLINKARM_WriteMem函数来修改内存中的读偏移RdOff,,这些更加完整、详细的操作可以通过读下面的程序源码来理解:

完整程序源码: RTTView.rar (7.1 KB, 下载次数: 499) 2016-3-19 16:16 上传 点击文件名下载附件
执行此程序需要安装Python 2.7、PyQt和PyQwt

欢迎大家尝试使用,希望莫大能给置酷
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
100条回答
XIVN1987
2019-12-13 10:13
lanfeng0107 发表于 2016-3-19 16:46
请教些问题:
我看到在gwnpeter的帖子中他添加了那个结构体:
static SEGGER_RTT_CB _SEGGER_RTT = {

RTT代码中SEGGER_RTT_CB结构体和SEGGER_RTT_RING_BUFFER结构体定义处有详细解释

  1. typedef struct {
  2.   const     char*    sName;         // Optional name. Standard names so far are: "Terminal", "SysView", "J-Scope_t4i4"
  3.             char*    pBuffer;       // Pointer to start of buffer
  4.             unsigned SizeOfBuffer;  // Buffer size in bytes. Note that one byte is lost, as this implementation does not fill up the buffer in order to avoid the problem of being unable to distinguish between full and empty.
  5.   volatile  unsigned WrOff;         // Position of next item to be written by either host (down-buffer) or target (up-buffer). Must be volatile since it may be modified by host (down-buffer)
  6.   volatile  unsigned RdOff;         // Position of next item to be read by target (down-buffer) or host (up-buffer). Must be volatile since it may be modified by host (up-buffer)
  7.             unsigned Flags;         // Contains configuration flags
  8. } SEGGER_RTT_RING_BUFFER;

  9. //
  10. // RTT control block which describes the number of buffers available
  11. // as well as the configuration for each buffer
  12. //
  13. //
  14. typedef struct {
  15.   char                    acID[16];                                 // Initialized to "SEGGER RTT"
  16.   int                     MaxNumUpBuffers;                          // Initialized to SEGGER_RTT_MAX_NUM_UP_BUFFERS (type. 2)
  17.   int                     MaxNumDownBuffers;                        // Initialized to SEGGER_RTT_MAX_NUM_DOWN_BUFFERS (type. 2)
  18.   SEGGER_RTT_RING_BUFFER  aUp[SEGGER_RTT_MAX_NUM_UP_BUFFERS];       // Up buffers, transferring information up from target via debug probe to host
  19.   SEGGER_RTT_RING_BUFFER  aDown[SEGGER_RTT_MAX_NUM_DOWN_BUFFERS];   // Down buffers, transferring information down from host via debug probe to target
  20. } SEGGER_RTT_CB;
复制代码

MaxNumUpBuffers是从单片机向电脑传数据的Buffer的个数,默认是2
下面定义了2个向电脑传数据的环形缓冲区和两个电脑向单片机传数据的环形缓冲区,,

缓冲区的名字是可选的,Terminal、Log其实没啥太大用处,,
缓冲区的关键参数有4个,分别是指向缓冲数组的指针、数组的大小和读、写指针

比如Up环形缓冲区,其实就是单面机网里面装数据,J-Link RTT Viewer通过Jlink把里面的数据读出来显示,,就这么简单

一周热门 更多>