FT230XS 串口转 USB 驱动实战:从枚举失败到稳定通信

简介:FT230XS UART to USB Driver 是面向嵌入式开发与硬件调试人员的串口转USB驱动资源,针对采用FT230XS芯片的设备在Windows与Linux环境下无法正常识别或通信的问题,提供完整的驱动安装与开发支持。压缩包共30个文件,约1.59MB,包含dll、sys、lib、exe、inf、cat、h及txt等类型:其中exe与inf负责驱动安装配置,sys与dll为运行核心,lib与h供开发者调用API,cat数字签名文件保障来源安全,txt则记录许可协议与使用须知。资源同时说明Linux下可借助libftdi1等开源库通过包管理器完成通信配置。已有1504人学习下载,适合需要快速搭建FT230XS通信环境、排查驱动安装问题或进行二次开发的工程师参考,可帮助读者理解驱动文件构成、签名验证机制与跨平台使用要点。

1. FT230XS 串口转 USB 驱动:从枚举失败到稳定通信的实战复盘

调试一块自制的传感器板时,PC 端设备管理器里那个黄色感叹号让我折腾了整整一个下午。板子上用的桥接芯片是 FT230XS,USB 端插上后系统能识别到有新设备接入,但串口就是出不来。换线、换口、重启,全试了一遍,最后发现是驱动没装对。FT230XS 是 FTDI 的一款 USB 转 UART 桥接芯片,在嵌入式开发里很常见,尤其是那些需要把单片机串口引到电脑上的场景。它比老一代的 FT232R 便宜,外围电路也简单,但驱动这块有个坑:不同系统对它的识别策略不一样,Windows 下需要装 VCP 驱动,Linux 下内核虽然自带 ftdi_sio 模块,但有时候会被其他驱动抢走。这篇笔记就把我从枚举失败到稳定通信的过程拆开,把驱动安装、参数配置、常见报错和排查方法都过一遍,适合正在用 FT230XS 做串口通信的嵌入式开发者参考。

2. FT230XS 驱动选型与系统识别:VCP 还是 D2XX

2.1 两种驱动模式的区别与选择依据

FTDI 给 FT230XS 提供了两套驱动方案,一套是 VCP,一套是 D2XX。VCP 全称 Virtual COM Port,装完之后系统里会多出一个标准串口设备,Windows 下是 COMx,Linux 下是 /dev/ttyUSBx。应用程序不需要知道底层是 USB,直接按串口读写就行,波特率、数据位、停止位这些参数通过串口 API 设置。D2XX 则是 FTDI 自家的动态库,绕开操作系统串口子系统,直接跟芯片通信,延迟更低,也能访问一些 VCP 模式下拿不到的芯片内部信息,比如 EEPROM 配置。选哪个取决于你的应用场景:如果只是把单片机日志打到电脑上,或者用串口助手收发数据,VCP 就够了,兼容性好,代码不用改。如果要做高速数据采集,或者需要动态改 VID/PID、调整 USB 描述符,那就得用 D2XX。我这次只是读传感器数据,波特率 115200,VCP 完全够用,所以后面主要围绕 VCP 展开。

2.2 Windows 下的驱动安装与设备枚举

Windows 10 和 Windows 11 对 FT230XS 的默认策略是:插上后系统会尝试从 Windows Update 拉驱动,但很多时候拉不到,设备管理器里会显示为“USB Serial Converter”或者带感叹号的未知设备。这时候需要手动装 FTDI 官方 VCP 驱动。安装包从 FTDI 官网下载,注意选对版本,32 位和 64 位要匹配。装完之后重新插拔,设备管理器里应该出现“USB Serial Port (COMx)”。如果还是感叹号,右键设备,更新驱动,手动指向解压后的驱动目录,让系统从本地找。

# Windows 下查看已识别的串口设备(PowerShell) Get-WmiObject Win32_SerialPort | Select-Object DeviceID, Description, PNPDeviceID # 输出示例: # DeviceID Description # COM3 USB Serial Port (COM3) # 如果列表为空,说明驱动没装好,设备没被识别为串口

这段命令用来确认系统是否把 FT230XS 枚举成了串口设备。DeviceID 就是后续打开串口时要用的端口号。PNPDeviceID 里会包含 VID 和 PID,FT230XS 的默认 VID 是 0x0403,PID 是 0x6015。如果 PNPDeviceID 里看到的 VID/PID 不是这两个,说明芯片可能被改过配置,或者买到的是兼容片。注意,有些廉价模块用的是国产替代芯片,驱动装 FTDI 的也能用,但 PID 可能不一样,这时候要么改驱动 inf 文件,要么找卖家要专用驱动。

2.3 Linux 下的内核模块加载与权限配置

Linux 内核从 2.6 开始就自带 ftdi_sio 模块,理论上插上 FT230XS 就能自动识别出 /dev/ttyUSB0。但实际用的时候经常遇到两个问题:一是模块没自动加载,二是设备节点权限不对,普通用户打不开。先看模块有没有加载:

# 查看 ftdi_sio 模块是否已加载 lsmod | grep ftdi_sio # 如果没有输出,手动加载 sudo modprobe ftdi_sio # 查看内核日志,确认设备识别情况 dmesg | tail -20 # 正常输出里会有类似: # usb 1-1: FTDI USB Serial Device converter now attached to ttyUSB0

如果 dmesg 里看到的是 “ftdi_sio: probe of 1-1:1.0 failed with error -...” 这类信息,说明驱动加载了但绑定失败。常见原因是其他驱动先抢占了设备,比如 cp210x 或者 ch341。可以用lsusb -t看设备挂在哪个驱动下。如果是权限问题,普通用户默认不在 dialout 组里,需要加一下:

# 把当前用户加入 dialout 组 sudo usermod -aG dialout $USER # 重新登录后生效,或者临时改设备权限 sudo chmod 666 /dev/ttyUSB0

加入 dialout 组后需要重新登录才能生效,这个坑我踩过好几次,改完权限当时能用,重启后又不行,就是因为组没生效。另外,如果用的是 Ubuntu 22.04 之后的版本,ModemManager 可能会自动去探测新插入的串口设备,导致你的程序打开设备时被占用。可以临时停掉:sudo systemctl stop ModemManager,或者加 udev 规则让 ModemManager 忽略这个设备。

3. 串口参数配置与通信测试:从回环到实际数据

3.1 用 Python 快速验证串口通信

驱动装好、设备节点出来之后,下一步是验证通信是否正常。最直接的办法是短接 FT230XS 模块的 TX 和 RX,做回环测试。发什么收什么,说明驱动和硬件都没问题。Python 的 pyserial 库跨平台,写起来快,适合做初步验证。

import serial import time # 打开串口,参数根据实际设备调整 ser = serial.Serial( port='/dev/ttyUSB0', # Windows 下改成 'COM3' baudrate=115200, # 波特率,FT230XS 支持 300 到 3M bytesize=serial.EIGHTBITS,# 数据位,常用 8 parity=serial.PARITY_NONE,# 校验位,无校验 stopbits=serial.STOPBITS_ONE, # 停止位,1 位 timeout=1 # 读超时,秒 ) # 回环测试:短接 TX 和 RX 后,发什么收什么 test_data = b'FT230XS loopback test\r\n' ser.write(test_data) time.sleep(0.1) # 等数据发完 received = ser.read(len(test_data)) print(f'Sent: {test_data}') print(f'Received: {received}') print(f'Match: {test_data == received}') ser.close()

这段代码里几个参数需要说明。baudrate 设成 115200 是常见值,FT230XS 内部有波特率发生器,支持非标准波特率,但 pyserial 传进去的必须是整数。bytesize 一般用 8,如果单片机那边配的是 7 位数据位,这里也要改。parity 和 stopbits 必须跟对端一致,否则收到的就是乱码。timeout 设 1 秒是为了防止 read 卡死,实际项目中可以根据数据量调整。回环测试通过后,再把 TX/RX 接到单片机的串口上,注意交叉连接:FT230XS 的 TX 接单片机 RX,RX 接单片机 TX,GND 必须共地。

3.2 用 minicom 和 screen 做交互式调试

Python 脚本适合自动化测试,但日常调试还是交互式终端方便。Linux 下常用的有 minicom 和 screen。minicom 功能全,但配置稍麻烦;screen 简单直接,适合快速看数据。

# 用 screen 打开串口,波特率 115200 screen /dev/ttyUSB0 115200 # 退出 screen:按 Ctrl+A,然后按 K,再按 Y 确认 # 用 minicom 打开串口 minicom -D /dev/ttyUSB0 -b 115200 # 退出 minicom:按 Ctrl+A,然后按 X

screen 的退出方式比较反直觉,Ctrl+A 是命令前缀,K 是 kill,Y 是确认。我第一次用的时候直接关终端,结果 screen 会话还挂在后台,串口被占用,后面再打开就报 “Device or resource busy”。用 minicom 的话,如果非正常退出,也会留下锁文件,一般在 /var/lock/LCK..ttyUSB0,删掉才能重新打开。这两个工具都支持日志记录,minicom 按 Ctrl+A 然后 L 可以开日志,screen 用 -L 参数启动会把输出写到 screenlog.0。调试单片机输出日志时,开日志很有必要,不然刷屏太快根本看不清。

3.3 波特率误差与数据丢包排查

FT230XS 的波特率精度依赖内部时钟,虽然出厂校准过,但在极端温度或者供电不稳的情况下,误差会变大。如果发现收到的数据偶尔有乱码,或者高波特率下丢包,先查波特率误差。用示波器量 TX 引脚上的波形,算一个位的时间,跟理论值对比。比如 115200 波特率,一个位是 8.68 微秒,如果量出来偏差超过 2%,通信就不稳了。没有示波器的话,可以发固定模式的数据,比如 0x55 和 0xAA,用逻辑分析仪抓,看位宽是否均匀。

另一个常见问题是流控。FT230XS 支持 RTS/CTS 硬件流控,但很多模块只引出了 TX、RX、GND,RTS 和 CTS 没接。如果单片机那边开了硬件流控,而 FT230XS 这边没接,数据发到一半就会卡住。解决办法是在单片机端关掉流控,或者把 FT230XS 的 RTS/CTS 也接上。软件流控 XON/XOFF 用得少,因为二进制数据里可能出现 0x11 和 0x13,会误触发。我一般直接关流控,靠协议层做重传。

4. 避坑与常见问题排查

4.1 设备管理器里出现感叹号,驱动装不上

现象:Windows 下插上 FT230XS,设备管理器显示未知设备或者带感叹号的 USB Serial Converter,手动指定驱动目录也装不上。原因:系统里可能已经装了旧版 FTDI 驱动,版本冲突;或者芯片的 PID 被改过,官方驱动的 inf 文件里没有这个 PID。解决:先在设备管理器里卸载设备,勾选“删除此设备的驱动程序软件”,然后拔掉模块,重新插上,再装最新版 VCP 驱动。如果 PID 不对,用 FTDI 的 FT_PROG 工具读一下芯片配置,确认 PID 是多少,然后改驱动 inf 文件里的 PID 列表,或者直接用 D2XX 驱动,D2XX 对 PID 的容忍度更高。

4.2 Linux 下 /dev/ttyUSB0 时有时无

现象:插上 FT230XS,有时候有 /dev/ttyUSB0,有时候没有,dmesg 里看到 “device descriptor read/64, error -71”。原因:USB 线质量差,或者供电不足。FT230XS 虽然功耗不高,但有些廉价模块的 USB 线内阻大,导致枚举过程中断。解决:换一根短一点的、带屏蔽的 USB 线,最好直接插在电脑主板上的 USB 口,不要用扩展坞。如果还不行,在 dmesg 里看是不是 “unable to enumerate USB device”,那基本就是硬件问题,换模块。

4.3 串口能打开但收不到数据

现象:Python 脚本或者 minicom 能打开 /dev/ttyUSB0,但 read 一直超时,收不到任何数据。原因:TX/RX 接反了,或者波特率不匹配,或者对端根本没发数据。解决:先做回环测试,短接 TX 和 RX,自发自收,确认驱动和模块没问题。然后检查接线,FT230XS 的 TX 要接单片机的 RX,RX 接 TX,GND 必须共地。如果接线没问题,用示波器或者逻辑分析仪量 TX 引脚,看有没有波形。没有波形的话,查单片机那边串口有没有初始化,引脚有没有被复用成其他功能。

4.4 高波特率下数据出错

现象:115200 能正常通信,提到 921600 或者 1M 之后,收到的数据大量出错。原因:FT230XS 在高波特率下对 USB 带宽和驱动缓冲更敏感,如果 USB 线质量差或者系统负载高,就会丢包。解决:降低波特率到 460800 试试,如果稳定,说明是带宽问题。另外,在 pyserial 里把 write_timeout 和 inter_byte_timeout 设小一点,减少缓冲延迟。Linux 下可以调 ftdi_sio 模块的 latency_timer,默认是 16ms,改成 1ms 能降低延迟:echo 1 | sudo tee /sys/bus/usb-serial/devices/ttyUSB0/latency_timer。这个值改了之后对实时性提升明显,但会增加 USB 中断频率,功耗略升。

4.5 模块发热严重

现象:FT230XS 模块插上后芯片发烫,甚至烫手。原因:FT230XS 内部有 LDO,如果供电电压偏高,或者输出电流过大,就会发热。常见于模块上同时给外部传感器供电的情况。解决:量一下模块的 VCC 和 3.3V 输出,看是否在正常范围。FT230XS 的 3.3V 输出最大电流是 50mA,如果外部传感器耗电超过这个值,LDO 就会过热。解决办法是外部传感器单独供电,或者换用带外部供电的模块。如果只是芯片本身发热,但通信正常,那可能是芯片批次问题,换一个模块试试。

5. 进阶技巧:用 udev 规则固定设备名与自动化测试

设备名 /dev/ttyUSB0 的问题在于,插多个串口设备时,编号会变。今天 ttyUSB0 是 FT230XS,明天可能就变成 ttyUSB1 了,脚本里写死的端口号就会失效。解决办法是用 udev 规则根据设备的序列号或者物理端口路径创建固定名字的软链接。先查 FT230XS 的序列号:

# 查看 FT230XS 的详细信息,包括序列号 udevadm info -a -n /dev/ttyUSB0 | grep -E 'serial|idVendor|idProduct' # 输出示例: # ATTRS{idVendor}=="0403" # ATTRS{idProduct}=="6015" # ATTRS{serial}=="A50285BI"

拿到序列号后,写一个 udev 规则文件:

# 创建规则文件 /etc/udev/rules.d/99-ft230xs.rules # 根据序列号创建固定软链接 /dev/ttyFT230XS SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6015", ATTRS{serial}=="A50285BI", SYMLINK+="ttyFT230XS", MODE="0666"

保存后重新加载规则并触发:

sudo udevadm control --reload-rules sudo udevadm trigger # 重新插拔设备,查看软链接是否创建 ls -l /dev/ttyFT230XS

这样不管系统分配的是 ttyUSB0 还是 ttyUSB1,/dev/ttyFT230XS 始终指向这个模块。MODE="0666" 让普通用户也能读写,省去了每次改权限的麻烦。如果手头有多个 FT230XS 模块,每个序列号不同,可以写多条规则,分别创建不同的软链接名。

自动化测试方面,我习惯用 pytest 加 pyserial 写一个简单的测试脚本,每次改完硬件或者驱动,跑一遍确认通信正常。测试内容可以包括:打开串口、回环测试、发特定命令收预期响应、高波特率压力测试。下面是一个 pytest 的示例:

import serial import pytest import time @pytest.fixture def ser(): # 使用 udev 创建的固定设备名 s = serial.Serial('/dev/ttyFT230XS', 115200, timeout=1) yield s s.close() def test_loopback(ser): # 需要短接 TX 和 RX data = b'pytest loopback\r\n' ser.write(data) time.sleep(0.1) assert ser.read(len(data)) == data def test_baudrate_921600(ser): # 高波特率测试,需要硬件支持 ser.baudrate = 921600 data = b'high speed test\r\n' ser.write(data) time.sleep(0.1) received = ser.read(len(data)) assert received == data, f'Expected {data}, got {received}'

这个测试脚本跑一遍大概几秒钟,能覆盖大部分常见问题。如果 test_loopback 失败,说明驱动或者硬件有问题;如果 test_baudrate_921600 失败但 115200 正常,说明是带宽或者线材问题。从那以后我每次换 USB 线或者换电脑,都先跑一遍这个测试,确认基础通信没问题再往下做。希望帮到你。

本文还有配套的精品资源,点击获取

相关新闻

开源代码审查工具open-code-review:基于diff的自动化规则引擎实践

开源代码审查工具open-code-review:基于diff的自动化规则引擎实践

搞代码审查这么多年,我一直觉得这事不该靠人海战术硬扛。团队一忙起来,review 就成了走过场,可线上出了问题,背锅的还是 review 环节。所以我花了不少业余时间做了一个开源的代码审查辅助工具,名字就叫 open-code-revi…

2026/10/19 19:41:00 阅读更多 →
AI辅助教材写作:从初稿到低查重的完整方法论

AI辅助教材写作:从初稿到低查重的完整方法论

上个月接了一本专业教材的编写任务,时间紧、资料杂、章节多,刚开始我直接用AI批量生成初稿,效率确实拉满,但第一轮内部查重就傻了眼——好几个章节重复率直接超标。后来我花了两周时间磨合出一套完整的干活流程:用AI辅…

2026/10/19 19:41:00 阅读更多 →
AI辅助教材编写:低查重工具选型与实操指南

AI辅助教材编写:低查重工具选型与实操指南

教材编写这活儿,干过的人都懂。资料摞了一桌子,键盘前坐了一下午,真正落到文档里的字可能还不到两千。不是不会写,是每个知识点都得反复琢磨怎么表达才准确、怎么组织才符合教学逻辑,尤其还要躲开一个隐形红线——查重…

2026/10/19 19:41:00 阅读更多 →

最新新闻

深度学习放射组学预测乳腺癌腋窝淋巴结状态

深度学习放射组学预测乳腺癌腋窝淋巴结状态

1. 项目概述:这不是“AI看片”,而是把影像里肉眼看不见的纹理变成临床决策依据“Day 15. Deep learning radiomics can predict axillary lymph node status in early-stage breast cancer”——这个标题乍看像某份科研日志的随手记录,但背后…

2026/10/19 20:32:32 阅读更多 →
企业级AI Agent落地:数据、流程与人,才是真正的瓶颈

企业级AI Agent落地:数据、流程与人,才是真正的瓶颈

落地企业级AI Agent一年,最颠覆我认知的一点是:模型能力从来不是真正的瓶颈。 去年年初,我们团队接到一个任务——在某制造集团内部落地企业级AI Agent,覆盖客服问答、供应链协同、内部知识检索几个方向。立项时团队吵得最凶的是…

2026/10/19 20:32:32 阅读更多 →
Claude Code 编程工作流:从自然语言到高效代码的 AI 搭档

Claude Code 编程工作流:从自然语言到高效代码的 AI 搭档

最近这段时间,我在几个项目的开发里大量使用了 Claude Code 这套编程工作流。说句实话,用过之后再看以前的编码习惯,多少有点回不去了。它不是那种锦上添花的效率小工具,而是直接改变了你和代码之间的交互方式:过去你坐…

2026/10/19 20:32:32 阅读更多 →
kubeadm离线安装Kubernetes集群:镜像准备与常见故障排查

kubeadm离线安装Kubernetes集群:镜像准备与常见故障排查

最近有个朋友问我,能不能在不折腾网络的前提下,用 kubeadm 装一个指定版本的 Kubernetes 集群。他试过几次 kubeadm init ,每次都在拉取 registry.k8s.io 这一步超时,要么就是预检阶段卡了几分钟直接报错。这个问题在受网络限…

2026/10/19 20:31:29 阅读更多 →
UDP+TCP+多线程+Swing:局域网P2P即时通信课设全解析

UDP+TCP+多线程+Swing:局域网P2P即时通信课设全解析

简介:广东工业大学计算机网络课程设计项目,实现基于P2P的局域网即时通信系统,面向计网课设、Java网络编程与P2P应用开发者。系统采用P2P架构,程序既是服务器又是客户端,通过3333端口扫描局域网在线对等方,完…

2026/10/19 20:29:26 阅读更多 →
约束路径规划+改进ICP:复杂曲面点云配准误差降88.2%

约束路径规划+改进ICP:复杂曲面点云配准误差降88.2%

1. 从一组实测数据说起:为什么基础ICP在复杂曲面上总是“差一口气”先把标题里那组数字摆出来:平均误差0.599mm,RMSE 0.826mm,相比基础ICP下降88.2%。做过三维重建的人看到这组数字,第一反应大概率是“降得有点狠”&am…

2026/10/19 20:29:26 阅读更多 →

日新闻

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

频率跟踪型PWM电源设计:臭氧发生器谐振点漂移与软开关实现

简介:本资源为电源技术方向的学术研究文档,聚焦介质阻挡放电型臭氧发生器电源的频率跟踪型PWM控制策略,面向电力电子、高压电源及臭氧应用领域的科研人员与工程技术人员。针对负载呈容性、等效电容随外加电压升高而增大、谐振频率随之漂移的难…

2026/10/19 0:00:47 阅读更多 →
Vibe Coding 遇上 TaoToken:把开发者思维圣殿的灵感流接入统一 Key 通道

Vibe Coding 遇上 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/19 0:00:47 阅读更多 →
HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

HundredCV-Chat话题建模实战教程:利用4,871个内置话题标签构建主题分析系统

【免费下载链接】HundredCV-Chat 项目地址: https://ai.gitcode.com/hf_mirrors/Jax-dan/HundredCV-Chat 点击查看 免费下载 HundredCV-Chat 是一个由 100 位青年简历数据开发而来的中文多轮对话数据集,共包含 24,750 组日常闲聊对话和 4,871 个话题标签…

2026/10/19 0:00:47 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/19 1:30:52 阅读更多 →

月新闻

我发现了一个新思路:用 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/19 2:54:50 阅读更多 →
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/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练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/18 12:16:16 阅读更多 →