STM32串口通信全解析:从TTL电平到USB转串口模块实战
1. 项目概述从电平到协议串口通信的“翻译官”体系搞嵌入式开发尤其是玩STM32这类MCU的串口通信绝对是绕不开的“基本功”。但很多新手朋友包括我当年都卡在了一个看似简单却充满迷惑的环节为什么我的STM32程序明明在发数据电脑上却收不到为什么需要那个小小的USB转TTL模块TTL和RS-232又是什么关系今天我就以一个踩过无数坑的“老电工”身份把这套从芯片引脚到电脑屏幕的“翻译官”体系彻底讲透。这不仅仅是连接几根线的问题而是理解不同设备间如何“说同一种语言”的关键。无论你是想调试程序、上传固件还是实现单片机与上位机的数据交换搞懂这套原理能让你在项目开发中少走80%的弯路。简单来说STM32的串口UART发出的是TTL电平信号而我们的台式电脑或笔记本电脑其传统的串行接口COM口即RS-232标准使用的是截然不同的电平逻辑和物理接口。更别提现在的新电脑连那个九针的COM口都找不到了只剩下USB口。所以我们需要一个“翻译官”和“桥梁”——这就是USB/TTL转RS-232模块常被简称为USB转串口模块所扮演的角色。它要完成三重转换USB协议到串行数据流的转换、TTL电平到RS-232电平的转换以及物理接口的适配。接下来我们就一层层剥开它的工作原理。2. 串口通信基础异步串行通信的核心三要素在深入“翻译官”内部之前我们必须先统一“语言”本身也就是串口通信协议。UART通用异步收发传输器是一种非常古老但极其顽强的通信协议其核心思想简单而高效在不使用时钟线的情况下通过事先约定好的规则逐位bit传输数据。2.1 数据帧格式通信的“信封”你可以把每一次串口数据传输想象成寄一封信。数据帧就是这个“信封”它有固定的格式确保收发双方能正确解读内容。一个最常用的8-N-1帧格式包括起始位Start Bit总是1个逻辑低电平0。它就像敲门声告诉接收方“注意一帧数据要开始了”接收端检测到这个从空闲高电平1到低电平0的下降沿就开始同步计时。数据位Data Bits紧接着起始位之后是要传输的实际数据通常是5到9位最常用的是8位一个字节。数据位是从最低有效位LSB开始发送的。校验位Parity Bit可选位用于简单的错误检测。比如偶校验就是让数据位校验位中“1”的个数为偶数。如果接收方计算发现不符就知道传输可能出错了。在要求不高的场合为了简单常设置为“无校验”None。停止位Stop Bit1个、1.5个或2个逻辑高电平1。它标志着一帧数据的结束并确保线路恢复到空闲高电平状态为下一帧的起始位下降沿做好准备。注意起始位是固定的低电平停止位是固定的高电平。这个“低-高”的跳变是帧结构的基石。所有时序都基于这个约定。2.2 波特率通信的“语速”波特率Baud Rate定义了每秒传输的符号symbol数。在串口通信中一个符号就是一个比特bit所以波特率直接等于比特率bps bits per second。常见的波特率有9600 19200 115200等。为什么波特率必须一致这是异步通信的生命线。因为没有独立的时钟线收发双方全靠各自内部的高精度时钟按照约定的波特率去“数时间”来判断每一位数据的长度。假设波特率是9600那么每一位的持续时间就是1/9600 ≈ 104.2微秒。发送方按这个时间间隔发出每一位接收方也按这个时间间隔去采样读取。如果双方波特率设置不同比如发送用115200接收用9600那么接收方会以为每一位数据持续的时间更长采样到的将是一堆乱码。我遇到过最隐蔽的坑是代码里波特率设置对了但系统时钟HCLK配置错误导致定时器基准频率不对实际产生的波特率有偏差在低波特率时勉强能通一上到115200就通信失败。2.3 电平标准信号的“方言”这是造成混淆的重灾区。UART协议只定义了逻辑“1”和“0”但用什么电压来表示“1”和“0”就是电平标准。TTL电平这是单片机、CPU等数字芯片世界的“方言”。逻辑高电平“1”通常为3.3V或5V取决于芯片供电电压STM32F1常用3.3V51单片机常用5V。逻辑低电平“0”0V。特点电压低传输距离短一般不超过1米抗干扰能力较弱但电路简单直接与芯片引脚相连。RS-232电平这是传统计算机串行接口COM口的“方言”设计初衷是为了更长距离的通信。逻辑高电平“1”-3V 至 -15V负电压。逻辑低电平“0”3V 至 15V正电压。特点使用正负电压信号摆幅大可达30V抗共模干扰能力强传输距离可达15米左右。它的“负为1正为0”与TTL的“正为10为0”完全相反。核心矛盾就在这里STM32的UART_TX引脚输出的是3.3V1和0V0的TTL信号。如果你把它直接接到一个标准的RS-232接口DB9母头的接收针脚RxD 针脚2对方看到的是一个最高3.3V的“低电平”信号这在其标准里可能无法被稳定地识别为有效的“0”RS-232要求3V更别提逻辑反相的问题了。通信必然失败。3. USB/TTL转RS-232模块深度拆解明白了上述矛盾USB转串口模块的作用就清晰了。它通常是一个集成了三大功能的小板子或芯片。3.1 核心芯片协议与电平转换的“大脑”市面上常见的模块核心芯片主要有以下几类选型时各有考量芯片型号主要特点常见驱动情况适用场景与注意事项CH340/CH341国产性价比极高应用最广。稳定性经过多年市场检验。Windows系统可能需要手动安装驱动但驱动普及容易找到。Linux内核一般自带。新手首选。成本敏感、功能要求不复杂的项目。注意早期版本CH340G的晶振电路设计对晶振负载电容有要求接错可能导致通信不稳定。CP2102/CP2104Silicon Labs出品性能稳定外围电路极简无需外部晶振。驱动安装简单在各大操作系统中识别良好。追求稳定、方便对PCB面积要求小的项目。常用于集成度高的产品中。PL2303老牌芯片历史悠久。注意区分PL2303HX旧版和PL2303TA新版两者驱动不通用。Win10/11对旧版驱动支持差易出现“感叹号”。除非老设备兼容否则不建议新手选用驱动问题较多。FT232RLFTDI公司产品公认的稳定和性能标杆支持丰富的模式如Bit-Bang。驱动完善但某些仿制模块可能被FTDI官方驱动屏蔽。对通信稳定性、速率有极高要求的工业或专业场合。价格较高。实操心得对于学习和大多数项目CH340C/N或CP2102模块是绝佳选择。购买时优先选择带有TVS二极管防静电、电源指示灯和收发指示灯TX/RX LED的模块。收发指示灯在调试时是无价之宝一眼就能看出数据是否在流动。3.2 工作原理三步曲模块的工作流程是一个典型的“协议转换 - 逻辑调整 - 电平放大”的过程。第一步USB协议到UART数据流的转换协议翻译当模块插入电脑USB口时芯片内部的USB控制器会上报自身为一个“USB转串口桥接设备”。电脑安装驱动后会为其创建一个虚拟的COM端口如COM3 COM4。当你用串口助手软件向COM3发送字符串“Hello”时软件通过操作系统调用驱动驱动将数据打包成USB数据包通过USB总线发送给模块芯片。芯片的USB收发器接收到数据包由内置的处理器解析USB协议提取出原始的应用数据即“Hello”的ASCII码然后按照预设的波特率、数据位等参数从它的UART_TX引脚以TTL电平的串行数据流形式输出。第二步电平转换逻辑与电压翻译这是模块的核心物理转换功能通常由一颗专用的电平转换芯片如MAX3232、SP3232或集成在主控芯片内的电路完成。它接收来自主控芯片UART_TX脚的TTL信号0V/3.3V然后进行两个操作逻辑反相将TTL的“1”高电平转换为RS-232的“1”-5V ~ -12V将TTL的“0”低电平转换为RS-232的“0”5V ~ 12V。电压提升利用芯片内部的电荷泵电路将USB提供的5V电源升压并产生正负电压以满足RS-232电平的电压幅度要求。同理当从RS-232接口如一台老设备接收到信号时电平转换芯片将±电压转换回TTL电平并反相后送给主控芯片的UART_RX引脚。第三步接口物理适配插头翻译模块板载了两种或三种物理接口USB Type-A 或 Micro-USB口用于连接电脑。TTL电平引脚排针通常标有VCC5V或3.3V、GND、TX、RX。这里的TX/RX是TTL电平直接连接STM32等单片机的RX/TX注意交叉模块的TX接MCU的RX模块的RX接MCU的TX。DB9RS-232母头用于连接具有标准串口的设备。其针脚2RXD、针脚3TXD连接的是经过转换后的RS-232电平信号。3.3 模块与STM32的典型连接方法这里以最常见的3.3V供电的STM32如STM32F103C8T6和USB转TTL模块为例电源连接将模块的VCC引脚连接到STM32的3.3V引脚。切勿接到5V除非你确认你的STM32是5V容忍且模块输出是5V TTL。将模块的GND引脚连接到STM32的GND引脚。共地是通信的基础必须连接。信号线交叉连接将模块的TX引脚连接到STM32的PA10假设是USART1_RX。将模块的RX引脚连接到STM32的PA9假设是USART1_TX。口诀TX对RX RX对TX。发送端要对着接收端。Boot0引脚仅限ISP下载程序时如果需要通过串口给STM32下载程序ISP模式则需要将STM32的Boot0引脚拉高接3.3VBoot1拉低接GND。程序下载完成后需将Boot0重新拉低才能从主闪存启动运行用户程序。重要提示连接时最好先断开电源。先接好地线GND再接电源线VCC最后接信号线TX/RX。避免因电位差导致瞬间电流损坏芯片IO口。4. STM32端UART配置与编程实战理解了外部连接我们再看STM32内部如何配置。这里以STM32CubeMX配置HAL库为例讲解关键点。4.1 CubeMX图形化配置引脚分配在Pinout视图找到USART1将模式设置为“Asynchronous”异步通信。此时PA9和PA10会自动被配置为USART1_TX和USART1_RX。参数配置在Configuration标签页进入USART1的配置。Baud Rate设置为与串口助手一致的波特率如115200。Word Length数据位长度选8位。Parity校验位选None。Stop Bits停止位选1。Over Sampling过采样通常选16倍抗噪和精度平衡较好。中断/DMA配置可选但推荐对于接收数据强烈建议开启接收中断NVIC Settings中使能USART1全局中断。这样当收到一个字节时CPU会跳转到中断服务函数处理不占用主循环资源。如果需要大量、高速的数据传输如图像、文件可以配置DMA。将USART的RX/TX连接到DMA通道实现数据在串口和内存间的自动搬运极大解放CPU。4.2 HAL库关键函数与编程模式生成代码后在工程中主要使用以下几个HAL函数发送数据// 轮询方式发送阻塞式 HAL_UART_Transmit(huart1, (uint8_t*)Hello\r\n, 7, 1000); // 超时时间1000ms // 中断方式发送非阻塞 HAL_UART_Transmit_IT(huart1, pData, Size); // 发送完成后会进入 HAL_UART_TxCpltCallback 回调函数 // DMA方式发送非阻塞高效 HAL_UART_Transmit_DMA(huart1, pData, Size); // 发送完成后会进入 HAL_UART_TxCpltCallback 回调函数接收数据// 轮询方式接收阻塞很少用 // HAL_UART_Receive(huart1, pData, Size, Timeout); // 中断方式接收最常用 // 在main函数初始化后启动一次接收中断 HAL_UART_Receive_IT(huart1, rx_byte, 1); // 每次接收1个字节到rx_byte变量 // 当收到一个字节后会自动进入中断服务函数最终调用回调函数 void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart) { if(huart-Instance USART1) { // 处理收到的字节 rx_byte // ... (例如存入缓冲区判断帧头等) // 再次启动接收中断等待下一个字节 HAL_UART_Receive_IT(huart1, rx_byte, 1); } }DMA方式接收适合接收不定长数据。可以开启DMA接收一大段数据到缓冲区并结合串口空闲中断Idle Interrupt来判断一帧数据接收完成。4.3 数据帧解析实战技巧串口通信大多是按“帧”进行的比如一帧数据包含“帧头数据长度数据内容校验和帧尾”。在中断回调函数里我们通常只是把字节存入环形缓冲区。在主循环或定时器里再对缓冲区中的数据进行解析。一个简单的状态机解析示例伪代码思路enum ParserState { WAIT_HEADER, WAIT_LEN, WAIT_DATA, WAIT_CHECKSUM }; ParserState state WAIT_HEADER; uint8_t rx_buffer[100]; uint8_t data_index 0; uint8_t expected_len 0; void ParseByte(uint8_t byte) { switch(state) { case WAIT_HEADER: if(byte 0xAA) { // 假设帧头是0xAA state WAIT_LEN; } break; case WAIT_LEN: expected_len byte; data_index 0; state WAIT_DATA; break; case WAIT_DATA: rx_buffer[data_index] byte; if(data_index expected_len) { state WAIT_CHECKSUM; } break; case WAIT_CHECKSUM: // 计算之前数据的校验和与收到的byte比较 if(ChecksumOK()) { // 一帧有效数据到手调用处理函数 ProcessFrame(rx_buffer, expected_len); } // 无论对错回到等待帧头状态 state WAIT_HEADER; break; } }在主循环中不断检查环形缓冲区取出字节调用ParseByte。这种方式结构清晰易于维护和扩展。5. 常见问题排查与调试心法串口调不通是常态以下是按排查顺序总结的“救命清单”。5.1 硬件连接排查电源与地线万用表测量模块VCC和STM32的3.3V是否一致GND是否连通这是所有工作的前提。TX/RX交叉再默念三遍“TX接RX RX接TX”。接反了数据互相“对吼”谁也听不见对方。引脚冲突检查STM32的串口引脚是否被复用于其他功能如JTAG/SWD。例如PA13 PA14 PA15默认是调试端口如果要用作普通串口需要在CubeMX中禁用JTAG/SWD。我曾在PA2/PA3USART2上浪费半天最后发现是因为开了调试而这两个脚也被调试器占用了。模块指示灯好的模块有电源灯PWR和收发灯TX RX。发送数据时TX灯闪烁接收数据时RX灯闪烁。如果发送时TX灯不亮检查代码是否真的调用了发送函数或者引脚连接是否虚焊。5.2 软件配置排查波特率这是头号嫌疑犯。确保STM32代码中的波特率与串口助手软件如XCOM SSCOM Putty设置的波特率完全一致。尝试降低到9600这种低速率测试因为时钟误差在高速时影响更大。数据格式检查数据位、停止位、校验位是否三方一致STM32代码、模块驱动属性、串口助手软件。通常都是8-N-1。驱动与端口号在设备管理器Windows或ls /dev/tty*Linux/macOS中查看模块是否被正确识别为COM口如COM3或ttyUSB0。端口号是否被串口助手选对代码初始化顺序确保在main函数的while(1)循环之前已经调用了HAL_UART_Init()完成了串口初始化。如果使用中断接收别忘了在初始化后调用HAL_UART_Receive_IT()启动第一次接收。5.3 进阶问题与技巧数据丢失或错乱中断嵌套与优先级如果串口接收中断被更高优先级的中断如SysTick定时器中断长时间阻塞可能导致数据溢出Overrun。适当调整串口中断的NVIC优先级。缓冲区溢出中断接收函数处理太慢或者主循环解析太慢导致新数据覆盖旧数据。使用环形缓冲区是标准解决方案。电源噪声使用示波器查看TX/RX线上的波形是否干净。在信号线靠近MCU端加一个20-50pF的电容到地可以滤除部分高频毛刺。对于长距离RS-232通信确保信号地线良好连接。USB转串口模块的“坑”CH340晶振问题部分CH340G模块使用12MHz晶振其负载电容需要匹配通常22pF。如果通信不稳定尝试更换晶振或电容。PL2303驱动版本如前所述Win10/11下尽量使用新版TA芯片的模块并安装官网最新驱动。FTDI驱动“杀仿片”一些廉价仿制FT232的模块可能被FTDI官方驱动识别并禁用。要么寻找破解驱动要么更换为CH340/CP2102模块。调试利器逻辑分析仪与串口示波器一个几十块钱的简易逻辑分析仪配合Sigrok/PulseView软件是调试串口的神器。它可以同时抓取TX、RX线上的实际波形直观显示每一位的电平和时间直接解码出十六进制或ASCII数据。当软件层面查不出问题时用逻辑分析仪看一下物理层信号往往能立刻定位是硬件问题、时序问题还是软件问题。一些高级的串口助手软件自带“示波器”功能可以将接收到的数据如ADC采样值图形化显示对于调试传感器数据流非常方便。最后分享一个我自己的调试习惯在项目初期我会单独写一个最简单的测试程序——上电后STM32每隔1秒通过串口发送一次“Hello World”和芯片内部温度传感器的值。用这个程序来验证从硬件连接到软件配置的整个通路是否畅通。一旦这个基础测试通过再添加复杂的业务逻辑就能有效隔离问题范围。串口通信就像搭积木基础稳固了上层建筑才能牢靠。

相关新闻

微信聊天记录安全备份与迁移实战:基于PyWxDump的数据保全指南

微信聊天记录安全备份与迁移实战:基于PyWxDump的数据保全指南

1. 项目概述:为什么我们需要一个“安全”的聊天记录管理工具?最近在整理电脑,发现微信PC版的Data目录下,静静地躺着好几个以“xwechat”开头的文件夹,里面是不同时期、不同版本的聊天记录。这让我意识到,我…

2026/10/17 20:14:11 阅读更多 →
彻底告别DLL错误!5步快速修复Windows软件兼容性问题终极指南

彻底告别DLL错误!5步快速修复Windows软件兼容性问题终极指南

彻底告别DLL错误!5步快速修复Windows软件兼容性问题终极指南 【免费下载链接】vcredist AIO Repack for latest Microsoft Visual C Redistributable Runtimes 项目地址: https://gitcode.com/gh_mirrors/vc/vcredist 你是否曾经遇到过"找不到MSVCP140.…

2026/10/16 14:44:18 阅读更多 →
Python连接达梦数据库实战指南:从驱动安装到框架集成

Python连接达梦数据库实战指南:从驱动安装到框架集成

1. 从“为什么”开始:Python与达梦数据库的连接场景最近在几个企业级数据中台和国产化替代的项目里,频繁遇到一个需求:用Python去对接达梦数据库(DM8)。这其实是一个挺典型的场景,尤其是在当前强调技术自主…

2026/10/17 2:33:41 阅读更多 →

最新新闻

2026年AI编程工具全解析:33款主流助手与IDE选型指南

2026年AI编程工具全解析:33款主流助手与IDE选型指南

2024年大家还在争论“AI能不能写代码”,到2026年这个问题基本不需要讨论了。我今年在好几个项目里把AI编程工具从“偶尔试用”变成了“日常主力”,从代码补全到自动化测试再到完整功能模块的实现,工具链已经成熟得超出预期。但问题也变成了另…

2026/10/17 21:02:08 阅读更多 →
Vibe Coding第二课:零基础搭建个人主页和数字分身

Vibe Coding第二课:零基础搭建个人主页和数字分身

Vibe Coding这个词,最近在开发者圈子里被反复讨论,但对真正零基础的人来说,它最诱人的点其实特别简单:你不需要先把编程学个半吊子,就能做出能给别人看的东西。第二课我们直接来干一件特别实在的事——从0到1搭一个你自…

2026/10/17 21:02:08 阅读更多 →
分步傅里叶法解NLS方程:MATLAB仿真孤子传输实战

分步傅里叶法解NLS方程:MATLAB仿真孤子传输实战

简介:非线性光纤光学与光通信领域的学习者、研究人员,常需掌握分步傅里叶法求解非线性薛定谔方程(NLS)的数值实现。该资源包提供了一份MATLAB源代码及详细解析文档,内容涵盖NLS方程建模、分步傅里叶法原理、代码结构梳…

2026/10/17 21:02:08 阅读更多 →
MATLAB调用外部软件:控件化封装与COM/system/MEX选型实战

MATLAB调用外部软件:控件化封装与COM/system/MEX选型实战

1. 项目缘起与整体设计思路1.1 为什么要在MATLAB里“调用”外部软件做过工程仿真或者数据处理的朋友大概率遇到过这种场景:手头有一套用MATLAB写的算法主流程,但某个关键环节依赖一个独立的第三方软件——可能是某个专业的求解器、一个老旧的C计算程序、…

2026/10/17 21:02:08 阅读更多 →
全网最全Python课程PDF如何高效利用:拆目录、验代码、避坑指南

全网最全Python课程PDF如何高效利用:拆目录、验代码、避坑指南

简介:一份以 PDF 文档形式整理的全网 Python 系统课程学习路线,适合零基础入门到希望进阶的开发者使用。文档提炼了 637 集课程的整体框架,按 Python 基础、进阶、终极、爬虫四篇展开,覆盖 Python 基础语法、坦克大战实战、网络并…

2026/10/17 21:02:08 阅读更多 →
约瑟夫环C语言循环链表实现:从建环到出圈的完整方案

约瑟夫环C语言循环链表实现:从建环到出圈的完整方案

简介:这是一份面向C语言初学者与数据结构学习者的约瑟夫死亡游戏完整实现资料,围绕循环链表这一核心结构展开,帮助读者理解环形链表的创建、遍历与结点删除等经典操作。资源包内仅含1个docx文档,大小约18KB,以文字形式…

2026/10/17 21:01:07 阅读更多 →

日新闻

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

DeepSeek选型与部署:V3/R1、Ollama、API全攻略

简介:《DeepSeek使用方法.pdf》是一份面向DeepSeek入门及进阶用户的完整使用指南,重点围绕V3与R1两款模型的能力差异与适用场景展开,帮助读者根据任务类型与成本选择合适的模型。资源共1个PDF文件,压缩包大小约311KB,篇…

2026/10/17 0:00:25 阅读更多 →
200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

200+Deepseek润色指令拆解:从底层原理到场景落地的完整指南

简介:这是一份聚焦DeepSeek提示词优化的《200Deepseek润色指令》PDF文档,共收录两百余条可直接套用的润色指令,涵盖语法修正、风格统一、逻辑梳理、表达精炼等维度,并针对商务写作、学术论文、广告文案等场景给出差异化建议。文档…

2026/10/17 0:00:25 阅读更多 →
OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

OpenCV轮廓法物体计数系统:轻量、可控、可落地的工业级实现

简介:本资源是一份基于OpenCV的本科课程设计完整报告,面向计算机视觉初学者、图像处理学习者及高校通信/信息类专业学生,解决物体智能计数与检测结果结构化记录的实际问题。项目覆盖图像预处理、轮廓检测、边界框绘制、轨迹栏交互式参数调节、…

2026/10/17 0:00:25 阅读更多 →

周新闻

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

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

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

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

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

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

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

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

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

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 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/16 21:54:38 阅读更多 →
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/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练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/16 14:23:36 阅读更多 →