嵌入式条码扫描模块选型、集成与调试实战指南
1. 项目缘起为什么我们需要一个独立的条码扫描模块在嵌入式开发、自动化设备或者一些DIY项目中集成条码扫描功能是一个高频需求。你可能遇到过这样的场景需要为一台自助售卖机增加扫码支付后的商品核销功能或者为一个小型仓库管理系统添加快速盘点入库的入口。最直接的想法可能是找一台USB接口的桌面式扫描枪插上就用。这确实在PC环境下可行但在嵌入式Linux、单片机或者一些资源受限的工控环境中直接驱动一个复杂的USB HID设备扫描枪通常模拟键盘输入会带来额外的复杂性比如需要完整的USB Host协议栈、HID驱动解析还得处理焦点和输入法问题。这时一个独立的、提供简单串行通信接口的“Barcode Scanner Module”就成了更优雅的解决方案。这类模块通常内置了条码识别的核心算法、光学组件和主控芯片对外则提供一个干净的UART通用异步收发传输器或USB CDC通信设备类本质也是虚拟串口接口。开发者无需关心图像处理和解码逻辑只需通过串口发送简单的控制指令如触发扫描然后从串口接收解码后的纯文本字符串。这极大地降低了集成门槛将复杂的视觉识别问题简化为了一个简单的串口数据收发问题。我最近在一个智能工具柜的项目中就用了这么一个模块。柜子主控是STM32需要扫描工具上的资产条码。如果外挂一个完整的扫描枪STM32处理USB协议会非常吃力。而选用一个UART输出的扫描模块我只需要几根线TX, RX, GND, 可能再加一个VCC和触发引脚就能搞定代码层面就是配置一个串口监听数据接收简单又稳定。这促使我深入研究了一下这类模块的选型、使用和调试细节今天就把这些实战经验系统地分享出来。2. 模块核心剖析硬件接口与通信协议市面上的条码扫描模块形态各异但核心架构大同小异。理解其硬件接口和通信协议是成功集成的第一步。2.1 主流硬件接口USB CDC与UART的抉择当你拿到一个扫描模块背面通常会有一个微型USB接口或者一排引脚。这对应着两种主流的对外接口方式1. USB CDC虚拟串口这是目前非常主流的方式。模块内部使用一颗如CP2102、CH340、FT232之类的USB转UART桥接芯片或者主控MCU直接支持USB CDC协议。当模块通过USB线连接到电脑或支持USB Host的设备时它会被识别为一个“USB Serial Port (COMxx)”设备。优点对上位机如PC极其友好即插即用无需额外电平转换。供电也通常由USB口提供。缺点在嵌入式端如果你的主控如STM32、ESP32需要与之通信你仍然需要一个USB Host功能去对接它或者通过一个USB Host Shield之类的扩展板这增加了复杂性。对于模块与单片机直接对话的场景不如纯UART直接。2. 纯UARTTTL电平模块直接引出TX发送、RX接收、GND地和VCC电源常为3.3V或5V引脚。优点接口最简单、最通用。可以直接与任何带有UART的单片机、树莓派、Arduino等连接只需确保电平匹配通常是3.3V或5V TTL。通信逻辑完全自主可控。缺点连接到PC时需要额外的USB转TTL串口线如基于CH340、CP2102、PL2303芯片的线缆并且需要安装对应的驱动程序。如何选择如果你的主设备是PC、树莓派使用其USB口或高性能嵌入式Linux主板优先选择USB接口的模块使用最方便。如果你的主设备是单片机STM32、GD32、ESP系列等优先选择直接引出UART TTL引脚模块连接最直接电路最简洁。有些模块会同时提供两种接口通过跳线帽选择灵活性最高。2.2 通信协议指令集与数据格式扫描模块的通信协议通常非常简单遵循“请求-响应”或“自动上报”模式。这需要通过模块的数据手册或厂家提供的指令集文档来确认。1. 触发模式手动触发模块有一个物理触发按键或感应区按下后执行一次扫描。同时也可以通过向模块的特定引脚TRIG发送一个低电平脉冲或者通过串口发送一条触发指令如十六进制的0x7E 0x00 0x08 0x01 0xEF具体指令因厂家而异来远程触发扫描。自动感应触发模块持续检测条码是否进入景深范围自动进行扫描。这种模式常用于传送带等固定场景。2. 数据输出格式扫描成功后解码出的条码数据会通过串口发送出来。格式通常是纯文本但前后可能会添加特定的前缀或后缀以便于接收方识别一帧数据的开始和结束。简单文本模式直接输出如“6901234567890”这样的字符串以回车换行符(\r\n)结束。这是最常见、最易处理的方式。带协议头尾模式例如输出“STX6901234567890ETX”其中STX0x02为帧头ETX0x03为帧尾。这种方式在数据流中能更可靠地界定一帧数据。带校验和模式在数据后附加一个校验字节用于验证数据传输的正确性。3. 配置指令高级模块允许通过串口指令进行配置例如设置串口波特率9600, 115200等开关蜂鸣器扫描成功提示音开关瞄准灯LED指示光启用/禁用特定类型的条码如只扫QR码不扫Code 128设置输出数据的前缀/后缀配置通常需要进入“配置模式”发送一串进入指令然后发送参数设置指令最后保存并退出。务必在连接设备前查阅手册确认默认波特率否则可能无法通信。3. 实战连接与驱动安装打通通信链路理论清楚了我们开始动手连接。这里以最常见的两种场景为例连接PC进行测试以及连接STM32单片机进行集成。3.1 场景一连接PC进行功能测试与配置这是拿到新模块后的标准第一步目的是验证模块基本功能并可能进行初始配置如修改波特率以匹配你的主控。步骤1硬件连接如果模块是USB接口直接用USB线连接电脑即可。如果是UART TTL引脚你需要一根USB转TTL串口线。连接关系如下模块的VCC- 串口线的5V或3.3V务必确认模块工作电压接错可能烧毁模块的GND- 串口线的GND模块的TX- 串口线的RX模块的RX- 串口线的TX注意串口通信的原则是“交叉连接”即发送端(TX)接接收端(RX)。模块的TX要接到串口线的RX上模块的RX要接到串口线的TX上。步骤2安装USB转串口驱动这是新手最容易卡住的地方。插入USB设备模块或转接线后如果电脑无法识别出COM口就需要安装驱动。识别芯片型号查看你的模块或转接线上主控芯片的丝印常见的有CP2102(Silicon Labs)CH340(沁恒)FT232RL(FTDI)PL2303(Prolific)下载与安装CP2102: 去Silicon Labs官网下载最新的“CP210x Universal Windows Driver”。CH340: 去沁恒官网下载驱动安装时如果遇到“预安装成功”但设备管理器仍有叹号可能需要先禁用驱动程序强制签名Windows后再安装。FTDI: 去FTDI官网下载“FTDI CDM Drivers”。PL2303: 注意PL2303芯片有大量山寨版本且新版的Windows 10/11自带的驱动可能不兼容老芯片或山寨芯片。务必从Prolific官网下载最新驱动并确保芯片是真品否则会遇到代码10或19错误无法启动设备。验证安装成功后在Windows“设备管理器” - “端口 (COM和LPT)”下应该能看到类似“USB Serial Port (COM3)”的设备记住这个COM编号。步骤3使用串口调试助手进行测试打开任意一款串口调试助手如SSCOM、XCOM、AccessPort等。选择正确的COM端口号。设置波特率先尝试最常见的9600或115200具体需查模块手册、数据位(8)、停止位(1)、校验位(None)。打开串口。触发模块扫描一个条码按物理键或给触发引脚信号。在接收区应该能看到解码出的字符串。可选如果你需要发送配置指令在发送区输入十六进制或文本指令点击发送。3.2 场景二集成到STM32嵌入式系统假设我们有一个3.3V TTL UART接口的扫描模块需要连接到STM32F103C8T6蓝色药丸板。步骤1电路连接模块VCC- STM32板3.3V模块GND- STM32板GND模块TX- STM32PA3(USART2_RX) // 模块发送MCU接收模块RX- STM32PA2(USART2_TX) // MCU发送模块接收模块TRIG- STM32PA1(任意GPIO用于触发)步骤2STM32 CubeMX配置在Pinout Configuration标签页启用USART2。模式选择Asynchronous异步通信。参数设置波特率与模块一致如115200、字长8位、停止位1、无校验、无硬件流控。在NVIC Settings中使能USART2 global interrupt以便使用中断方式接收数据。配置PA1为GPIO_Output作为触发引脚。生成代码。步骤3关键代码实现在生成的工程中主要编写触发和接收解析逻辑。// 1. 触发扫描函数 void Barcode_TriggerScan(void) { HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_RESET); // 拉低触发引脚 HAL_Delay(50); // 保持低电平约50ms具体时间参考模块手册 HAL_GPIO_WritePin(TRIG_GPIO_Port, TRIG_Pin, GPIO_PIN_SET); // 释放 } // 2. 串口接收处理中断回调函数 // 定义接收缓冲区 uint8_t uart_rx_buf[256]; uint16_t uart_rx_index 0; void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART2) { uint8_t rx_byte uart_rx_buf[uart_rx_index]; // 假设已通过HAL_UART_Receive_IT单字节接收 // 判断帧结束这里以接收到换行符‘\n’为一帧结束常见 if(rx_byte \n) { uart_rx_buf[uart_rx_index] \0; // 添加字符串结束符 // 处理完整的一帧条码数据 ProcessBarcodeData((char*)uart_rx_buf); uart_rx_index 0; // 重置索引 } else { uart_rx_index; if(uart_rx_index sizeof(uart_rx_buf)) { uart_rx_index 0; // 防止溢出 } } // 重新启动单字节中断接收 HAL_UART_Receive_IT(huart2, uart_rx_buf[uart_rx_index], 1); } } // 3. 条码数据处理函数示例 void ProcessBarcodeData(char* data) { // 去除可能的回车符 char *p strchr(data, \r); if(p) *p \0; // 此时data里就是干净的条码字符串如“6901234567890” printf(Scanned Code: %s\r\n, data); // 可以进一步做校验、比对、存储等操作 }4. 深度调试与性能优化从“能用”到“好用”模块能扫出码只是第一步。在真实项目中稳定性、抗干扰性和效率至关重要。下面分享几个进阶的调试和优化点。4.1 通信稳定性保障超时管理与数据帧校验在嘈杂的工业环境或长线传输中串口数据可能会出错或中断。简单的“等待换行符”逻辑可能不够健壮。1. 实现超时接收机制如果一帧数据没接收完比如没收到结束符程序会一直等待导致卡死。我们需要一个超时定时器。启动接收时开启一个硬件定时器如设置10ms超时。每次收到一个字节重置定时器。如果在超时时间内没有收到新字节定时器中断触发认为一帧数据已经接收完毕即使没有标准的结束符立即处理当前缓冲区中的数据并清空。2. 添加软件校验如果模块输出不带校验我们可以在应用层添加简单校验。例如在发送触发指令前计算一个累加和或CRC模块执行后返回带校验的结果。对于接收到的条码数据如果协议简单可以计算其长度或进行简单的和校验发现异常则请求重扫。4.2 触发逻辑优化防抖与连扫抑制物理触发防抖如果使用GPIO电平触发必须加入防抖处理。模块的触发引脚可能对毛刺敏感。// 简单的软件防抖 if(HAL_GPIO_ReadPin(TRIG_SW_GPIO_Port, TRIG_SW_Pin) GPIO_PIN_RESET) { // 按键按下 HAL_Delay(20); // 延时20ms if(HAL_GPIO_ReadPin(TRIG_SW_GPIO_Port, TRIG_SW_Pin) GPIO_PIN_RESET) { // 确认按键稳定按下执行触发 Barcode_TriggerScan(); while(HAL_GPIO_ReadPin(TRIG_SW_GPIO_Port, TRIG_SW_Pin) GPIO_PIN_RESET); // 等待释放 } }连扫抑制在自动感应模式下或者用户快速连续触发时需要防止对同一个条码重复处理。可以在ProcessBarcodeData函数中加入判断如果新扫描到的条码与上一次相同且在短时间内如500ms则忽略此次扫描。4.3 资源管理与功耗考量对于电池供电的设备功耗是关键。控制瞄准灯和蜂鸣器如果不需要通过配置指令永久关闭模块的瞄准灯和蜂鸣器能节省不少电量。睡眠模式一些高级模块支持睡眠指令。在设备待机时发送指令让模块进入低功耗睡眠状态需要扫描时先通过一个GPIO唤醒模块如果有唤醒引脚或发送唤醒指令稍作延时后再触发扫描。DMA接收对于高速、大数据量的应用虽然条码数据量小但系统可能繁忙可以使用UART的DMA直接存储器访问模式来接收数据。这能解放CPU避免因中断处理不及时而丢失数据。在CubeMX中配置UART为DMA模式并设置循环缓冲区可以让数据接收在后台自动完成。4.4 常见问题排查清单当你遇到模块不工作的情况可以按以下清单排查问题现象可能原因排查步骤电脑完全无法识别COM口1. 驱动未安装或安装错误。2. USB线仅供电无数据。3. 设备硬件损坏。1. 检查设备管理器有无未知设备重新安装对应芯片驱动。2. 更换USB线或USB口。3. 用万用表测量模块供电电压是否正常。能识别COM口但串口助手无数据1. 波特率等参数设置错误。2. TX/RX线接反。3. 模块未正确供电或未启动。4. 模块处于配置模式或休眠。1. 逐一尝试常见波特率(9600, 19200, 38400, 57600, 115200)。2. 交换TX和RX连接线。3. 确认VCC电压测量模块工作电流。4. 尝试发送“恢复出厂设置”指令参考手册。数据乱码1. 波特率不匹配最常见。2. 数据位、停止位、校验位设置错误。1. 确认与模块手册的波特率绝对一致。2. 检查串口助手和代码中的通信参数是否均为8N18数据位无校验1停止位。扫描无反应不读码1. 镜头有保护膜未撕。2. 条码类型未启用。3. 距离、角度、光线不合适。4. 条码质量太差。1. 撕掉光学镜头的保护膜。2. 用配置工具或指令启用所有常见码制。3. 在合适的距离景深范围内、正对条码、光线均匀处测试。4. 打印一个标准的高质量Code 128或QR码测试图。单片机连接后工作不稳定1. 共地问题。2. 电源功率不足。3. 电平不匹配5V模块接3.3V MCU。4. 代码中串口中断优先级过低被阻塞。1. 确保单片机、模块、电源地线可靠连接。2. 扫描时测量电源电压是否被拉低可尝试单独供电或加大电容。3. 确认双方是3.3V TTL电平否则需加电平转换电路。4. 提高串口接收中断的NVIC优先级。5. 项目集成案例智能工具柜扫码管理子系统最后以一个简化版的智能工具柜项目为例展示如何将扫描模块融入一个完整的系统逻辑中。该系统通过扫描员工卡和工具条码记录借还信息。系统组件主控STM32F407显示OLED屏幕 (I2C接口)输入矩阵键盘存储SPI Flash条码扫描模块UART TTL接口默认波特率115200输出带\r\n结尾。通信4G模块 (用于数据上报)软件流程设计待机界面OLED显示“请扫描工卡”。工卡扫描员工扫描工卡工卡上是一维码或二维码内容为员工ID。串口中断收到数据ProcessBarcodeData函数被调用。函数校验数据格式并在Flash中查询该ID是否有效。有效则OLED切换为“欢迎[员工名]”状态机进入“等待扫描工具”状态无效则显示“工卡无效”并返回待机。工具扫描与逻辑处理员工扫描工具上的资产条码。再次进入ProcessBarcodeData。根据当前状态“等待扫描工具”和工具条码查询该工具的库存状态。如果工具在库记录“借出”事件员工ID工具ID时间戳更新库存状态为“已借出”显示“借出成功”并通过4G模块上报服务器。状态机可返回“等待扫描工具”继续借或超时返回待机。如果工具已借出核对借出人是否为当前员工。如果是记录“归还”事件更新状态为“在库”显示“归还成功”并上报。如果不是则提示“工具归属错误”。超时与复位任何一个步骤如果长时间无操作如30秒状态机自动复位回“待机界面”。在这个案例中条码扫描模块完美地扮演了“信息输入传感器”的角色。它的稳定、快速和准确是整个系统流畅运行的基础。通过UART接口数据流被清晰地整合到主控的状态机逻辑中与键盘输入、屏幕显示、网络上报等其他功能模块解耦代码结构清晰易于维护和调试。选择和使用一个条码扫描模块远不止是“通电-扫码”那么简单。从接口选型、驱动安装、协议理解到嵌入式集成、稳定性调试和系统整合每一步都有值得注意的细节。希望这篇从实战中总结出来的经验能帮助你在下次项目中更从容地让这个小小的“电子眼”为你的设备注入精准的识别能力。

相关新闻

从手指出错率43.7%到98.2%准确率:一位电商设计师的SD手部修复实战复盘(含Prompt工程避坑清单)

从手指出错率43.7%到98.2%准确率:一位电商设计师的SD手部修复实战复盘(含Prompt工程避坑清单)

更多请点击: https://intelliparadigm.com 第一章:从手指出错率43.7%到98.2%准确率:一场电商视觉生产力的重构 在传统电商商品审核流程中,人工指认 SKU 图像标签的平均错误率高达 43.7%,主要源于疲劳作业、类目混淆与…

2026/10/13 10:49:36 阅读更多 →
DevExpress WPF Pivot Grid组件,可轻松实现多维数据分析!(二)

DevExpress WPF Pivot Grid组件,可轻松实现多维数据分析!(二)

在上文中我们主要为大家介绍了DevExpress WPF Pivot Grid组件的超快速枢轴分析功能、Microsoft分析服务等,本文将继续介绍图表透视数据的处理、MVVM支持等。欢迎持续关注我们,探索更多新功能哦~P.S:​​​​​​​DevExpress WPF拥有120个控件…

2026/10/13 10:43:53 阅读更多 →
「Qt中文教程指南」如何创建基于Qt Widget的应用程序(三)

「Qt中文教程指南」如何创建基于Qt Widget的应用程序(三)

Qt是目前最先进、最完整的跨平台C开发工具。它不仅完全实现了一次编写,所有平台无差别运行,更提供了几乎所有开发过程中需要用到的工具。如今,Qt已被运用于超过70个行业、数千家企业,支持数百万设备及应用。 本文描述了如何使用Q…

2026/10/11 3:37:38 阅读更多 →

最新新闻

GRP-U8行政事业版数据库部署与运维:从选型到备份恢复的实战指南

GRP-U8行政事业版数据库部署与运维:从选型到备份恢复的实战指南

简介:无论是日常余额核对、凭证追溯,还是年末结转时清理数据,面对GRP-U8行政事业版庞大的数据库常常让人无从下手。这份资料面向用友GRP-U8财务软件的运维实施与行政事业单位信息化人员,集中梳理出真正核心的四张业务表——GL_Yeb…

2026/10/13 22:59:15 阅读更多 →
Servlet从原理到实战:吃透Java Web底层核心机制

Servlet从原理到实战:吃透Java Web底层核心机制

Servlet 这门技术,放在十年前是 Java Web 开发者的必修课,放在今天看,很多刚接触 Spring Boot 的同学可能只在依赖清单里见过它,甚至有人觉得它已经过时了。但实际上去掉 Spring 的外壳,真正在底层处理 HTTP 请求、管理…

2026/10/13 22:59:15 阅读更多 →
ThinkPHP新闻发布系统开发实战:从路由到后台管理全流程

ThinkPHP新闻发布系统开发实战:从路由到后台管理全流程

简介:ThinkPHP新闻发布系统是一份面向PHP初学者和Web开发入门者的完整前后台项目源码,覆盖前台文章展示、后台分类与文章管理,并集成百度UEditor富文本编辑器,旨在通过一个真实项目帮助理解MVC分层、ActiveRecord数据库操作、路由…

2026/10/13 22:59:15 阅读更多 →
Servlet核心机制与生命周期详解:从HTTP请求到Java方法的完整链路

Servlet核心机制与生命周期详解:从HTTP请求到Java方法的完整链路

Servlet这东西,说起来有点“老”,但如果你想搞明白Java Web到底是怎么跑起来的,它还真躲不开。我带团队和面试新人的时候发现一个现象:不少人上来就学Spring Boot,写接口已经非常熟练,但你把问题往回问一层…

2026/10/13 22:59:15 阅读更多 →
Java NIO Channel深度解析:从BIO痛点、Buffer机制到非阻塞实战

Java NIO Channel深度解析:从BIO痛点、Buffer机制到非阻塞实战

1. 从BIO的痛点到Channel的设计动机很多同学学NIO的时候,一上来就啃Selector、ByteBuffer、Channel这三大件,结果学完一圈还是不知道Channel到底解决了什么问题。我刚开始接触NIO那会儿也是这样,API背得滚瓜烂熟,真到写网络服务的…

2026/10/13 22:59:15 阅读更多 →
ACM竞赛中STL sort的cmp函数设计原理与避坑指南

ACM竞赛中STL sort的cmp函数设计原理与避坑指南

1. 为什么排序不是“写个for循环就完事”的事?刚接触ACM竞赛的新人,十有八九都经历过这个阶段:看到一道题说“把数组从小到大排好”,立刻撸起袖子写个冒泡——三重嵌套,i、j、k变量齐飞,跑样例能过&#xf…

2026/10/13 22:58:14 阅读更多 →

日新闻

物联网系统集成避坑指南:从选型到验收的关键要点

物联网系统集成避坑指南:从选型到验收的关键要点

做了这么多年物联网系统集成的项目,我最大的感受是,大部分坑不是出在技术前沿,而是出在一些看起来很平常的地方。设备选了便宜的、协议没问清楚、现场没摸透、验收标准写得含糊——这些细枝末节,最后都会变成延期、超支和扯皮的大…

2026/10/13 0:00:57 阅读更多 →
ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

ESP32舵机控制全攻略:从PWM原理到高级玩法与常见故障排查

如果你玩ESP32有一阵子了,很难不碰到舵机控制这道坎。做智能小车要转方向,做机械臂要抬关节,做云台要偏航俯仰,背后都是同一个东西在干活:舵机。而我见过太多人卡在“代码能编译、舵机就是不听话”这个阶段&#xff0c…

2026/10/13 0:00:57 阅读更多 →
CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

CAN总线原理与STM32实战:抗干扰、仲裁、错误处理全解析

1. 为什么CAN总线至今仍是工业现场的“硬通货”?——从汽车底盘到智能温室的真实需求你有没有拆过一辆老款燃油车的中控台?或者调试过某高校实验室里那台跑着Modbus协议却频频丢帧的PLC控制柜?又或者,在某个农业物联网项目里&…

2026/10/13 0:00:57 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/13 2:54:56 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/13 16:22:04 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/13 1:58:08 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 22:01:27 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/13 14:57:39 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 18:11:17 阅读更多 →