CircuitPython串口终端ANSI转义序列应用:彩色调试与动态界面实现

news2026/5/8 18:32:51
1. 项目概述给CircuitPython终端加点“颜色”如果你玩过树莓派Pico、Adafruit的Feather或者任何一块能跑CircuitPython的板子大概率用过它的REPL交互式解释器。默认情况下那就是一个黑底白字的世界所有输出都挤在一起调试信息、状态提示、错误日志混成一团看得人眼花缭乱。我最初也是这么过来的直到有一次在调试一个多传感器项目时串口里喷涌而出的日志让我彻底迷失了方向。那一刻我无比怀念在Linux终端里用彩色文字高亮关键信息的日子。这个痛点催生了CircuitPython_ansi_escape_code库的诞生。它的核心目标很简单把经典的ANSI转义序列带到资源受限的微控制器上让你能在CircuitPython的串口终端里使用颜色、移动光标、清屏从而极大地提升调试效率和交互界面的可读性。ANSI转义序列是一套起源于老式文本终端时代的控制代码通过在输出的文本中插入一些特殊的字符序列就能指挥终端完成改变颜色、移动光标等操作。在现代Linux、macOS的终端里这几乎是标配功能但在嵌入式领域尤其是像CircuitPython这样面向教育和小型项目的环境中原生支持却很少。这个库就是一座桥它把“古老”但极其有用的终端控制技术带到了现代的微型硬件上。无论你是想用红色突出显示错误用绿色标记成功状态还是想做一个动态刷新的小型命令行界面来监控传感器数据它都能派上用场。接下来我会带你深入这个库的内部看看它是如何工作的以及如何最大限度地利用它来点亮你的嵌入式项目。2. ANSI转义序列终端控制的“摩尔斯电码”在深入代码之前我们得先搞懂它依赖的基石ANSI转义序列。你可以把它理解为一种终端与计算机之间的“暗号”或“协议”。当终端程序比如我们电脑上连接开发板的串口工具如PuTTY、Screen、或者Thonny的串口终端看到一串以特殊字符开头的文本时它不会把这些字符显示出来而是将其解释为一个命令并执行相应的操作。2.1 核心语法与工作原理一个典型的ANSI序列以转义字符Escape开头通常是ASCII码为27的字符在Python中可以用\x1b或\033来表示。紧随其后的是一个左方括号[这构成了控制序列引导码CSIControl Sequence Introducer。CSI后面跟着具体的数字参数和一个结束字母命令。例如\x1b[31m这个序列的意思是“将后续文本的前景色设置为红色”。这套标准之所以能在CircuitPython上工作是因为绝大多数现代串口终端软件包括那些集成在IDE里的都兼容基本的ANSI转义功能。当你的CircuitPython设备通过print(“\x1b[31mError!\x1b[0m”)向串口输出时你的电脑上的终端程序会接收并解析这些字节最终在屏幕上显示出红色的“Error!”字样。设备本身并不负责渲染颜色它只是输出了包含控制码的原始字节流。2.2 常用序列分类解析CircuitPython_ansi_escape_code库主要封装了以下几类最常用的序列理解它们能帮你更好地使用这个库1. 文本属性与颜色这是最常用的功能。序列格式通常为\x1b[属性代码m。重置所有属性\x1b[0m。这是最重要的序列之一用于关闭之前设置的所有颜色和特效避免后续所有输出都“染上”颜色。前景色文字颜色使用30-37表示标准色90-97表示亮色。例如\x1b[31m是红色\x1b[91m是亮红色。背景色使用40-47表示标准背景色100-107表示亮背景色。例如\x1b[41m是红色背景。文本特效如加粗(\x1b[1m)、下划线(\x1b[4m)、反显(\x1b[7m)等。但需要注意的是并非所有终端都支持所有特效加粗在部分终端上可能表现为改变颜色强度而非字体。2. 光标控制这允许你精确控制光标位置是实现动态界面如进度条、实时数据仪表的关键。移动光标到指定位置\x1b[行;列H。例如\x1b[10;5H将光标移动到第10行第5列行和列通常从1开始计数。相对移动\x1b[数量A向上移动\x1b[数量B向下\x1b[数量C向右\x1b[数量D向左。保存与恢复光标位置\x1b[s保存当前位置\x1b[u恢复。这在绘制复杂界面时非常有用可以确保在输出一些临时信息后能回到原来的编辑点。3. 屏幕控制清屏\x1b[2J清除整个屏幕并将光标移至左上角(1,1)。清除从光标到行尾\x1b[K。这在更新某一行内容时比重新输出整行更高效。注意一个常见的误区是忘记重置属性。如果你设置了颜色但没有用\x1b[0m重置那么该颜色会一直生效直到终端会话结束或被新的颜色设置覆盖。最佳实践是在输出完需要高亮的内容后立即重置属性。例如print(“\x1b[31m[ERROR]\x1b[0m Sensor not found.”)。3. 库的设计与使用模式解析s-light/CircuitPython_ansi_escape_code库并没有重新发明轮子它的价值在于将零散的、需要记忆的转义序列封装成一套Pythonic的、易于使用的接口。我们来看看它是如何组织的。3.1 核心类结构库的核心是一个名为ANSIColors的类从示例代码中推断。它很可能采用了嵌套类或嵌套字典的结构来组织常量使得访问路径非常直观符合“自文档化”的特点。# 假设的库内部结构示意非实际源码 class ANSIColors: reset “\x1b[0m” class fg: # 前景色 black “\x1b[30m” red “\x1b[31m” green “\x1b[32m” yellow “\x1b[33m” blue “\x1b[34m” magenta “\x1b[35m” cyan “\x1b[36m” white “\x1b[37m” # 可能还有亮色版本如 lightred “\x1b[91m” class bg: # 背景色 black “\x1b[40m” red “\x1b[41m” # ... 以此类推 class style: # 文本样式 bold “\x1b[1m” underline “\x1b[4m” # ...这样的设计让代码的可读性极高。你不需要去查手册记住\x1b[36m是青色你只需要写terminal.ANSIColors.fg.cyan意图一目了然。这对于需要频繁使用颜色的调试输出来说极大地减少了心智负担和出错概率。3.2 基本使用模式与字符串拼接库文档中给出的示例展示了最直接的使用方式字符串拼接。import ansi_escape_code as terminal print( terminal.ANSIColors.fg.lightblue “Hello “ terminal.ANSIColors.fg.green “World “ terminal.ANSIColors.fg.orange “:-)” terminal.ANSIColors.reset )这种方式简单明了但在需要混合多种样式或动态生成字符串时代码会显得有些冗长。在实际项目中我通常会采用以下几种进阶模式来让代码更整洁1. 使用别名和预定义格式对于项目中频繁使用的格式如错误、警告、成功信息可以提前定义好。import ansi_escape_code as term ERR term.ANSIColors.fg.red term.ANSIColors.style.bold WARN term.ANSIColors.fg.yellow SUCCESS term.ANSIColors.fg.green RESET term.ANSIColors.reset print(f”{ERR}[FAIL]{RESET} Connection timeout.”) print(f”{WARN}[WARN]{RESET} Battery level at 20%.”) print(f”{SUCCESS}[ OK ]{RESET} Data saved successfully.”)2. 封装格式化函数创建一个辅助函数进一步简化调用。这在需要添加固定前缀如时间戳时尤其有用。def log_error(msg): ts “[{:10}]”.format(time.monotonic_ns() // 1000000) # 简易毫秒时间戳 print(f”{term.ANSIColors.fg.red}{ts} [ERROR] {msg}{term.ANSIColors.reset}”) def log_sensor(name, value, unit): print(f”{term.ANSIColors.fg.cyan}{name}: {term.ANSIColors.fg.yellow}{value}{unit}{term.ANSIColors.reset}”)3. 利用f-string如果CircuitPython版本支持CircuitPython对Python 3的兼容性在不断提升如果版本支持f-string是拼接字符串和转义序列最优雅的方式如上例所示。如果不支持则需使用format()方法或%格式化。实操心得性能考量。在内存和计算资源极其有限的微控制器上频繁的字符串拼接和格式化会带来开销。如果你的输出频率非常高比如高速传感器数据流需要权衡可读性和性能。一个折中的办法是对于固定不变的静态提示符使用预拼接的字符串对于动态变化的数据部分再进行拼接。例如STATIC_PROMPT term.ANSIColors.fg.blue “Temp: ” term.ANSIColors.reset然后print(STATIC_PROMPT str(temperature))。4. 实战应用构建一个动态传感器监控终端理论说再多不如动手做一遍。让我们设想一个经典场景你有一个基于CircuitPython的环境监测站连接了温湿度传感器和光照传感器。你想在串口终端里创建一个简洁、实时刷新、关键信息高亮的监控界面。我们将一步步实现它。4.1 硬件与项目初始化假设我们使用以下硬件主控板Adafruit Feather RP2040温湿度传感器AHT20通过I2C连接光照传感器模拟光敏电阻通过ADC引脚连接首先确保你的circuitpython-ansi-escape-code库已安装。按照文档最方便的方法是使用circup# 在电脑端执行 circup install ansi_escape_code然后将库文件安装到你的CircuitPython设备上。接着创建你的主程序文件code.py并导入必要的库。import board import busio import analogio import adafruit_ahtx0 # 假设使用AHT20库 import time import ansi_escape_code as term # 初始化I2C和传感器 i2c busio.I2C(board.SCL, board.SDA) aht20 adafruit_ahtx0.AHTx0(i2c) # 初始化光照传感器假设连接到A0引脚 light_sensor analogio.AnalogIn(board.A0) # 定义一些颜色常量方便使用 TITLE term.ANSIColors.style.bold term.ANSIColors.fg.cyan LABEL term.ANSIColors.fg.green VALUE term.ANSIColors.fg.yellow UNIT term.ANSIColors.fg.white RESET term.ANSIColors.reset ERROR term.ANSIColors.fg.red term.ANSIColors.style.bold4.2 实现单次数据刷新与清屏最简单的动态刷新就是定期清空整个屏幕然后重绘。我们可以使用\x1b[2J序列清屏并用\x1b[H将光标移回左上角。def clear_screen(): # \x1b[2J 清屏 \x1b[H 移动光标到左上角(1,1) print(“\x1b[2J\x1b[H”, end“”) def draw_static_header(): # 绘制一个固定的标题栏 print(f”{TITLE} Environment Monitor {RESET}”) print(“- * 30) def read_and_draw_sensors(): try: temp aht20.temperature humidity aht20.relative_humidity # 将ADC读数0-65535转换为更直观的百分比或勒克斯值此处简化 light_raw light_sensor.value light_percent (light_raw / 65535) * 100 except Exception as e: print(f”{ERROR}Sensor read error: {e}{RESET}”) return # 使用固定格式输出传感器数据LABEL, VALUE, UNIT 是之前定义的颜色常量 print(f”{LABEL}Temperature:{RESET} {VALUE}{temp:.1f}{UNIT}°C{RESET}”) print(f”{LABEL}Humidity:{RESET} {VALUE}{humidity:.1f}{UNIT}%{RESET}”) print(f”{LABEL}Light Level:{RESET} {VALUE}{light_percent:.1f}{UNIT}%{RESET}”) print() # 空行 # 主循环 while True: clear_screen() draw_static_header() read_and_draw_sensors() time.sleep(2) # 每2秒刷新一次这个方案能工作但有个明显问题屏幕会频繁全屏闪烁。因为每次都是先清空所有内容再重画视觉体验不佳且在输出过程中如果串口速度慢可能会看到绘制过程。4.3 进阶使用光标定位实现局部刷新更优雅的方案是只更新数据变化的部分。我们需要知道上次数据输出的位置然后将光标移回去覆盖旧数据。这需要用到光标移动序列\x1b[行;列H。首先我们规划好界面布局记住每一行数据的位置。# 定义界面行号假设从第3行开始显示数据 LINE_TEMP 3 LINE_HUMID 4 LINE_LIGHT 5 def move_cursor(line, column1): print(f”\x1b[{line};{column}H”, end“”) def draw_static_interface(): # 清屏并绘制永不改变的静态部分 clear_screen() print(f”{TITLE} Environment Monitor (Live Update) {RESET}”) print(“- * 40) move_cursor(LINE_TEMP, 1) print(f”{LABEL}Temperature:{RESET}”, end“”) # end“” 不换行 move_cursor(LINE_HUMID, 1) print(f”{LABEL}Humidity:{RESET}”, end“”) move_cursor(LINE_LIGHT, 1) print(f”{LABEL}Light Level:{RESET}”, end“”) # 注意这里只打印了标签预留了位置给动态数值。 def update_sensor_display(temp, humidity, light_percent): # 只更新数值部分假设数值从第20列开始 VALUE_COLUMN 20 move_cursor(LINE_TEMP, VALUE_COLUMN) # 先用空格“清除”旧数值的区域假设预留10个字符宽度 print(” “ * 10, end“”) move_cursor(LINE_TEMP, VALUE_COLUMN) print(f”{VALUE}{temp:.1f}{UNIT}°C{RESET}”, end“”) move_cursor(LINE_HUMID, VALUE_COLUMN) print(” “ * 10, end“”) move_cursor(LINE_HUMID, VALUE_COLUMN) print(f”{VALUE}{humidity:.1f}{UNIT}%{RESET}”, end“”) move_cursor(LINE_LIGHT, VALUE_COLUMN) print(” “ * 10, end“”) move_cursor(LINE_LIGHT, VALUE_COLUMN) # 可以添加颜色逻辑例如光照太强或太弱时变色 if light_percent 80: light_color term.ANSIColors.fg.red elif light_percent 20: light_color term.ANSIColors.fg.blue else: light_color VALUE print(f”{light_color}{light_percent:.1f}{UNIT}%{RESET}”, end“”) # 将光标移到一个不碍事的地方比如最后一行避免影响显示 move_cursor(10, 1) print(“”); # 打印空行确保光标在行尾有些终端需要这个来刷新显示 # 初始化界面 draw_static_interface() # 主循环 last_values {“temp”: None, “humidity”: None, “light”: None} while True: try: temp aht20.temperature humidity aht20.relative_humidity light_raw light_sensor.value light_percent (light_raw / 65535) * 100 except Exception as e: # 错误信息可以输出在固定行比如最底部 move_cursor(12, 1) print(f”{ERROR}Read Error: {e}{RESET}” ” “ * 20) # 加空格清除旧错误信息 time.sleep(1) continue # 只有数据发生变化时才更新显示减少不必要的刷新 if (last_values[“temp”] ! temp or last_values[“humidity”] ! humidity or last_values[“light”] ! light_percent): update_sensor_display(temp, humidity, light_percent) last_values {“temp”: temp, “humidity”: humidity, “light”: light_percent} time.sleep(0.5) # 可以更频繁地检查但只在实际变化时更新这个方案实现了真正的“原地刷新”界面稳定不闪烁只有数据区域在变化用户体验大大提升。它展示了ANSI光标控制序列在创建简单嵌入式CLI界面时的强大能力。5. 常见问题、调试技巧与终端兼容性在实际使用中你可能会遇到一些坑。下面是我在多个项目中总结出来的常见问题及解决方法。5.1 问题排查速查表问题现象可能原因解决方案颜色不显示只看到乱码1. 终端软件不支持ANSI转义。2. 串口波特率或配置错误导致控制字符被错误解析或丢失。1.更换终端使用确认支持ANSI的终端如PuTTY需开启“终端类型”为xterm或VT100、Tera Term、VS Code串口终端、或Mac/Linux下的screen/minicom。2.检查连接确保波特率通常是115200与CircuitPython设备设置一致。颜色“污染”了后续所有输出忘记在彩色文本后输出\x1b[0m重置序列。养成好习惯总是在彩色文本段末尾加上重置序列。使用库的ANSIColors.reset常量。光标移动位置不准1. 行号或列号计算错误通常从1开始计数。2. 在移动光标前输出了换行符(\n)导致实际行数变化。1.仔细计算在规划界面时画一个文本坐标图。2.使用end””参数在print移动光标或输出不换行的内容时使用print(“…”, end””)。屏幕闪烁或残留字符使用全屏清屏(\x1b[2J)过于频繁或局部更新时没有用空格覆盖旧内容的全部长度。优化刷新策略1. 改为局部更新。2. 局部更新时先输出足够长度的空格字符串来“擦除”旧内容再输出新内容。在Thonny编辑器中看不到颜色Thonny内置的串口终端可能默认未完全启用ANSI颜色支持。使用外部终端在Thonny中可以通过“工具”-“打开系统Shell…”来使用系统终端连接串口通常能正确显示颜色。或者考虑使用其他专用串口工具。库导入失败ModuleNotFoundError库文件未正确复制到CircuitPython设备的lib文件夹中。使用circup安装这是最可靠的方法。手动安装时确保将.mpy或整个库文件夹正确放置于设备的/lib/目录下。5.2 终端兼容性测试技巧不是所有终端都平等。为了确保你的项目在大多数环境下都能正常工作可以进行一个简单的兼容性测试。在你的code.py开头运行一次import ansi_escape_code as term print(“ANSI Test:”) print(term.ANSIColors.fg.red “Red Text” term.ANSIColors.reset) print(term.ANSIColors.bg.green term.ANSIColors.fg.white “Green BG White FG” term.ANSIColors.reset) print(term.ANSIColors.style.bold “Bold Text” term.ANSIColors.reset) print(“\x1b[7m” “Reverse Video” “\x1b[0m”) print(“Cursor movement test -”, end“”) print(“\x1b[5D”, end“”) # 光标左移5格 print(“- Overwrite!”, end“\n”) print(“\x1b[2K”, end“”) # 清除本行 print(“This line was cleared above.”)观察输出。如果颜色、样式、光标移动都符合预期那么你的终端兼容性很好。如果只有颜色生效而光标移动无效你可能需要调整光标控制逻辑或者接受只使用颜色功能。5.3 资源占用考量对于像CircuitPython这样运行在微控制器上的环境需要关注库的内存占用。ansi_escape_code库本身非常轻量因为它本质上只是一组预定义的字符串常量不包含复杂的逻辑。主要的开销来自于使用它时产生的字符串对象。优化建议使用.mpy文件如果库提供.mpy预编译的字节码格式使用它比.py源文件更节省RAM和闪存空间。复用字符串如前所述将常用的颜色组合定义为模块级别的常量避免在循环中反复拼接相同的字符串片段。谨慎使用复杂界面虽然光标控制很酷但维持一个多行、多位置的动态界面需要更多的状态管理和字符串操作。对于极其资源紧张的项目比如只有几十KB RAM的板子可能只使用基本的颜色高亮是更稳妥的选择。6. 扩展思路超越基础颜色与光标掌握了基础用法后你可以将这个库应用到更多有趣的方向提升项目的专业感和交互性。1. 创建分级日志系统为不同级别的日志信息DEBUG, INFO, WARN, ERROR, CRITICAL定义不同的颜色和前缀让日志输出一目了然。你甚至可以结合时间戳和模块名打造一个微控制器上的“迷你Log4j”。2. 实现交互式命令行菜单结合input()函数注意CircuitPython中input()的用法和光标控制你可以创建一个简单的文本菜单系统。例如高亮当前选中的菜单项在底部显示状态栏等。3. 绘制简单的文本图表对于需要历史趋势的数据如温度变化你可以用字符如#,*,-,|在固定区域内绘制一个简单的柱状图或折线图通过ANSI颜色区分不同数据集或阈值区域。4. 状态指示灯模拟在无法连接物理LED的远程终端场景你可以用彩色字符如●、■模拟指示灯。例如网络连接状态用绿色●表示正常红色●表示断开并通过光标控制让它在固定位置闪烁或变色。5. 与Web REPL结合CircuitPython支持Web REPL。在浏览器中访问Web REPL时ANSI转义序列通常也能被支持取决于浏览器和终端模拟器组件。这意味着你精心设计的彩色界面不仅能在串口终端看到还能通过网页远程访问这对于远程监控项目来说是个加分项。我个人在几个物联网传感器节点项目中大量使用了这个库。最深的体会是一点点色彩和结构化的输出对长期维护和调试的心理负担减轻是巨大的。当深夜调试满屏灰色的日志中突然跳出一行红色的错误信息时你能瞬间定位问题。这看似微不足道的改进实则是提升开发体验和项目可维护性的低成本高回报投资。开始给你的下一个CircuitPython项目加点“颜色”吧你会发现调试不再是苦差事而可以变得直观甚至有点乐趣。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2595506.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…