uniapp BLE蓝牙写入报错property not support全解析
如果你在uniapp里做BLE蓝牙开发writeBLECharacteristicValue:fail property not support这个报错绝对能排进最让人头疼的问题前三名。我最早遇到它是在一个智能穿戴设备的联调阶段APP这边连接设备、发现服务、发现特征值全部正常代码一执行到uni.writeBLECharacteristicValue就立刻触发fail回调报错信息只有孤零零这么一句连个错误码都不给全。当时我一度怀疑是蓝牙连接不稳定重连了好几次结果发现根本不是连接的问题。这篇文章我就把这个报错背后的原因、完整的排查思路和可以拿来直接用的解决方案讲透给还卡在这个坑里的朋友一条明确的出路。1. property not support这个报错到底在告诉你什么1.1 先把报错现场还原出来这个报错的触发位置非常固定就在调用uni.writeBLECharacteristicValue的那一刻。不管你往参数里传什么数据只要当前的特征值不满足写入条件fail回调就会立刻被触发。控制台打印出来的信息一般长这样writeBLECharacteristicValue:fail property not support稍微老一点的HBuilderX版本还会在后面多跟一个错误码格式大致是writeBLECharacteristicValue:fail property not support我见过不少人在网上问这个错底下的回答五花八门有人说要清蓝牙缓存有人说要重启手机还有人建议重新配对设备。这些办法我都试过没有任何一个能真正解决问题。原因很简单方向从最开始就错了。这个报错不是连接层面的问题也不是数据格式的问题而是BLE协议层面的一次属性校验失败。1.2 一句话理解这句报错直译过来property not support就是属性不支持。在BLE协议体系里每个特征值Characteristic不是你想读就能读、想写就能写的。设备端固件在定义特征值时会明确标注这个特征值支持哪些操作比如可读、可写、可通知、可指示等等。当你调用uni.writeBLECharacteristicValue时系统底层会拿特征值的属性跟你的写入动作做匹配一旦发现这个特征值根本不具备可写属性或者不匹配你指定的写入模式系统会直接拒绝这次写入并把错误抛回到你的fail回调里。这里有一个很关键的判断这个报错不是偶发性的只要特征值属性不匹配它100%会触发。所以你不需要去怀疑是不是信号不好、连接断了之类的原因第一反应应该是去检查特征值的属性定义。把这个认知建立起来后面的排查就快多了。2. 为什么特征值属性这么容易踩坑2.1 BLE特征值属性一分钟看懂BLE设备上的数据服务由服务Service和特征值Characteristic组成。一个服务下面挂着多个特征值每个特征值承担不同的功能有的用来读取设备状态有的用来下发指令有的用来推送实时数据。特征值的属性决定了外部设备能对它做什么操作。属性名称权限标志含义uni-app的properties里怎么看读Read0x02客户端可以读取特征值中保存的数据item.properties.read写带响应Write0x04客户端写入数据后设备端会返回确认包item.properties.write写无响应Write Without Response0x08客户端只管写入设备端不返回确认标准API里没有直接暴露通知Notify0x10设备主动把数据推送给客户端不需要客户端确认item.properties.notify指示Indicate0x20类似Notify但设备会要求客户端确认收到item.properties.indicate日常开发中我们真正关心的写入操作实际上只涉及上表中的写带响应和写无响应这两个属性。很多人把注意力全放在properties.write这一个字段上忽略了无响应写入的存在所以才会在排查时走不少弯路。2.2 两种写入方式的区别带响应写入客户端发完数据之后设备端必须在ATT层返回一个确认包双方完成一次完整握手。它的优点是可靠数据有没有被设备收到客户端能马上知道缺点是交互次数多速度相对慢设备端的实现也要复杂一些。无响应写入则简单粗暴客户端把数据发出去就算完事设备端不返回任何确认包。它的优势是速度快特别适合高频数据流指令缺点是数据发出去之后客户端无法直接确认设备是不是真的收到了只能通过后续设备主动上报的数据来判断。我平时给朋友解释这两种模式时常拿寄快递打比方带响应写入就像寄快递要签收对方收到后你明确知道到了无响应写入就像把信从门缝里塞进去塞完就转身走人至于对方什么时候看信你完全不知道。实际使用中很多嵌入式设备为了节省功耗和简化协议栈只实现了无响应写入这一种模式这就给上层应用埋下了属性不匹配的隐患。2.3 Android和iOS的差异同一个报错在Android和iOS上出现的方式是完全不同的。Android端底层是BluetoothGattCharacteristic特征值属性里包含PROPERTY_WRITE和PROPERTY_WRITE_NO_RESPONSE两个标志位。uni-app在Android原生层封装蓝牙能力时如果发现当前写入方式跟特征值属性对不上转译出来的文案很可能就是property not support。iOS端走的是CoreBluetooth框架用的属性定义是CBCharacteristicProperties。如果写入方式不匹配系统返回的错误文案多半是Writing is not permitted之类听起来完全是另一套说法。这个差异导致了一个很常见的现象同一台蓝牙设备同一份uniapp代码在iOS上写入一切正常到了Android手机上就报property not support。不了解这个背景的人很容易怀疑是Android蓝牙不行实际上就是两个平台对同一种问题的表达方式不一样。如果你遇到iOS没问题Android报错的情况大概率已经命中了我们今天说的这个场景。3. 排查思路先确认是不是真不支持3.1 把特征值属性完整打印出来遇到property not support不要急着改代码先把你当前连接的服务和特征值属性全部打印出来。uniapp可以调用uni.getBLEDeviceCharacteristics拿到特征值信息里面的properties字段就是我们判断的依据。// 连接成功之后遍历服务和特征值 uni.getBLEDeviceServices({ deviceId: that.deviceId, success(res) { const services res.services || []; services.forEach((service) { uni.getBLEDeviceCharacteristics({ deviceId: that.deviceId, serviceId: service.uuid, success(characteristicRes) { const chars characteristicRes.characteristics || []; chars.forEach((item) { console.log(服务: service.uuid); console.log(特征值: item.uuid); console.log(读: item.properties.read); console.log(写: item.properties.write); console.log(通知: item.properties.notify); console.log(指示: item.properties.indicate); }); } }); }); } });我把这段代码叫做蓝牙体检清单。新接一个蓝牙设备时花一分钟把服务和特征值属性过一遍比对着设备文档猜要靠谱得多。控制台里会输出每个特征值的uuid和四个布尔属性数据一目了然。3.2 怎么判断该用哪种写入方式拿到打印结果之后需要结合设备端的蓝牙协议文档来判断如果item.properties.write为true且设备文档里写明这个特征值支持带响应写入那就用默认方式写基本不会出问题。如果item.properties.write为false但设备文档里写明该特征值支持无响应写入那应该使用writeType:writeNoResponse。如果两个条件都不满足说明这个特征值根本不是设计用来接收数据的你要检查一下是不是找错了特征值UUID。这里要特别提醒一个盲区uniapp标准API返回的properties对象里并没有直接暴露writeWithoutResponse这个布尔值。也就是说即使特征值是支持无响应写入的你在properties里也只看到一个write为false的结果压根看不出来它能不能无响应写。这时候文档就是最可靠的依据。如果手头没有文档也可以直接拿writeType:writeNoResponse试一次设备真正支持的话这次写入就会成功。3.3 两个常见的误判场景我见过不少开发者在排查这个报错时走进了两个明显的误区。第一个误区是我能收到设备的数据说明连接没问题为什么写不进。能收到数据走的是notify或者indicate通道跟写入通道是两码事。设备主动推送数据只代表它具备通知能力不代表它的特征值具备可写属性。这两者完全没有因果关系。第二个误区是服务和特征值都正常发现了怎么会不支持写入。发现服务成功只说明设备上存在这个特征值并不代表这个特征值允许你往里写数据。就像你看见一个门牌号知道这个房间存在不代表你能随意推门进去门锁不锁是另一回事。把这两个误区排除掉基本上就能锁定问题方向了要么是写入类型和特征值属性不匹配要么是你找错了特征值。4. 搞定它writeType与兼容写法4.1 标准解法writeType:writeNoResponse在较新的HBuilderX版本中uni.writeBLECharacteristicValue支持一个叫writeType的参数取值只有两个write和writeNoResponse。默认值是write也就是带响应写入。当你确定设备端特征值只支持无响应写入时把writeType显式指定为writeNoResponse即可。uni.writeBLECharacteristicValue({ deviceId: that.deviceId, serviceId: that.serviceId, characteristicId: that.characteristicId, value: buffer, // 注意必须是ArrayBuffer writeType: writeNoResponse, success(res) { console.log(写入成功, res.errMsg); }, fail(err) { console.error(写入失败, JSON.stringify(err)); } });就这么一个参数的改动很多设备的写入问题直接就能解决。如果你用的是老版本的HBuilderX在API里找不到writeType这个字段优先升级到新版本再试大多数情况下升级完问题就自然消失了。4.2 一个自动降级的通用写入函数实际项目里同一个设备可能同时提供多个可写特征值有的支持带响应有的只支持无响应写入。如果每次都靠人工判断代码会变得很啰嗦。我习惯封装一个通用的写入函数先尝试带响应写入一旦遇到property not support就自动降级为无响应写入整个调用方式保持统一。function writeHexToDevice(deviceId, serviceId, characteristicId, hexString) { return new Promise((resolve, reject) { const buffer hexStringToArrayBuffer(hexString); uni.writeBLECharacteristicValue({ deviceId, serviceId, characteristicId, value: buffer, writeType: write, success(res) { console.log(带响应写入成功); resolve(res); }, fail(err) { if (err.errMsg err.errMsg.indexOf(property not support) -1) { // 降级为无响应写入 uni.writeBLECharacteristicValue({ deviceId, serviceId, characteristicId, value: buffer, writeType: writeNoResponse, success(res) { console.log(无响应写入成功); resolve(res); }, fail(err2) { reject(err2); } }); } else { reject(err); } } }); }); }写数据前先确认一下特征值是否需要先订阅notify这里我多写了一道getBLEDeviceServices的调用其实是为了确认连接还在避免数据写出去之后连接已经断开导致误报失败。这个函数在我自己的多个项目里复用稳定性和可维护性都比到处复制粘贴强不少。4.3 数据格式转换别踩坑蓝牙API传输的数据必须是ArrayBuffer字节流不能直接传字符串。很多新手会想把一串十六进制字符串直接丢进去结果报invalid data这其实是另一个常见错误。正确的做法是先把字符串转成ArrayBuffer。// 十六进制字符串转ArrayBuffer function hexStringToArrayBuffer(hex) { hex hex.replace(/\s/g, ); const buffer new ArrayBuffer(hex.length / 2); const dataView new DataView(buffer); for (let i 0; i hex.length; i 2) { dataView.setUint8(i / 2, parseInt(hex.substring(i, i 2), 16)); } return buffer; } // ArrayBuffer转十六进制字符串调试日志用 function arrayBufferToHex(buffer) { const bytes new Uint8Array(buffer); let hex ; for (let i 0; i bytes.length; i) { hex bytes[i].toString(16).padStart(2, 0); } return hex; }在调试写入结果时用arrayBufferToHex把收到的数据转成能看懂的十六进制字符串比直接打印ArrayBuffer对象要直观得多。这在排查数据对错时几乎是必备工具。4.4 别忘了先订阅notify很多设备的设计逻辑是APP写入一条指令后设备通过notify通道把结果返回给APP。这种情况下如果APP还没有订阅notify就急着写数据后续返回的数据你根本收不到看起来就像是写入失败了。虽然这不是property not support的根因但会让排查过程变得非常混乱。正确的操作顺序应该是连接设备、发现服务、发现特征值、订阅notify、等待订阅成功回调、然后再写入指令。订阅notify的动作对应uni.notifyBLECharacteristicValueChange订阅成功后再写数据设备返回的数据才能顺利回传到uni.onBLECharacteristicValueChange里。5. 实战复盘三个真实案例的排查过程5.1 案例一手环设置目标步数上报property not support某项目里需要给手环下发每日目标步数我选的这个特征值就是标准的自定义属性。连接设备后getBLEDeviceCharacteristics打印结果显示properties.write是falseproperties.notify是true。当时第一反应是找错了特征值把设备文档翻出来核对了一遍确认UUID没错但文档里明确写着一行字该特征值仅支持Write Without Response。问题一下就清晰了。这个特征值压根就不是用来带响应写入的它只支持无响应写。解决办法就是在调用写入时加上writeType:writeNoResponse改完这一行目标步数数据成功下发设备端也正确执行了。这个案例是最典型的一种设备端为了简化协议栈只实现了无响应写入而我们的业务代码默认走了带响应写入自然被拒。5.2 案例二蓝牙血糖仪只能在Android上报错另一个项目里的血糖仪设备同一个特征值在iOS上写入一切正常换到Android手机就报property not support。iOS的报错文案是Writing is not permittedAndroid直接来一句property not support乍一看像是两个完全不同的问题。排查时我用Android原生调试才发现这个特征值的属性标志里PROPERTY_WRITE位数很低主要属性是PROPERTY_WRITE_NO_RESPONSE。iOS的CoreBluetooth在处理写入时对属性匹配相对宽松Android却比较严格于是同一个业务代码在两个平台上的表现完全不同。最终解决方案也是统一改成writeType:writeNoResponseAndroid端问题消失iOS端也不受影响。实际中很多设备都会出现这种平台差异安卓上遇到写入错误多换个方式测试真的很重要。5.3 案例三写入大包数据被当成了不支持的写入还有一个案例是给某自研蓝牙传感器OTA升级APP这边要往特征值里写入一包512字节的固件数据结果只要写入就报property not support。我当时半天没想通明明特征值属性没问题为什么一写大包就失败后来跟设备端固件工程师一聊才明白问题是数据长度超过了双方协商的MTU。Android系统默认BLE MTU只有23字节扣掉ATT层开销实际一次能传的应用数据只有20字节左右。一次写512字节数据长度超过了对端能接受的单包长度底层直接拒绝错误就被转译成了property not support。解决办法是用uni.setBLEMTU先把MTU协商到512同时把大包拆成一个个不超过MTU的小包按顺序发送每包之间加一点延时。改完之后OTA升级流程就正常了。6. 避坑速查表与调试经验6.1 蓝牙写入常见报错对照表报错信息可能原因处理办法property not support特征值属性不支持当前写入模式切换writeType或核对特征值UUIDinvalid data传入的数据不是ArrayBuffer用hexStringToArrayBuffer转换device not connected连接已断开或设备休眠重新建立连接确认设备在线GATT ERROR系统底层蓝牙协议栈异常重启蓝牙适配器清缓存重连timeout写入超时或设备未及时响应降低写入频率减少单次数据量这个速查表是我在多个项目里攒出来的经验遇到蓝牙写入类问题先对着表格看自己是哪种情况再动手改代码效率会高很多。6.2 几条扎心的实战经验第一同型号手机在蓝牙协议栈上也可能有差异。我在项目里遇到过同一份代码某台手机写入正常另一台同品牌同型号的手机却报property not support的情况。所以排查问题时尽量多找两台不同品牌的手机做对比测试别只盯着一台设备怀疑。第二写入频率太高的设备处理不过来也会报错而且报错信息可能千奇百怪。对需要连续写入多条指令的场景建议自己做一个发送队列每发一条等设备处理完或者等待固定间隔再发下一条。这样不光能减少报错概率还能让设备端处理得更加从容。第三writeNoResponse模式下fail回调其实并不能说明数据有没有发出去。因为设备端不返回确认fail回调更多是代表写入操作没有被本地接受。要想确认设备真的收到了指令标准做法是看设备后续有没有通过notify把数据回传回来。理解了这一点你就能看懂为什么有些时候明明回调成功了设备却没有任何反应反而要等一轮数据回传才能真正确认指令生效。我把这个报错完整梳理完之后最大的感受是BLE开发里的很多问题表面上看是代码写错了实际上是对协议本身的理解还有一个缺口。property not support这个报错最初看起来像是设备不支持写入但深入了解特征值属性后就会发现大多数情况下它只是告诉我们别用这个方式写。换一种写入类型整个流程就通了。如果你手上正好有设备在报这个错按照上面介绍的方法先打印特征值属性再确认设备支持的写入方式最后把writeType设置对这个问题大概率就能收工了。

相关新闻

克里金插值与协同克里金源码实战:从变异函数到估计方差

克里金插值与协同克里金源码实战:从变异函数到估计方差

简介:面向空间统计与地学环境领域的数据处理需求,这是一套MATLAB实现的克里金与协同克里金插值代码。资源覆盖半方差函数计算与模型拟合、克里金权重求解、多变量协同预测等核心环节,可帮助初学者及需要快速上手的研发人员把理论方法转化为可…

2026/10/17 5:32:26 阅读更多 →
从“看春晚”到“玩春晚”:人机交互风格转变的技术与设计启示

从“看春晚”到“玩春晚”:人机交互风格转变的技术与设计启示

春晚的节目单一年比一年难猜,但观众参与的方式,变化比节目本身更剧烈。近几年我最大的感受是:大家不再只是坐在电视机前“看”晚会,而是拿着手机“玩”晚会,甚至对着电视“喊”晚会——这背后是整个制作团队对人机交互…

2026/10/17 5:32:26 阅读更多 →
华为QoS实战:从硬件队列到业务感知的全链路配置与排错

华为QoS实战:从硬件队列到业务感知的全链路配置与排错

1. 为什么“QoS”不是配置命令,而是一套网络生存逻辑在某次跨部门协同的项目复盘会上,一位负责终端接入的同事指着监控图说:“核心交换机CPU一直75%,但所有端口带宽利用率不到30%,到底卡在哪?”——这问题背…

2026/10/17 5:32:26 阅读更多 →

最新新闻

Next.js项目Playwright自动化测试实战指南

Next.js项目Playwright自动化测试实战指南

1. 为什么用 Playwright 给 Next.js 项目做自动化测试去年年底我接手了一个跑了两年的 Next.js 后台管理系统,功能越加越多,每次发版前都要靠人工把核心流程点一遍,点得人昏头昏脑。后来我下定决心补自动化测试,选型选了一圈,最终还是用 Playwright 落地了全套端到端用例。这篇…

2026/10/17 6:11:35 阅读更多 →
C++实现QQ宠物:状态机与离线时间演算技术解析

C++实现QQ宠物:状态机与离线时间演算技术解析

1. 为什么今天还要用C重写一个“QQ宠物”?你可能第一反应是:这玩意儿不是早淘汰了吗?网页版都停运十几年了,现在连怀旧服都没人搭理,还花时间用C从零写一个养成类游戏?图啥?图编译慢&#xff0c…

2026/10/17 6:11:35 阅读更多 →
周报不只是汇报:从信息梳理到结果呈现的写作方法论

周报不只是汇报:从信息梳理到结果呈现的写作方法论

1. 先说清楚:为什么我对“写周报”这件事认真了周报,大概是职场上最容易被低估的一项日常任务。刚工作那几年,我把周报当成周五下午的“例行公事”,能凑就凑,三五行字打发完事。直到有一次临到季度考核,我翻…

2026/10/17 6:11:35 阅读更多 →
软件需求规格说明书SRS写作指南:从需求条目到验收标准

软件需求规格说明书SRS写作指南:从需求条目到验收标准

简介:这份软件需求规格说明书文档面向软件开发人员、需求分析师及计算机相关专业学生,聚焦商品管理模块的完整需求建模过程,可作为课程设计、毕业设计或实际项目需求文档的参考模板。压缩包内共1个doc文件,约577KB,内容…

2026/10/17 6:11:35 阅读更多 →
大型制造企业IT蓝图规划:从业务战略到产品数据域的落地拆解

大型制造企业IT蓝图规划:从业务战略到产品数据域的落地拆解

简介:这是一份面向大型制造企业信息化规划场景的PPT资料,适合企业IT负责人、信息化规划人员、业务架构师及数字化咨询顾问参考。内容以IT蓝图规划与实施路线为主线,从业务战略输入出发,系统梳理业务架构、信息架构、应用架构、技术…

2026/10/17 6:11:35 阅读更多 →
网页视频下载免费指南:猫抓一键嗅探加密 M3U8

网页视频下载免费指南:猫抓一键嗅探加密 M3U8

网页视频下载免费指南:猫抓一键嗅探加密 M3U8 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 网课只有在线看、访谈视频右键只存得下图…

2026/10/17 6:10:34 阅读更多 →

日新闻

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/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练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 阅读更多 →