数据通信基础培训:调制解调、多路复用与编码实战
简介这份PPT文档面向通信、网络工程方向的初学者与在职技术人员系统梳理数据通信基础理论可作为课堂培训讲义或自学复习资料。内容围绕信号分类与频谱、带宽定义、调制解调原理与调制器模型、传输信道特性、频分与时分及码分复用、数据编码与语言编码、IP电话原理、数据压缩编码以及数据通信系统同步技术等模块展开并配有学习要求与目录导航便于按章节循序渐进掌握。资源包共1个pptx文件大小约8.04MB以幻灯片形式呈现适合直接用于授课演示或打印学习。目前已有88人浏览学习内容覆盖从信号基础到同步技术的完整知识链条能帮助读者建立数据通信的整体框架理解调制解调、信道复用与编码压缩等关键概念适合作为入门培训与知识查漏的参考材料。1. 数据通信基础知识培训从调制解调到多路复用的落地拆解做嵌入式、网络运维或音视频传输的工程师几乎都遇到过这样的场景设备明明接上了数据就是传不稳抓包看到一堆重传却说不清是编码问题还是信道问题。这时候如果只会在应用层加日志基本等于盲人摸象。数据通信基础知识培训这件事核心不是背 OSI 七层而是把调制解调、信道、多路复用、数据编码这四个词变成你手里能调、能测、能排错的具体参数。这份培训材料面向的是需要跟物理层和链路层打交道的从业者比如做串口通信、无线模块调试、工业总线、音视频流传输的人。它解决的不是“知道”而是“知道该看哪个寄存器、该改哪个参数、该用什么工具验证”。下面我按自己带新人和做内部培训的顺序把这几块拆成能直接抄作业的步骤。2. 调制解调与信道先搞懂信号是怎么被“塞”进线路的2.1 调制解调到底在调什么很多人把调制解调理解成“猫”这是被早期拨号上网带偏了。在数据通信里调制是把数字比特流映射成适合信道传输的模拟信号形式解调是反过来。为什么要映射因为基带数字信号直接上线路高频分量衰减大、直流分量没法过变压器、频谱效率也低。常见做法是改变载波的幅度、频率或相位对应 ASK、FSK、PSK以及组合的 QAM。我一般会先让新人用 Python 画一遍星座图比看公式直观得多。下面这段代码生成 16-QAM 的星座点并加噪声能直接看到信噪比下降时判决边界怎么糊掉。import numpy as np import matplotlib.pyplot as plt # 16-QAM 星座点I/Q 各取 -3,-1,1,3 levels np.array([-3, -1, 1, 3]) constellation np.array([[i, q] for i in levels for q in levels]) # 生成 1000 个随机符号 idx np.random.randint(0, 16, 1000) tx constellation[idx] # 加高斯白噪声SNR 分别取 20dB 和 10dB def add_noise(symbols, snr_db): power np.mean(np.abs(symbols)**2) noise_power power / (10**(snr_db/10)) noise np.sqrt(noise_power/2) * (np.random.randn(*symbols.shape) 1j*np.random.randn(*symbols.shape)) return symbols noise fig, axes plt.subplots(1, 2, figsize(10, 5)) for ax, snr in zip(axes, [20, 10]): rx add_noise(tx, snr) ax.scatter(rx.real, rx.imag, s5, alpha0.5) ax.scatter(constellation[:,0], constellation[:,1], cred, markerx) ax.set_title(fSNR{snr}dB) ax.grid(True) plt.show()逻辑说明星座点代表每个符号能携带的比特数16-QAM 每个符号 4 bit。噪声功率由 SNR 决定SNR 越低接收点越偏离理想位置判决时就越容易串到隔壁点。参数上SNR 每降 3dB噪声功率翻倍实际调试时如果你看到误码率突然从 1e-6 跳到 1e-3先别怀疑协议栈去查发射功率和线路损耗。2.2 信道带宽和信道容量怎么对应到实际参数信道不是一根理想导线它有带宽、有噪声、有衰减。香农公式 C B log2(1S/N) 给出了理论上限但实际系统里你调的是符号率、滚降系数、编码率。比如 Wi-Fi 5G 频段哪些信道能跑 160MHz这背后就是信道带宽 B 的选择。国内 5.8GHz 频段可用信道有限能凑出 160MHz 连续带宽的组合不多常见的是 36-64 这一组。如果你强行在干扰大的信道开 160MHz实际吞吐可能还不如 80MHz因为噪声抬高了MCS 阶数掉下来。我一般会建议先扫频看哪些信道的底噪低。用iw命令在 Linux 上就能看# 查看当前无线接口支持的频段和信道 iw phy phy0 info | grep -A 20 Frequencies # 扫描周围 AP看各信道占用和信号强度 sudo iw dev wlan0 scan | grep -E DS Parameter set|signal|SSID逻辑说明iw phy输出的是硬件能力包括每个信道允许的最大带宽和发射功率。iw dev scan是实际环境看的是别人占了多少。参数上signal是接收信号强度单位 dBm-50 以内算好-70 以下基本没戏。如果你要做信道规划把这两个输出对着看避开底噪高和邻居多的信道。2.3 信道估计为什么是接收端的“后悔药”无线信道是时变的多径、多普勒、相位噪声都会让接收到的符号旋转和扩散。信道估计就是接收端根据已知的导频信号反推信道对信号做了什么然后在均衡时补偿回去。LS 信道估计是最基础的做法计算量小但对噪声敏感。我一般用 LS 做初版验证再用 MMSE 或插值优化。下面这段代码用 LS 估计一个简单的多径信道import numpy as np # 已知导频 pilot np.array([1, 1, 1, 1]) # 模拟信道两径第二径延迟 1 个样点增益 0.5 h_true np.array([1, 0.5, 0, 0]) # 接收导频 卷积 噪声 rx np.convolve(pilot, h_true, modesame) 0.05*(np.random.randn(4)1j*np.random.randn(4)) # LS 估计H_ls Rx / Pilot h_ls rx / pilot print(真实信道:, h_true) print(LS 估计:, np.round(h_ls, 3))逻辑说明LS 估计直接做除法导频幅度为 1 时就是接收值本身。参数上导频密度越高估计越准但开销越大LTE 里通常每 0.5ms 插一组导频。实际调试时如果均衡后星座图还是散的先看导频功率是否和业务符号一致再看信道估计的插值间隔是不是大于相干带宽。3. 多路复用把一根线掰成几根用的几种姿势3.1 频分、时分、码分和波分的选择逻辑多路复用的本质是让多个信号共享同一物理介质。频分复用FDM把带宽切成几段每路占一段时分复用TDM把时间切成 slots每路占一个码分复用CDM用正交码区分波分复用WDM是光域的 FDM。选哪个看你的信号特性和同步成本。我一般按这个顺序问各路信号是不是持续有数据如果是突发性的TDM 更省如果各路带宽需求固定且同时在线FDM 简单如果要做抗干扰和保密CDM 有优势但同步复杂。实际工程里I2C 控制的多路复用就是典型的 TDM 思路用地址位选通不同从机而 io 多路复用select、epoll是操作系统层面的“信道复用”让一个线程管多个 fd本质是事件驱动的时分。3.2 用 select 多路复用写一个能跑的多路串口采集很多做工业采集的人一开始都是一个串口一个线程设备一多线程就爆了。常见做法是用 select 或 epoll 把多个串口 fd 管起来。下面是一个 Linux 下用 select 同时读两个串口的例子#include stdio.h #include fcntl.h #include unistd.h #include sys/select.h #include termios.h int open_serial(const char *dev) { int fd open(dev, O_RDWR | O_NOCTTY | O_NONBLOCK); struct termios tty; tcgetattr(fd, tty); cfsetospeed(tty, B115200); cfsetispeed(tty, B115200); tty.c_cflag | (CLOCAL | CREAD); tty.c_cflag ~PARENB; // 无校验 tty.c_cflag ~CSTOPB; // 1 停止位 tty.c_cflag ~CSIZE; tty.c_cflag | CS8; // 8 数据位 tcsetattr(fd, TCSANOW, tty); return fd; } int main() { int fd1 open_serial(/dev/ttyUSB0); int fd2 open_serial(/dev/ttyUSB1); fd_set readfds; char buf[256]; while (1) { FD_ZERO(readfds); FD_SET(fd1, readfds); FD_SET(fd2, readfds); int maxfd fd1 fd2 ? fd1 : fd2; // 阻塞等待超时 1 秒 int ret select(maxfd 1, readfds, NULL, NULL, (struct timeval){1, 0}); if (ret 0) { perror(select); break; } if (FD_ISSET(fd1, readfds)) { int n read(fd1, buf, sizeof(buf)); if (n 0) printf(ttyUSB0: %.*s\n, n, buf); } if (FD_ISSET(fd2, readfds)) { int n read(fd2, buf, sizeof(buf)); if (n 0) printf(ttyUSB1: %.*s\n, n, buf); } } return 0; }逻辑说明select把两个 fd 放进一个集合内核在有数据可读时唤醒。参数上maxfd必须是最大 fd 加一超时设 1 秒是为了避免完全阻塞导致无法退出。实际部署时如果串口数量超过 1024select 就不够用了换 epoll。另外注意串口要设成非阻塞否则 read 可能卡住。3.3 多路复用的同步和缓冲坑多路复用最容易被忽略的是同步和缓冲。TDM 里如果各路时钟不同步slot 会漂移FDM 里如果滤波器滚降太陡邻道干扰就大。我踩过的一个坑是用 select 读多个串口时某个串口数据量特别大其他串口的数据在缓冲区里排队导致实时性下降。解决办法是给每个 fd 配独立缓冲区并且限制单次 read 的最大字节数避免一个 fd 饿死其他 fd。提示多路复用不是银弹它省的是线程/进程开销不省带宽。如果各路总带宽超过物理介质容量再怎么复用都会丢包。4. 数据编码从比特到波形别让第一公里就翻车4.1 常见线路编码的选型对比数据编码解决的是“比特怎么变成电平”。NRZ 最简单但长连 0 或 1 时没有跳变接收端时钟会漂。曼彻斯特编码每比特中间都有跳变时钟恢复容易但带宽翻倍。4B/5B 用 5 bit 表示 4 bit保证足够的跳变效率 80%。8B/10B 类似效率 80%但直流平衡好高速串行常用。编码方式效率时钟恢复直流平衡典型场景NRZ100%差差短距离板内曼彻斯特50%好好以太网 10M4B/5B80%好较好百兆以太网8B/10B80%好好PCIe、SATA选型时先看距离和速率。板内 I2C 用 NRZ 就行因为距离短、有独立时钟线。长距离背板或光模块必须用 8B/10B 或 64B/66B否则基线漂移会让接收端判决门限跑偏。4.2 用 Python 实现 4B/5B 编码并验证直流平衡下面这段代码把 4 bit 数据映射成 5 bit 码字并统计 0 和 1 的数量验证直流平衡# 4B/5B 编码表部分 encode_table { 0x0: 0b11110, 0x1: 0b01001, 0x2: 0b10100, 0x3: 0b10101, 0x4: 0b01010, 0x5: 0b01011, 0x6: 0b01110, 0x7: 0b01111, 0x8: 0b10010, 0x9: 0b10011, 0xA: 0b10110, 0xB: 0b10111, 0xC: 0b11010, 0xD: 0b11011, 0xE: 0b11100, 0xF: 0b11101, } def encode_4b5b(data_bytes): out [] for b in data_bytes: high encode_table[(b 4) 0xF] low encode_table[b 0xF] out.append((high 5) | low) return out def count_balance(codewords): ones sum(bin(c).count(1) for c in codewords) total len(codewords) * 10 return ones, total - ones data [0x00, 0xFF, 0xAA, 0x55] encoded encode_4b5b(data) ones, zeros count_balance(encoded) print(f编码后 1 的个数: {ones}, 0 的个数: {zeros})逻辑说明每个字节拆成两个 4 bit 半字节查表得到 5 bit 码字。参数上4B/5B 的码表设计保证了每组 5 bit 里至少两个 1、最多三个 1所以长期统计直流分量接近零。实际调试时如果接收端眼图闭合先看编码是否匹配有些 FPGA 的 SerDes 默认是 8B/10B你给 4B/5B 数据它不认。4.3 编码和调制的联合调试顺序我一般按“先编码、后调制”的顺序调。先用误码仪或 FPGA 发已知图案确认编码器输出正确再加调制看星座图最后接实际信道。如果一上来就联合调出了问题根本分不清是编码错还是调制错。血泪经验有一次 8B/10B 的 K 码没对齐接收端一直报 disparity error查了两天才发现是发送端复位后没有重新对齐码字边界。5. 避坑与排查数据通信调试中最容易翻车的 5 个点5.1 现象串口能收但全是乱码 → 原因波特率或数据位不匹配 → 解决先确认双方 termios 配置乱码九成是波特率不对或者停止位、校验位不一致。用stty -F /dev/ttyUSB0 -a看当前配置和发送端逐项对。注意有些 USB 转串口芯片在高波特率下误差大115200 以上建议用示波器量实际位宽。5.2 现象Wi-Fi 显示连接但吞吐极低 → 原因信道宽度和干扰不匹配 → 解决降带宽或换信道160MHz 看着爽但国内 5G 频段能干净跑 160MHz 的信道很少。先iw dev wlan0 scan看邻居如果目标信道有强信号把带宽降到 80MHz 或 40MHzMCS 反而能上去。别迷信“单信道”参数实际吞吐是带宽、调制阶数、编码率的乘积。5.3 现象select 返回可读但 read 不到数据 → 原因fd 被设置成阻塞且数据被其他进程读走 → 解决设非阻塞并检查 fd 归属select 返回可读只代表“读不会阻塞”不代表一定有数据。如果多个进程共享同一个 fd或者串口被另一个程序打开就会出现这种情况。用lsof /dev/ttyUSB0查谁占着。5.4 现象UWB 信道监听时距离一远就丢包 → 原因信道估计更新率跟不上 → 解决提高导频密度或降低移动速度UWB 的带宽大信道估计对定时非常敏感。如果接收端移动快LS 估计的旧值还没用完信道就变了。常见做法是缩短导频间隔或者用判决反馈做跟踪。5.5 现象I2C 多路复用切换后第一个字节总是错 → 原因切换后没有等待总线稳定 → 解决切换通道后加 10us 以上延时I2C 多路复用器切换通道时总线电容变化需要时间建立。很多驱动切换完立刻发 START从机还没准备好。加个udelay(10)就能解决别问我是怎么知道的。6. 进阶技巧用眼图和误码率把数据通信问题钉死前面讲的都是分块调试真正要定位一个偶发丢包得靠眼图和 BER 测试。眼图是把多个比特周期的波形叠加看张开度。张开度大说明噪声和抖动小闭合说明信道或时钟有问题。我一般用示波器的余辉模式抓差分信号或者用 FPGA 内部的 IBERT 核看眼图扫描。下面是一个用 Python 生成简单眼图的例子适合在没有高端示波器时做算法验证import numpy as np import matplotlib.pyplot as plt # 生成随机 NRZ 波形每个比特 32 个采样点 bits np.random.randint(0, 2, 1000) samples_per_bit 32 waveform np.repeat(bits, samples_per_bit) * 2 - 1 # 映射到 -1/1 # 加低通滤波模拟带宽限制 from scipy.signal import butter, lfilter b, a butter(2, 0.1) waveform lfilter(b, a, waveform) # 叠加眼图每 2 个比特周期画一段 eye_len 2 * samples_per_bit for i in range(0, len(waveform) - eye_len, samples_per_bit): plt.plot(waveform[i:ieye_len], colorblue, alpha0.05) plt.title(Eye Diagram (simulated)) plt.xlabel(Sample) plt.ylabel(Amplitude) plt.grid(True) plt.show()逻辑说明butter(2, 0.1)是二阶低通截止频率 0.1 倍采样率用来模拟信道带宽不足。参数上眼图张开度对应电压裕量交叉点抖动对应时钟抖动。实际测试时如果眼高小于接收端灵敏度就得加均衡或换编码。BER 测试则是发 PRBS 码型统计误码数一般要求 1e-12 以下。我自己的习惯是每做一个新链路先跑 24 小时 BER再上业务。别省这一步后悔药很贵。希望帮到你。本文还有配套的精品资源点击获取

相关新闻

Windows 上 DeepSeek 驱动 Claude Code:完整配置与实操指南

Windows 上 DeepSeek 驱动 Claude Code:完整配置与实操指南

看到越来越多人在 Windows 上折腾 Claude Code,但又受限于 Anthropic 官方 API 的种种门槛,我其实挺有感触的。这个组合——用 DeepSeek 的 API 去驱动 Claude Code 这个工具——听起来有点“借壳上市”的味道,但实际操作下来,思路…

2026/9/30 16:12:10 阅读更多 →
Keil MDK分散加载文件sct实战:多存储区与Bootloader配置

Keil MDK分散加载文件sct实战:多存储区与Bootloader配置

1. 分散加载文件到底是什么,为什么你的工程迟早要碰它做嵌入式开发的朋友应该都有这种经历:项目小的时候,Keil MDK 里点几下 Target 对话框,勾选 Flash 算法、填个 RAM 起始地址,编译下载一切正常;等到产品…

2026/9/30 16:12:10 阅读更多 →
SE-Res Block U型卷积神经网络:乳腺癌靶区分割实战指南

SE-Res Block U型卷积神经网络:乳腺癌靶区分割实战指南

简介:这份PDF文献面向医学影像与深度学习方向的研究者、放疗物理师及医工交叉专业学生,聚焦乳腺癌保乳术后放疗中临床靶区与危及器官的自动分割难题。研究在传统U-net基础上引入残差单元与SE注意力单元,构建SE-Res Block U型卷积神经网络&…

2026/9/30 16:12:10 阅读更多 →

最新新闻

Java向上转型与向下转型的本质与实战避坑指南

Java向上转型与向下转型的本质与实战避坑指南

1. 为什么“向上转型”和“向下转型”是Java面试绕不开的坎?你刚学完继承,写了个Animal父类,再写Dog、Cat子类,顺手new了Dog对象赋值给Animal变量——编译通过,运行正常。但当你试图调用Dog特有方法bark()时&#xff0…

2026/10/1 18:58:56 阅读更多 →
基于LDA模型对豆瓣长评论进行主题分词全流程解析

基于LDA模型对豆瓣长评论进行主题分词全流程解析

简介:基于LDA模型对豆瓣长评论进行主题分词的Python源码与数据包,是一份已通过导师指导并获97分的期末大作业,面向NLP课程设计、文本挖掘实践及毕业设计参考人群。项目完整、下载即用,可快速跑通从评论清洗、中文分词、停用词过滤…

2026/10/1 18:58:56 阅读更多 →
零基础用Unity6和C#实战2D RPG战斗系统:从输入到伤害反馈

零基础用Unity6和C#实战2D RPG战斗系统:从输入到伤害反馈

1. 为什么零基础做2D RPG战斗系统,反而比做完整游戏更靠谱 很多人一上来就想做一款完整的2D RPG,结果卡在背包系统、对话系统、任务系统里出不来,三个月过去连一场像样的战斗都没跑起来。我见过太多这样的案例,包括我自己早期也是…

2026/10/1 18:58:56 阅读更多 →
【信息科学与工程学】【通信工程】第四十四篇 城域网络设计101 基础设计02

【信息科学与工程学】【通信工程】第四十四篇 城域网络设计101 基础设计02

编号246——采矿业(B06煤炭开采)接入网及端到端设计 编号 类型 领域 学科 学科中涉及的知识、属性、因素、方程式、数值设计 关联知识、标准、法律法规和相关研究 246 接入层采矿业(煤炭)专网设计 接入层(采矿) 矿山通信 / 安全生产 / 工业控制 知识:煤矿井下…

2026/10/1 18:58:56 阅读更多 →
Django美容院优质客户筛选系统:基于RFM模型的毕设设计与实现

Django美容院优质客户筛选系统:基于RFM模型的毕设设计与实现

1. 先搞清楚:美容院优质客户筛选系统到底在筛什么想用Django做一套美容院相关毕设项目的人,大概率会搜到类似的标题:基于Python的美容院优质客户筛选系统。这个方向确实常青,我也在最近完整梳理并跑通过一套这样的系统&#xff0c…

2026/10/1 18:58:56 阅读更多 →
β-环糊精组合修饰全解析:PEG链连接FITC、Biotin、DBCO的设计与应用

β-环糊精组合修饰全解析:PEG链连接FITC、Biotin、DBCO的设计与应用

拿到“PEG-荧光素修饰β-环糊精,β-CD-PEG-FITC,β-CD-PEG-Biotin,DBCO-PEG修饰β-环糊精,β-CD-DBCO-PEG”这一串产品名时,多数人的第一反应是“这到底是个东西还是好几个东西”。其实这是一类典型的组合修饰型环糊精…

2026/10/1 18:57:55 阅读更多 →

日新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →

周新闻

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解

如何划分训练/验证集:Spirula Studio五种eval_mode策略详解 【免费下载链接】spirula-studio Cross-vendor 3D Gaussian Splatting trainer - video to splat to mesh, Vulkan or CUDA. 项目地址: https://gitcode.com/GitHub_Trending/sp/spirula-studio Sp…

2026/9/30 13:14:22 阅读更多 →
SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南

SEO怎么推广速查手册新手避坑实战指南 模板网站太丑不够用?别急着加滤镜,那是治标不治本。很多老板盯着后台流量掉得眼红,却还在纠结首页Banner的圆角是不是3像素。这就像穿着西装去挖土,姿势不对,努力白费。我整理这份 速查手册…

2026/9/30 18:13:06 阅读更多 →
FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏

FireRed-OpenStoryline少样本仿写深度解析:AI Agent如何复刻你的独特文案风格与节奏 【免费下载链接】FireRed-OpenStoryline FireRed-OpenStoryline is an AI video editing agent that transforms manual editing into intention-driven directing through natural language …

2026/9/30 13:14:49 阅读更多 →

月新闻

我发现了一个新思路:用 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/1 0:00:30 阅读更多 →
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/1 0:00:30 阅读更多 →
黑夜航拍船只数据集训练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/1 1:01:17 阅读更多 →