ESP-12F实现WiFi数据透传源码详解:从原理到稳定运行
接触过不少串口设备联网的项目凡是涉及到WiFi数据透传我基本都会先问一句能不能用ESP-12F这不是因为它参数多惊艳而是这类需求里它往往用最少的成本把串口数据搬上网络。今天这篇就围绕ESP-12F实现WiFi数据透传的源码来写把我实际验证过的方案、代码和坑一起整理出来。数据透传听起来简单真正做过的人都知道稳定跑起来是个细活。串口那边一直来数据网络那边随时可能断开WiFi信号忽强忽弱服务器偶尔不响应任何一个环节没处理好透传就变成“传着传着就丢了”。如果你正在做传感器采集、工控设备联网、Modbus转WiFi之类的项目或者打算用ESP8266系列做透明传输这篇文章应该能帮你省掉不少弯路。我会从选型思路、硬件注意点、源码设计、烧录联调一直讲到故障排查尽量把能踩的坑都提前标出来。1. 项目定位为什么需要“WiFi数据透传”1.1 数据透传的本质是什么透传这个词听起来有点玄其实干的事情非常朴素把一端的数据原封不动地搬到另一端。比如一个温湿度传感器通过串口输出字节流模块收到之后不拆包、不解析、不改写直接封装成TCP或UDP包发到服务器反过来服务器下发的数据模块解包之后原封不动地从串口丢给下位机。整个过程里WiFi模块扮演的是“透明管道”的角色。这样做最大的好处是下位机的业务逻辑完全不用动。原来跑有线串口的代码换了WiFi模块之后设备端仍然认为自己在跟一个串口设备通信。服务器端也简单收到的就是原始字节流怎么解析是自己的事。对很多项目来说这意味着改造时间可以压缩到几天而不是重新设计一套通信协议。我见过不少团队纠结要不要自己写协议栈、加校验、做分包重组结果项目拖了一两个月还没上线。其实大部分场景根本不需要在模块里做协议解析透传出去由两端的主机自己处理就够了。这也是为什么“ESP-12F 模块实现wifi数据透传源码”这类需求会反复出现大家要的不是花哨功能而是一条稳定、延迟可控、掉线能恢复的数据通道。1.2 典型应用场景和选型理由透传最常见的一类场景是串口设备上网。比如车间里的老式仪表只有RS232或者RS485口没有网口也没有WiFi想把它接到中心平台直接在设备外面挂一个ESP-12F模块就能搞定。模块一端接TTL串口另一端连路由器仪表数据就能出现在几千公里外的服务器上。另一类场景是移动端直连。设备本身做热点手机或者平板连上模块的WiFi通过Socket直接跟设备通信。这时候不需要外部路由器模块工作在AP模式串口数据可以在设备和手机之间来回透传。调试参数、固件升级、现场配置都很方便。选ESP-12F而不是其它方案原因很实际。第一是成本一颗模块加上周边电路十几块钱级别就能解决比用Linux方案划算太多第二是封装2.54mm间距的排针或者邮票孔手工焊接完全没问题打样阶段特别舒服第三是生态基于ESP8266的参考资料、示例代码和在线讨论非常多遇到问题基本都能搜到答案第四是功耗虽然不算极致低功耗但比动不动几百毫安的方案好控制电池类应用搭配Deep Sleep也能做。当然它也有短板。GPIO有限、内存只有几十KB可用、并发连接数不高这些决定了它不适合干太重的活。但纯透传这个用途恰好落在它的甜点区里。2. 硬件准备与基础配置2.1 ESP-12F模块的硬件要点ESP-12F是在ESP-12E基础上改版的产品核心是ESP8266EX芯片板载4MB FlashPCB天线引脚间距2.54mm焊盘间距够大飞线也能用。很多开发板上印的“NodeMCU”方案其实也是这套核心但独立模块比开发板更适合嵌入到最终产品里。供电是个容易被低估的环节。ESP-12F启动瞬间电流可能冲到300-400mA如果稳压芯片或者电源线撑不住最常见的表现就是上电后模块反复重启。建议给模块单独一路3.3V供电至少留500mA余量滤波电容不要省模块VCC附近并一个100uF电解电容和一个0.1uF陶瓷电容会比裸奔稳定很多。电平转换也一定要做。模块串口是3.3V电平如果下位机是5V单片机串口TX直接接过来长期运行风险很大。正确做法是加电平转换芯片或者电阻分压至少不能拿5V信号硬怼模块引脚。引脚方面ENCH_PD必须拉高有些模块内部已经做了上拉但外置电路建议再补一个10K上拉方便后期控制复位GPIO15要下拉否则部分型号启动异常GPIO0在正常运行时悬空或者拉高就好只有烧录时才需要拉低。另外天线区域要留净空不要被金属外壳完全罩住否则信号衰减会让你怀疑人生。2.2 开发方式选择AT固件还是SDK源码ESP-12F开发路径至少有两条一条是用现成的AT固件一条是用SDK写源码。AT固件的方式简单粗暴模块上电后通过串口发AT指令让它连WiFi、建立TCP连接、进入透传模式。优点是不需要编译环境随便一个串口助手就能调缺点是灵活性差指令交互有额外延迟而且透传过程中遇到异常状态处理起来很别扭。做原型验证可以做产品就有点勉强。SDK源码方式直接基于芯片原厂SDK写代码串口数据走中断或DMA进缓冲区网络数据走协议栈回调整个数据通道自己掌控。调试难度虽然高一些但能做到延迟更低、行为更可控、代码更紧凑。第二种也是“源码”这两个字的真正含义所在。下面我展开的全部内容都基于SDK开发方式。2.3 SDK环境搭建搭建环境的第一步是准备工具链。ESP8266的SDK目前主流还是NONOS SDK和RTOS SDK两个分支透传项目用NONOS SDK就够代码结构直观espconn接口用起来很方便。工具链通常包含编译器和烧录工具建议直接使用官方提供的预编译工具链自己从源码编译工具链虽然能学到东西但很费时间而且容易卡在环境变量上。工程结构大致是这样的app/ user/ user_main.c # 程序入口初始化WiFi和UART user_uart.c # UART驱动和数据接收处理 user_tcp.c # TCP连接和发送逻辑 driver/ include/我习惯把UART处理和网络处理分开成两个文件逻辑清晰后期维护也轻松。Makefile不用自己写SDK自带模板改一下模块型号、波特率、编译输出目录就能用。烧录的时候需要把模块GPIO0拉低再上电进入下载模式。之后用烧录工具把编译出来的多个bin文件按照偏移地址写进去。常见的地址分配是0x00000、0x1000、0x200000这类组合不同SDK版本略有差异具体以编译输出和原厂文档为准。第一次烧录如果启动不了多半是bin地址或者Flash大小设置错了跟代码本身关系不大。3. 透传源码核心设计3.1 数据链路设计与数据流向透传源码的核心可以概括成两条单向管道。第一条管道是串口到网络。UART收到下位机数据触发中断中断服务程序把数据搬运到内存缓冲区主循环或者发送回调再从缓冲区取出数据调用网络接口发送到远端。这条管道要解决的核心问题是“数据来了但网络忙”时的缓冲以及“网络空闲但缓冲没数据”时的等待。第二条管道是网络到串口。TCP或者UDP收到服务器数据协议栈回调触发回调函数把数据取出来写入UART发送寄存器。这条管道要解决的核心问题是UART发送速度跟不上网络到达速度时的阻塞以及串口TX还没发完新数据又到了的冲突。理想情况下两条管道互不干扰全双工工作。实际上因为ESP8266的内存和UART FIFO都很有限必须做好缓冲和流控。3.2 关键接口和参数说明先看网络部分。NONOS SDK里提供了一套轻量级的TCP/IP接口封装在espconn里。我常用的接口有下面几个接口作用espconn_init初始化网络连接结构体espconn_regist_connectcb注册连接成功回调espconn_regist_recvcb注册数据接收回调espconn_regist_sentcb注册数据发送完成回调espconn_regist_disconcb注册连接断开回调espconn_connect发起TCP连接espconn_sent发送数据espconn_disconnect主动断开连接espconn_get_connection_info获取连接信息这些接口的回调机制是NONOS SDK的核心。连接建立、数据到达、发送完成、连接断开都是异步通知。如果你写惯了单片机的轮询代码第一次接触可能会不适应但透传这种对实时性要求高的场景回调方式反而是最合理的。串口部分需要配置的要素不多波特率、数据位、停止位、校验位。透传场景下下位机是什么格式UART就得配什么格式常见组合是115200-8-N-1也有9600-8-N-1的老设备。具体由下位机决定模块只是跟随。3.3 源码实现TCP透传示例下面给出一个经过简化但能说明核心逻辑的TCP客户端透传示例。为了重点讲透传链路WiFi初始化和协议栈初始化部分先省略。先定义缓冲区结构#define UART_RX_BUF_SIZE 2048 typedef struct { uint8_t data[UART_RX_BUF_SIZE]; uint16_t head; uint16_t tail; uint16_t count; } ring_buffer_t; static ring_buffer_t uart_rx_buf;串口中断接收数据只把数据放进缓冲区不在这里处理网络发送void uart0_rx_intr_handler(void *para) { uint8_t ch; while (UART0_RXFIFO_COUNT() 0) { ch READ_PERI_REG(UART0_FIFO_REG); if (ring_buffer_count_free(uart_rx_buf) 0) { ring_buffer_write(uart_rx_buf, ch); } else { // 缓冲区满了这里需要统计丢包次数 } } }主循环发送部分采用“有数据就发没数据就等”的策略void tcp_send_loop(void) { uint16_t len 0; uint8_t tmp[128]; if (tcp_connected_flag ! 1) { return; } // 从缓冲区取一段数据 len ring_buffer_read(uart_rx_buf, tmp, sizeof(tmp)); if (len 0) { espconn_sent(tcp_conn, tmp, len); } }这里需要特别注意的是espconn_sent是异步的发送返回成功不代表数据已经发出。想要保证不丢包应该等到发送完成回调之后再继续发送下一段数据。如果不管发送回调而疯狂调用spconn_sent协议栈内部缓冲会很快塞满返回值变成失败逻辑就全乱了。网络接收回调部分把收到的数据从串口发出去void tcp_recv_cb(void *arg, char *pdata, unsigned short len) { uart0_send_buffer((uint8_t *)pdata, len); }如果不关心分包边界网络收到的数据直接交给UART实现起来非常简单。连接断开后需要做重连。我一般会维护一个tcp_connected_flag标志断线回调里置零然后在主循环中尝试重新连接服务器void tcp_discon_cb(void *arg) { tcp_connected_flag 0; // 启动重连定时器 system_timer_renew(); }TCP断线不像串口断线那么直观网络连接可能因为路由器重启、服务器超时、信号消失而断开。模块自己很难立刻感知所以通常要配合心跳机制来判断链路活性。4. 实操过程从源码到稳定运行4.1 编译与烧录如果你第一次接触ESP8266 SDK先从最简单的工程模板开始不要一上来就塞一堆业务代码。我的习惯是先把串口打印调通能通过串口看到模块的启动日志再往上加网络逻辑。编译步骤大概是cd SDK_ROOT make clean make COMPILEgcc BOOTnone APP1 SPI_SPEED40 SPI_MODEDIO SPI_SIZE_MAP4编译完成后会在输出目录生成多个bin文件。烧录时我比较常用esptool命令行python esptool.py -p /dev/ttyUSB0 write_flash \ 0x00000 eagle.flash.bin \ 0x10000 eagle.irom0text.binESP-12F是4MB Flash烧录地址和Flash大小参数要匹配。如果用IDE类工具图形界面上选好模块型号和Flash大小再把bin文件拖到对应地址点烧录就行。烧录前记得GPIO0接地同时让模块重新上电否则工具会一直报“等待上电同步”。4.2 联调步骤从串口到服务器的完整验证烧录完成后第一步不是直接传业务数据而是验证链路。先把模块连接路由器。打开串口助手波特率设为与模块代码一致的115200观察启动日志。确认WiFi连接成功后在电脑上开一个TCP服务器监听工具记录下电脑的局域网IP比如192.168.1.88端口开在8000。然后让模块主动连接这个服务器或者用命令触发连接。连接建立后验证第一方向串口工具发一串数据“ABC123 测试”观察TCP服务器端是否收到完全相同的字节。再验证第二方向服务器发送“ping”观察串口助手是否显示“ping”。两个方向都通说明最基础的透传链路已经通了。接下来加一个测试持续发送大数据包。比如串口工具循环发送10000字节中间不停顿看服务器端能不能收全。如果丢失严重说明缓冲区和发送节奏有问题需要回源码里调。这个测试一定要做很多看起来正常的透传小包没问题大包一压测就露馅。4.3 稳定性优化缓冲区设计、心跳与重连透传的稳定性一半靠缓冲区一半靠状态管理。缓冲区设计上一个核心指标是“服务器TCP发送窗口和本地UART速率之间的匹配度”。假设波特率115200理论速度约11.5KB/s而WiFi实际吞吐可能更高也可能更低取决于信号和路由器。当WiFi变慢时串口数据还在源源不断进来缓冲区就要吸收这个差值。缓冲区太小数据被丢弃缓冲区太大内存又吃紧。我的做法是给串口接收分配2048字节的环形缓冲区再配合一个发送队列。主循环每次读取不超过128字节发完等待回调。这样既能充分利用网络带宽也不会一次占用太多内存。对ESP8266来说2048字节的内存开销是可以接受的再大就要权衡了。心跳机制可以参考下面的代码逻辑static uint32_t last_heartbeat_time 0; void heartbeat_check(void) { if (tcp_connected_flag 1) { if ((system_get_time() - last_heartbeat_time) HEARTBEAT_INTERVAL_US) { espconn_sent(tcp_conn, (uint8_t *)hb, 2); last_heartbeat_time system_get_time(); } } }这里的心跳包内容可以是任意双方约定的字节关键是让服务器知道这个连接还活着。服务器端如果连续多次没收到心跳就可以主动断开过期连接避免僵尸连接堆积。重连逻辑也不难但有几个细节需要注意。重连间隔不要太短否则模块会一直在连接-失败-重连的循环里空转还会影响路由器稳定性。建议3-5秒重试一次每次连接失败后重置计时器。连续失败多次后可以考虑重启WiFi接口把无线驱动状态彻底刷新一遍。5. 常见问题与排查技巧5.1 经典故障速查表现象常见原因处理方法上电后模块反复重启供电不足或EN脚抖动换稳压电源、加大电容、EN加10K上拉串口输出乱码波特率不匹配或电平不对核对波特率检查串口电平是否是3.3V能搜到WiFi但连不上路由加密方式不兼容/天线虚焊改WPA2-PSK补焊天线或调整方向TCP连接一直失败服务器IP或端口错误确认网络在同一网段检查服务器监听状态小包正常大包丢失发送缓冲配置不当改用发送完成回调驱动发送避免暴力调用运行一段时间后无响应TCP被服务器或路由器断开增加心跳和自动重连逻辑烧录失败GPIO0未拉低或Flash设置错误重新拉低GPIO0上电核对烧录地址这些现象里我最常遇到的就是“模块运行几分钟后掉线”。不少人的第一反应是代码问题但实际原因往往是路由器开启了AP隔离或者DHCP租约时间太短导致IP变更。排查的时候不要只盯着模块端服务器端日志和路由器的连接列表一定要一起看。5.2 源码中容易忽略的三个坑第一个坑是在串口中断里做太多事。ESP8266的UART中断里应该只做数据搬运把字节写进环形缓冲区千万不要在这里调用延时、打印或者网络发送。中断里面一旦耗时过长会影响系统时钟和其他中断甚至导致看门狗复位。第二个坑是忽略espconn_sent的返回值。它返回成功只代表协议栈接受了数据不代表对方已经收到更不代表可以立刻再发下一包。真正可靠的写法是维护一个“是否在等待发送完成”的状态位只有收到发送回调后才能继续发下一包。第三个坑是不关注UART发送完成状态。串口发送虽然不复杂但如果速度超过外设承受能力或者TX仍然忙时就写入新数据可能造成字节覆盖。更稳妥的做法是使用UART发送FIFO或者至少在写TX寄存器前检查发送状态位。从经验上看只要把这几个坑避掉透传项目基本就能稳定运行了。剩下的更多是场景适配问题比如服务器协议、加密方式、设备数量这些已经不是模块本身需要操心的事了。结尾一些实际经验我第一次做ESP-12F透传的时候把代码写完之后信心满满地联调结果服务器收到的数据每隔几十个字节就丢一段。排查了两天最后发现是串口接收缓冲区太小WiFi发送速度一波动数据就溢出了。后来我把缓冲区改成2048字节并把发送逻辑改成“回调驱动”丢包率直接从惨不忍睹降到了零。这个经历给我最深的体会是透传源码本身不难难的是把它调到一个“长时间运行也不出问题”的状态。如果你也在做类似的模块开发建议从一开始就预留好缓冲区空间规划好心跳和重连机制联调的时候多做大数据量压测别只发几十个字节就宣布功能完成。另外准备一个USB转TTL工具和一台能看到TCP数据的电脑排查问题的效率会翻倍。ESP-12F这套方案做成原型很容易做成产品确实需要耐心但真把它调稳了后续维护成本其实很低。

相关新闻

口碑型AI大模型聚合平台:可用性优先的工程实践指南

口碑型AI大模型聚合平台:可用性优先的工程实践指南

1. 项目概述:为什么需要一个“口碑较好”的AI大模型聚合平台?最近两个月,我陆续给三类不同背景的朋友搭过AI工具环境:一位是某高校人文学院的导师,想用大模型辅助文献综述和教学案例生成;一位是某电商公司的…

2026/10/13 22:13:54 阅读更多 →
基于UG的框架断路器抽屉座运动仿真完整实现链路

基于UG的框架断路器抽屉座运动仿真完整实现链路

1. 项目到底做什么:一套“三维模型运动仿真”的完整落地链路低压电器行业里,框架断路器的抽屉座是柜体与断路器本体之间最关键的活动结构。它承担两个任务:一是让断路器能轻松抽出检修,二是保证推进过程中一次触头、二次接插件能准…

2026/10/13 22:13:54 阅读更多 →
Nmap端口扫描原理与实战:从协议交互到生产级验证

Nmap端口扫描原理与实战:从协议交互到生产级验证

1. 这不是“黑客工具”,而是一把网络世界的万能卡尺很多人第一次听说Nmap,是在某部影视作品里——主角敲几行命令,屏幕上瀑布般滚过IP和端口,三秒后就黑进了对方服务器。这种刻板印象害了不少人:要么把它神化成无所不能…

2026/10/13 22:13:54 阅读更多 →

最新新闻

问题:ubuntu与linux开发板互ping

问题:ubuntu与linux开发板互ping

一、问题原理要解决ubuntu与开发板互ping的问题,就是要使ubuntu和开发板在同一个网段上面。本次问题解决环境:开发板 和 windows 均通过wifi的方式连接网络。二、解决方法1、首先将ubuntu设置成桥接模式状态栏上方点击 虚拟机,点击 设置&…

2026/10/14 3:05:32 阅读更多 →
2026年全国3D溜溜网云渲染速度表现及选购参考指南

2026年全国3D溜溜网云渲染速度表现及选购参考指南

云渲染服务核心评估维度与行业标准当前3D设计领域数字化服务需求持续增长,云渲染服务已成为设计师提升出图效率的核心工具,不同平台的服务能力差异较大,明确统一的评估标准可帮助用户降低选型成本。对于同时承接3个家装项目、自有设备单张4K效…

2026/10/14 3:05:32 阅读更多 →
Chat2DB:开源AI数据库终端,自然语言转SQL的工程实践

Chat2DB:开源AI数据库终端,自然语言转SQL的工程实践

简介:Chat2DB是一款面向软件开发者的AI驱动型开源数据库管理工具,专为降低SQL使用门槛而设计,特别适合非数据库专家、初级开发者及数据分析师快速开展数据库查询、分析与迁移工作。资源包为项目源码压缩包(zip格式)&am…

2026/10/14 3:05:32 阅读更多 →
MySQL索引优化:从B+树原理到慢查询实战

MySQL索引优化:从B+树原理到慢查询实战

做后端开发这几年,最常被拉到群里去救火的场景,十有八九是数据库慢查询。系统跑得好好的,突然某天接口变慢、CPU飙高,一看日志全是SELECT走了全表扫描,几百万行的表一次查询几秒钟才回来。这种时候,十次里有…

2026/10/14 3:05:32 阅读更多 →
RGF_CJ 全局函数全解析:从应用生命周期、系统定时器到窗口与指针互操作

RGF_CJ 全局函数全解析:从应用生命周期、系统定时器到窗口与指针互操作

图形学桌面应用 【免费下载链接】RGF_CJ RGF是仓颉Windows系统下的通用渲染框架(兼应用开发框架)。RGF仓颉版(后续简称"RGF")基于RGF(C/C版)封装优化而来。RGF为开发者提供轻量化、安全、高性能以及高度一致性的2D渲染能…

2026/10/14 3:05:32 阅读更多 →
Python爬虫实战:手机APP数据抓取与解析全流程

Python爬虫实战:手机APP数据抓取与解析全流程

简介:这份PDF资料面向具备Python基础、对网络请求与爬虫开发感兴趣的技术爱好者与研发工程师,围绕手机APP数据传输的抓取与解析展开,重点讲解如何借助Fiddler抓包定位登录与话题接口,再通过urllib2构造HTTP请求、携带Header与表单…

2026/10/14 3:04:31 阅读更多 →

日新闻

AnyPS5通用适配层设计:兼容性与性能的工程取舍

AnyPS5通用适配层设计:兼容性与性能的工程取舍

1. 从"AnyPS5"这个名字说起:它到底想解决什么问题第一次看到"AnyPS5"这个标题,我脑子里冒出来的第一个念头是:这大概率是一个围绕"跨平台运行"或者"通用适配"做文章的项目。名字里的"Any"…

2026/10/14 0:00:41 阅读更多 →
Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

Flutter跨平台开发实战:二手交易应用与HarmonyOS适配

1. 项目概述:Flutter跨平台二手交易应用开发作为一名长期从事移动应用开发的工程师,我最近完成了一个基于Flutter框架的二手物品交易平台项目。这个项目最吸引我的地方在于它完美结合了Flutter的跨平台优势与HarmonyOS的生态特性,实现了"…

2026/10/14 0:00:41 阅读更多 →
DFS算法解决飞机降落调度问题实战

DFS算法解决飞机降落调度问题实战

1. 项目背景与核心思路飞机降落问题是一个经典的调度优化场景,也是算法竞赛和面试中的高频题目。这个题目要求我们合理安排多架飞机的降落顺序和时间,确保所有飞机都能安全着陆而不发生冲突。在实际航空管制中,这类问题直接关系到飞行安全和机…

2026/10/14 0:00:41 阅读更多 →

周新闻

流感时间序列预测实战: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 阅读更多 →