CircuitPython硬件交互实战:引脚命名、模块管理与内存优化

news2026/5/17 5:08:33
1. 项目概述CircuitPython硬件交互的基石如果你刚开始接触CircuitPython或者从Arduino转过来可能会对如何控制板子上的某个引脚感到困惑。板子上明明印着“A0”、“D13”但在代码里到底该怎么写board.A0和microcontroller.pin.PA02又是什么关系更让人头疼的是为什么别人的代码里能import某个库而你的板子却报错说找不到模块这些问题看似琐碎却直接关系到项目能否跑起来。今天我们就来彻底拆解CircuitPython中硬件交互的两大基石引脚命名与模块管理。这不是一份照本宣科的API文档而是我结合多年踩坑经验为你梳理出的实战指南。我们会从物理引脚一路聊到代码抽象再深入到内存管理和无线连接这些“高级”话题背后的原理让你不仅知道怎么写更明白为什么这么写以及出了问题该怎么解决。2. 引脚命名机制从物理焊盘到代码对象硬件编程的第一步就是告诉程序“我要操作那个引脚”。在CircuitPython里这个过程被设计得非常直观但背后有多层抽象。2.1 物理板载标签与board模块别名拿起任何一块支持CircuitPython的开发板比如Adafruit的QT Py SAMD21你都能在引脚旁边看到丝印标签例如“A0”、“D13”、“SCL”、“SDA”。这些标签是为了方便人类识别。在CircuitPython中board模块提供了与这些物理标签对应的、易于记忆的Python对象。如何查询所有引脚别名最直接的方法是在串行REPL交互式解释器中操作。连接板子打开串行终端如Mu编辑器、PuTTY或screen/tio进入REPL模式输入以下命令import board dir(board)你会看到一个列表里面包含了这块板子上所有可用的“引脚”名称。注意这里的“引脚”是广义的它不仅包括物理GPIO还包括一些特殊的、代表板载硬件的对象。以QT Py SAMD21为例执行dir(board)后你可能会看到类似这样的输出节选[A0, A1, A2, A3, D0, D1, D2, D3, D4, SCK, MOSI, MISO, NEOPIXEL, NEOPIXEL_POWER, RX, TX, SDA, SCL, ...]关键解读board.A0与board.D0你可能会发现A0和D0同时存在。查看板子第一个引脚通常只标有“A0”。但在CircuitPython中这个物理引脚被赋予了多个别名。board.A0强调其模拟输入功能board.D0则强调其数字IO功能。它们指向的是同一个物理引脚。这种设计提供了灵活性你可以根据引脚在项目中的主要用途来选择最贴切的名称。特殊“引脚”board.NEOPIXEL与board.NEOPIXEL_POWER这两个名称在物理板子上是找不到对应焊盘的。它们代表板载的NeoPixel RGB LED及其电源控制。board.NEOPIXEL用于控制LED颜色board.NEOPIXEL_POWER则是一个数字输出引脚用于打开或关闭LED的电源高电平开启低电平关闭。这对于电池供电项目中的功耗管理非常有用。其他板子可能有board.LED单色用户LED、board.BUTTON等。实操心得当你拿到一块新板子第一件事就是用dir(board)快速浏览所有可用的硬件资源。这比查阅PDF原理图更快而且能直接看到CircuitPython环境下的具体名称避免写代码时名称错误。2.2 微控制器底层引脚名microcontroller.pin模块board模块的名称是“板级抽象”它屏蔽了底层芯片的差异。但有时你需要知道确切的芯片引脚例如查阅芯片数据手册进行深度调试或者某些高级库需要直接操作底层引脚编号。这时就需要microcontroller.pin模块。它提供了对微控制器原始引脚名称的访问。这些名称通常是“PA02”、“PB08”、“GPIO5”这样的格式。查询方法在REPL中输入import microcontroller.pin dir(microcontroller.pin)或者更常用的方法是查看board模块中每个引脚对象的.id属性import board print(board.A0) print(board.A0.id)输出可能类似于Pin board.A0 PA02这里PA02就是SAMD21微控制器上该引脚的端口引脚编号Port A, Pin 2。board别名与microcontroller.pin的映射关系你可以通过一个简单的脚本来打印所有映射import board import microcontroller.pin for pin_name in dir(board): pin_obj getattr(board, pin_name) # 过滤掉非引脚对象如字符串常量 if hasattr(pin_obj, ‘id’): print(f“board.{pin_name:20} - {pin_obj.id}”)为什么需要了解底层引脚核对数据手册当设计外围电路需要确认引脚的复用功能如ADC、PWM、外设中断时必须对照芯片数据手册而手册使用的是PA02这类名称。解决冲突极少数情况下两个board别名可能意外映射到同一个底层引脚通常是板子设计或固件bug导致功能冲突。通过检查.id可以确认。高级应用某些极致的优化或非标准操作可能需要直接操作底层寄存器这时必须知道确切的引脚编号。注意事项在99%的日常开发中你只需要使用board模块的别名。这保证了代码在不同Adafruit CircuitPython板卡之间具有最好的可移植性。只有在你需要深入底层或者使用的第三方板子board定义不完善时才需要考虑microcontroller.pin。3. 内置模块管理与查询CircuitPython固件本身内置了一系列核心模块它们是硬件交互的“标准库”。但受限于微控制器的Flash和RAM大小并非所有模块在所有板子上都可用。3.1 核心内置模块有哪些内置模块主要分为两大类硬件抽象与驱动这是与硬件打交道的核心。board如前所述提供板载引脚和硬件的别名。microcontroller提供对芯片底层功能的访问如引脚、CPU频率、温度传感器如果支持。digitalio数字输入输出控制这是最常用的模块之一用于读写高低电平、控制LED、读取按钮。analogio模拟输入输出ADC/DAC。pulseio/pwmio脉冲宽度调制PWM用于控制舵机、LED亮度等。busio硬件通信协议I2C, SPI, UART。touchio电容触摸感应。neopixel/dotstar驱动对应类型的可寻址RGB LED。audiocore,audioio,audiomixer音频播放相关取决于硬件支持。displayio驱动显示屏的核心模块对于带显示器的板子。Python标准库子集与系统功能time时间相关函数如延时(sleep)、获取运行时间(monotonic)。gc垃圾回收控制可用于查看和回收内存。os操作系统接口提供文件系统访问os.listdir(‘/’)、环境信息等。storage管理文件系统的挂载/卸载常用于让电脑识别为U盘。supervisor提供运行时控制如重启、设置状态栏等。3.2 如何查询当前板子可用的模块有两种可靠的方法方法一使用REPL的help(“modules”)命令这是最直接、最准确的方法因为它反映的是你当前板载固件的实际状况。连接板子到电脑打开串行终端。进入REPL通常按CtrlC中断任何运行中的程序或直接打开。输入help(“modules”)并回车。 终端会列出所有当前可导入的模块名称。这个列表包括了内置模块和你复制到板子/lib目录下的外部库。方法二查阅官方支持矩阵Adafruit维护了一个在线 CircuitPython模块支持矩阵 。你可以根据芯片型号如SAMD21, nRF52840, ESP32-S3来查找该芯片系列通常支持哪些模块。这对于选型或在编写跨平台代码时了解功能边界非常有用。常见问题排查如果你在代码中import某个模块时收到ImportError: no module named ‘xxx’错误首先用help(“modules”)确认该模块是否存在。如果不存在可能有以下原因1) 该模块不被你的板子支持芯片资源不足或驱动未实现2) 你需要安装外部库对于非内置模块如传感器驱动adafruit_bme280。3.3 模块不可用时的应对策略当你发现想要的模块不在列表中时可以按以下思路解决确认硬件支持例如audiobusio模块需要芯片有I2S硬件外设很多低端MCU没有。wifi/_bleio模块需要芯片有对应的无线硬件ESP32系列内置WiFi/BLEnRF52系列内置BLESAMD51等需要通过AirLift协处理器外接。考虑替代方案软件模拟对于简单的协议如单线NeoPixel虽然neopixel模块是硬件优化的但极端情况下可用bitbangio如果可用或纯时序循环模拟不推荐易出错。使用外部库很多功能由社区库提供。例如复杂的图形处理可能需要adafruit_bitmap_font,adafruit_display_text等。升级固件有时新版本的CircuitPython会为旧板子增加模块支持。去 circuitpython.org 检查是否有更新。更换硬件如果项目核心功能依赖某个模块如必须使用WiFi而当前板子不支持最根本的解决方案是更换为具有相应硬件的板子如ESP32-S3、nRF52840等。4. 内存管理深度解析与优化实战微控制器资源紧张内存管理是CircuitPython开发中的核心挑战。理解内存如何工作能帮你写出更健壮、更高效的程序。4.1 内存架构与MemoryError根源典型的CircuitPython板子如SAMD21 M0可能只有32KB RAM。这部分RAM需要同时存放CircuitPython解释器运行时本身就需要占用一部分。字节码与常量你编写的.py文件或.mpy文件被编译后的代码对象。堆内存动态分配的对象如创建的列表、字典、字符串、类实例等。栈内存函数调用时的局部变量、返回地址等。当你看到MemoryError时根本原因是堆内存无法满足新的分配请求。这通常发生在导入过多或过大的库每个import语句都会将模块代码加载到内存。创建大型数据结构例如一个包含几千个元素的列表或者一个高分辨率位图缓冲区。内存碎片频繁创建和销毁不同大小的对象会导致堆中产生许多小的空闲碎片虽然总空闲内存可能够但找不到一块连续的空间满足当前分配。4.2 实战内存优化技巧以下技巧来自实际项目中的经验总结按推荐优先级排序1. 使用.mpy格式的库文件这是最有效的手段。.mpy是CircuitPython的预编译字节码格式相比原始的.py文件加载更快解释器无需解析Python语法。占用内存更少移除了注释、空白符等无关内容且字节码更紧凑。如何操作从 CircuitPython库包 下载的库中优先选择/lib文件夹下的.mpy文件而不是.py文件。将它们复制到板子的/lib目录即可。2. 优化导入顺序导入顺序确实会影响内存碎片。一个经验法则是先导入大库或核心库再导入小库或项目文件。# 较好的顺序先大后小先框架后具体 import displayio # 较大的核心图形库 import adafruit_imageload # 较大的图像处理库 import board import time from adafruit_display_text import label # 相对较小的特定功能库 import my_small_helper # 自己的小模块原理是让大块内存分配发生在堆的早期减少后期大对象分配时因碎片导致失败的概率。3. 将项目主代码编译为.mpy如果你的code.py或主逻辑文件很大可以将其编译为.mpy以节省内存。但这意味着你将无法在板子上直接编辑这个文件。工具使用mpy-cross工具。它支持Windows、macOS、Linux。步骤# 假设你已下载mpy-cross并放在系统路径或在当前目录 mpy-cross your_code.py这会产生一个your_code.mpy文件。将其重命名为code.mpy并复制到板子根目录CircuitPython会自动执行它优先级高于code.py。4. 主动管理对象生命周期与垃圾回收及时删除大对象对于临时使用的大型缓冲区如图像数据使用完后立即用del关键字删除并手动触发垃圾回收。large_buffer bytearray(10000) # ... 使用 buffer ... del large_buffer # 删除引用 import gc gc.collect() # 建议立即回收但非必须GC会自动运行重用对象避免在循环中反复创建相同类型的对象。例如在动画循环中尽量复用同一个displayio.Group或label.Label对象只更新其内容。使用gc.mem_free()监控在开发阶段在关键位置打印空闲内存有助于定位内存泄漏点。import gc print(“Free memory:”, gc.mem_free())5. 代码层面的精简缩短变量名和注释在最终部署版本中可以适当缩短内部变量名。虽然效果微乎其微但积少成多。注意这会影响代码可读性建议仅作为最后手段并保留一份可读的源码。将函数移到库中如果code.py非常长可以考虑将一些功能函数提取到单独的.py文件中将其编译为.mpy后作为库导入。这有助于组织代码也可能改善内存布局。4.3 内存问题排查流程当遇到MemoryError或程序行为异常时建议按以下步骤排查硬重启板子排除因长时间运行导致的内存碎片积累问题。检查库格式确认/lib目录下使用的是.mpy文件。最小化复现创建一个新的code.py只包含最核心的、导致错误的代码。逐步添加功能直到错误再次出现从而定位问题模块或代码段。监控内存变化在代码开头、每个主要功能块后打印gc.mem_free()观察内存在哪里被大量消耗。查阅板子规格了解你的板子具体有多少RAM。SAMD21通常16-32KBSAMD51为192-256KBnRF52840为256KBESP32-S3为512KB。对可用内存量有一个基本预期。5. 无线连接WiFi与BLE的实现与选型无线功能极大地扩展了微控制器的应用场景。CircuitPython对无线连接的支持因芯片平台而异选择正确的硬件和软件方案是成功的关键。5.1 WiFi连接方案方案A原生ESP32系列推荐ESP32、ESP32-S2、ESP32-S3等芯片原生集成了WiFi和蓝牙。在CircuitPython中使用wifi和socketpool模块可以非常方便地连接网络。优点集成度高性能好支持Station和AP模式库维护活跃。缺点ESP32系列芯片的模拟输入ADC精度通常不如专精模拟的SAMD系列。典型代码框架import wifi import socketpool import ssl import adafruit_requests # 1. 连接WiFi wifi.radio.connect(“your_ssid”, “your_password”) print(“Connected to”, wifi.radio.ipv4_address) # 2. 创建网络会话 pool socketpool.SocketPool(wifi.radio) requests adafruit_requests.Session(pool, ssl.create_default_context()) # 3. 发起HTTP请求 response requests.get(“https://httpbin.org/get”) print(response.text)方案BAirLift协处理器用于无WiFi的板子如果你的主控是SAMD21、SAMD51、nRF52840等没有WiFi的芯片可以通过SPI接口连接一个AirLift模块基于ESP32将其作为WiFi协处理器。优点可以在你喜欢的任何主控板上添加WiFi功能。缺点需要额外的硬件、连接线和电源考虑。需要安装adafruit_esp32spi库。配置稍复杂且占用主控的SPI引脚和至少4个GPIOCS, Ready, Reset。硬件要求主控板必须有SPI接口和足够的空闲GPIO。库adafruit_esp32spi注意事项像MacroPad、NeoTrellis这类引脚极其有限的板子可能没有足够的空闲引脚来连接AirLift因此在项目规划初期就需要确认硬件可行性。5.2 蓝牙低功耗BLE连接方案方案A原生支持BLE的芯片nRF52840/nRF52833CircuitPython对BLE支持最完善的平台。支持中央和外设模式支持配对和绑定。ESP32/ESP32-C3/ESP32-S3 (8MB Flash)从CircuitPython 9.1.0开始提供较完整的BLE支持。注意ESP32-S2没有蓝牙功能。4MB Flash的ESP32由于Flash空间限制CircuitPython 9中可能未包含_bleio模块。需要查看官方支持矩阵或等待CircuitPython 10。核心模块_bleio注意前面的下划线表示这是底层实现模块。方案B通过AirLift/NINA协处理器对于没有原生BLE的主控如SAMD51可以通过SPI连接AirLift或NINA-W102模块来实现BLE外设功能。能力目前主要支持外设模式Peripheral即你的板子作为设备被手机等中央设备连接和发现。扫描和作为中央设备连接的功能尚未完全实现。库adafruit_bleBLE开发核心概念与步骤以nRF52840外设模式为例广播设备向外宣告自己的存在和基础信息。import _bleio from adafruit_ble import BLERadio from adafruit_ble.advertising.standard import ProvideServicesAdvertisement from adafruit_ble.services.nordic import UARTService ble BLERadio() uart UARTService() advertisement ProvideServicesAdvertisement(uart) advertisement.short_name “MyDevice” ble.start_advertising(advertisement)定义服务与特征BLE设备的功能以“服务”和“特征”的形式组织。UARTService是一个预定义的服务模拟串口通信。你也可以自定义服务。连接与数据交换中央设备如手机App扫描并连接后双方可以通过特征值进行读写和通知。实操心得BLE开发比WiFi更复杂涉及状态机广播、连接、断开。务必在代码中妥善处理连接断开事件ble.connected属性变化并做好重连或重新广播的逻辑。手机端推荐使用Adafruit的Bluefruit LE ConnectApp进行初步测试它可以方便地连接设备、进行UART通信、控制GPIO等。5.3 其他无线通信方式对于更长距离或点对点通信可以考虑RFM69/RFM9x LoRa模块通过adafruit_rfm69或adafruit_rfm9x库支持。通信距离可达数百米至数公里但速率较低。适合传感器网络、远程遥控等场景。注意早期的RFM SAMD21 M0板子如Adafruit Feather M0 with RFM69虽然能运行CircuitPython但Flash和RAM非常紧张开发体验不佳。建议使用功能更强的板子如Feather M4 Express搭配RFM breakout板或Wing。6. 数值处理、异步与中断的工程实践6.1 浮点数与长整数支持浮点数所有CircuitPython板子都支持浮点运算。即使底层硬件没有浮点运算单元FPUCircuitPython也会通过软件库实现。精度约为30位22位尾数8位指数提供大约5-6位有效十进制数字。对于大多数传感器数据处理如温度换算、比例计算足够用。但对于需要高精度科学计算或金融计算的场景请考虑使用定点数或缩放整数运算。长整数任意大小整数大多数板子支持Python标准的任意精度整数。例外情况主要出现在Flash空间最小的SAMD21M0板子上例如Adafruit Gemma M0Adafruit Trinket M0Adafruit QT Py M0Adafruit Trinkey系列 以及一些第三方的小型STM32板子。 在这些不支持长整数的板子上整数被限制在31位约±10亿。一些时间函数如time.localtime(),time.mktime(),time.time(),time.monotonic_ns()依赖于长整数支持因此在上述板子上不可用。开发建议如果你的项目需要处理超大整数如精确时间戳、加密算法请避免使用上述资源受限的板子。选择SAMD51、nRF52840或ESP32系列。6.2 异步编程asyncio与“中断”的替代方案CircuitPython不支持硬件中断。这是一个重要的设计区别。在Arduino或MicroPython中你可以为一个引脚设置中断服务程序ISR当引脚状态变化时CPU会立即跳转执行ISR。CircuitPython为了保持代码的确定性和简化内存模型没有提供此功能。替代方案使用asyncio进行协作式多任务从CircuitPython 7.1.0开始除了最小的SAMD21构建引入了asyncio库。这是一种“协作式多任务”你的代码需要主动“让出”控制权而不是被硬件中断抢占。核心模式import asyncio import board import digitalio led digitalio.DigitalInOut(board.LED) led.direction digitalio.Direction.OUTPUT button digitalio.DigitalInOut(board.BUTTON) button.direction digitalio.Direction.INPUT button.pull digitalio.Pull.UP # 假设按钮按下为低电平 async def blink_led(): while True: led.value not led.value await asyncio.sleep(0.5) # 关键await让出控制权 async def read_button(): last_state button.value while True: current_state button.value if current_state ! last_state: print(“Button pressed!” if not current_state else “Button released!”) last_state current_state await asyncio.sleep(0.01) # 频繁检查但每次都会让出控制权 async def main(): # 创建任务并并发运行 led_task asyncio.create_task(blink_led()) button_task asyncio.create_task(read_button()) await asyncio.gather(led_task, button_task) # 等待所有任务实际上永不结束 asyncio.run(main())asyncio的优势与注意事项优势可以轻松管理多个并发的、周期性的或事件驱动的任务如闪烁LED、轮询按钮、读取传感器、处理网络请求而无需复杂的状态机或阻塞式延时。关键任何可能耗时的操作尤其是await asyncio.sleep()都是任务切换点。如果一个任务从不await它将独占CPU。不是真正的并行所有任务都在同一个线程中运行。如果一个任务执行一个非常耗时的计算如复杂的循环而不sleep其他任务就会被阻塞。因此需要将长任务拆分成小块并在中间插入await asyncio.sleep(0)来主动让出控制权。处理“即时”响应对于需要快速响应的输入如旋转编码器你需要在一个任务中使用很短的sleep间隔如0.001秒进行高频轮询。虽然不如中断及时但对于许多应用已足够。经验总结放弃中断思维拥抱asyncio。它将事件循环的管理标准化使代码结构更清晰。对于绝大多数用户交互和传感器轮询应用asyncio是完美且推荐的解决方案。只有在要求极低延迟、微秒级响应的场景下如精确捕获脉冲宽度你才需要考虑是否必须换用其他支持中断的编程环境如Arduino。7. 状态LED解读与高级调试技巧大多数CircuitPython板子都有一个彩色的NeoPixel或DotStar LED作为状态指示灯。它的颜色变化传达了板子的运行状态是重要的调试信息源。常见状态灯含义启动/上电通常为绿色闪烁然后稳定。引导加载程序模式当双击复位按钮时常亮为绿色等待拖放.uf2文件。运行用户代码通常为蓝色但你的程序可以重新控制它改变其颜色。Python运行时错误黄色闪烁。这是最常见的错误指示。此时应立刻连接串行终端查看具体的错误信息Traceback。堆栈溢出等严重错误快速闪烁的红色。安全模式当code.py等主要文件有语法错误导致无法启动时洋红色/粉色。此时CircuitPython会尝试跳过有问题的文件。如何利用状态灯调试看到黄灯闪烁不要慌这是朋友。它告诉你程序出错了。立即打开串行控制台REPL你会看到详细的错误信息包括出错的文件和行号。程序启动后无反应灯也不对检查是否是安全模式粉色灯。检查你的code.py、boot.py或settings.toml文件是否有语法错误。自定义状态灯你完全可以在程序中import neopixel或dotstar然后重新初始化并控制这个LED用它来指示你自己的程序状态如连接成功、数据接收、错误代码等。但请注意这可能会覆盖系统的错误指示。高级调试使用supervisor和tracebacksupervisor.runtime.serial_connected判断是否连接了串行终端可用于决定是否打印详细调试信息以节省资源。traceback模块当捕获异常时可以格式化并输出异常信息甚至将其保存到文件中。import traceback try: # 你的主要代码 risky_operation() except Exception as e: # 将错误信息打印到串口 traceback.print_exception(e) # 或者将错误信息写入文件 with open(“/error.log”, “a”) as f: traceback.print_exception(e, filef) # 然后让LED闪烁红色指示错误 indicate_error()通过系统状态灯和自定义的日志、错误捕获机制你可以构建一个相对健壮的调试环境即使设备在野外运行也能通过LED的闪烁模式初步判断问题所在。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2620515.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;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…