参考链接
目前还有一些bug,比如时间戳有时候会加在一行log的中间,有时候又会少一些时间戳,但是log目前没发现出现问题
在使用
pylink
时,需要用到Jlink的dll库,需要将D:\SEGGER\JLink_V766d
文件夹下的JLink_x64.dll
和JLinkARM.dll
拷贝到以下python
脚本的同一路径下
在安装
pylink
的时候要特别注意:我们需要安装的是pylink-square
,可以通过pip install pylink-square
安装,安装完成后可以通过pip list | findstr pylink-square
。(Linux系统下用pip list | grep pylink
)
import pylink
import time
import osMAX_FILE_SIZE = 200 * 1024 * 1024 # 设置log文件的大小最大为 200MB,如果超过就新建一个文件继续存储def RTT_read_string(link):"""从RTT up buffer读取字符串Args:link: the ``JLink`` instanceReturns:读到的字符串"""try:if link.target_connected():readdata = link.rtt_read(0, BUFFER_SIZE_UP)if len(readdata) > 0:readdata = ''.join(map(chr, readdata))else:readdata = []except pylink.errors.JLinkException:readdata = []passreturn readdatajlink = pylink.JLink()
jlink.open()
jlink.set_tif(pylink.enums.JLinkInterfaces.JTAG)
jlink.connect('STM32F302VE')
jlink.rtt_start()# log 文件以当前时间命名
file_name = "./" + time.strftime("%Y%m%d_%H%M%S", time.localtime()) + ".txt"
fp = open(file_name, "a", newline='\n') # 指定文件换行符为'\n',即只有遇到'\n'才换行(这样遇到'\r\n'时就不会换行两次了)while True:try:rttOut = RTT_read_string(jlink)if len(rttOut) != 0:# print(rttOut, end="") # 用于调试,在终端输出,不另外添加换行,因为log中已经包含了换行符try:fp.write(time.strftime("[%Y%m%d %H:%M:%S] ", time.localtime()) + rttOut) # 每一条log都加上时间戳file_stat = os.stat(file_name) # 获取文件大小if file_stat.st_size > MAX_FILE_SIZE: # 如果文件大于指定大小,就关闭当前文件,并新建一个新的文件用于存储接下来的logfp.close()file_name = "./" + time.strftime("%Y%m%d_%H%M%S", time.localtime()) + ".txt"fp = open(file_name, "a", newline='\n')except KeyboardInterrupt: # 用Ctrl-C停止接收logprint("keyInterrupt")fp.close()jlink.rtt_stop()jlink.close()breakexcept: # 当固件中调用SEGGER_RTT_SetTerminal()函数切换RTT通道时,这边会多接收到一个非法字符,无法写入到文件,需要通过fp.write(rttOut[1:]) 跳过这个非法字符fp.write(time.strftime("[%Y%m%d %H:%M:%S] ", time.localtime()) + rttOut[1:])print("UnKnow")except KeyboardInterrupt:print("keyInterrupt")fp.close()jlink.rtt_stop()jlink.close()break