ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

基于BW16与ESP32-CYD的轻量级EEG无线采集链路设计

基于BW16与ESP32-CYD的轻量级EEG无线采集链路设计 1. 项目概述一条从神经信号到可视界面的轻量级无线通路“从脑电模块到屏幕和网页我用 BW16 与 ESP32-CYD 搭建了一条无线 EEG 原型链路”——这个标题里藏着一个非常典型的嵌入式生物信号处理交叉场景。它不是在做医疗级诊断设备而是在验证一条可快速迭代、成本可控、数据链路清晰的EEG原型通路。核心关键词 BW16博流智能的BL602/BL606系列开发板常被社区简称为BW16、ESP32-CYD乐鑫ESP32-S3驱动的彩色LCD开发板带USB-C接口和内置TFT屏以及EEG、BLE共同指向一个明确目标把微弱的头皮电位变化经过前端调理、模数转换、无线传输、终端接收与可视化全程跑通且每一步都可观察、可调试、可替换。这条链路解决的实际问题很具体传统EEG实验依赖昂贵的商用采集系统如g.tec、Biosemi动辄数万元且软件封闭、二次开发门槛高而纯ArduinoAD8232方案虽便宜但蓝牙传输带宽受限、丢包率高、缺乏可靠连接管理导致波形跳变、时序错乱根本没法做哪怕最基础的α节律识别。我搭这条链路的出发点就是想确认一件事用国产RISC-V主控BW16做高信噪比EEG前端采集是否可行用ESP32-S3做BLE中心设备接收并转发至网页端延迟和稳定性能否满足实时观察需求答案是肯定的但过程远非“接线烧录”那么简单。BW16的ADC采样精度、参考电压稳定性、数字滤波资源ESP32-CYD的BLE GATT服务设计、多连接吞吐控制、WebSerial与WebSocket的桥接逻辑甚至一根屏蔽双绞线的焊接质量都会直接影响最终屏幕上看到的波形是平滑的正弦还是满屏雪花。这不是一个“玩具项目”而是把生物电信号采集这个专业领域里从模拟电路、嵌入式固件、无线协议栈到前端渲染的全栈能力压缩进两块百元级开发板里的实战检验。适合正在做毕业设计、创客项目、或想切入神经接口硬件开发的工程师也适合对“信号链”概念模糊、总卡在“为什么波形不对”环节的初学者——因为每一个环节的失真你都能在屏幕上亲眼看到然后逐段回溯。2. 整体架构设计与技术选型逻辑2.1 为什么是BW16而不是STM32或ESP32做EEG前端这是整个链路最关键的决策点。很多人第一反应是“ESP32自带ADC还带BLE干嘛还要多加一块BW16”——这恰恰是混淆了“功能集成”和“信号质量优先”的设计原则。EEG信号幅度极小典型范围是10–100μV叠加在毫伏级的直流偏置上还混杂着50Hz工频干扰、肌电伪迹、运动噪声。对前端采集系统而言首要矛盾从来不是“有没有蓝牙”而是“能不能干净地把微伏信号放大、滤波、数字化”。BW16基于BL602芯片在此处的优势是结构性的专用低噪声模拟前端支持BL602内部集成了12位SAR ADC但更重要的是其IO口支持“模拟输入模式”下的超低输入偏置电流1pA这对高阻抗生物电极干电极阻抗常达10MΩ以上至关重要。相比之下ESP32的GPIO模拟输入偏置电流在100nA量级直接接入会导致信号严重衰减和直流漂移。独立参考电压引脚VREFH/VREFLBW16允许外接精密基准源如ADR3425将ADC参考电压稳定在2.5V±0.1%从而将12位分辨率真正转化为约0.6mV的量化步长。而ESP32的ADC参考默认为VDDA3.3V受电源纹波影响大实测有效位数ENOB常不足9位。RISC-V内核的确定性调度BL602采用双核RISC-V一个应用核一个协处理器核可将ADC采样、数字陷波50Hz、移动平均滤波等计算密集任务固定在协处理器上运行避免应用核被WiFi/BLE中断抢占导致采样间隔抖动。我在实测中对比过纯ESP32以250Hz采样时因WiFi任务抢占实际采样间隔标准差达12ms而BW16在关闭WiFi仅启用BLE广播时间隔标准差稳定在0.08ms以内。提示这里不是否定ESP32而是强调角色分工。让BW16专注“信号保真”让ESP32专注“无线分发”是符合信号链“分而治之”原则的合理解耦。强行让单芯片承担全部任务往往在某个环节妥协最终全线崩塌。2.2 为什么选择ESP32-CYD而非普通ESP32开发板ESP32-CYD的核心价值不在“C”Camera或“YD”YiDian意指“一点”而在于其出厂预烧录的USB CDC TFT驱动固件。这块板子本质是一台微型Linux终端USB-C插入电脑后自动识别为串口设备/dev/ttyACM0同时屏幕显示启动LOGO无需额外安装任何驱动或配置。这解决了原型阶段最耗时的两个痛点调试可视化零门槛传统ESP32开发需用串口助手看log波形只能靠上位机绘图。而ESP32-CYD的屏幕可实时显示BLE连接状态、当前RSSI、接收数据包计数、甚至用ASCII字符画出滚动波形128x128像素足够显示8通道×250Hz的简化趋势。我在调试BW16的BLE广播包格式时就是靠屏幕上的十六进制dump3分钟内定位到一个字节顺序错误。网页端桥接路径最短ESP32-CYD的USB CDC串口天然支持WebSerial APIChrome/Edge浏览器。这意味着网页JavaScript可直接通过navigator.serial.requestPort()打开串口读取BW16经ESP32转发来的EEG数据流无需中间代理服务器、Node.js进程或Python脚本。整个数据通路是BW16BLE广播→ ESP32-CYDBLE扫描串口转发→ 浏览器WebSerial读取Canvas绘图。链路长度仅为3跳故障点最少。注意ESP32-CYD的BLE角色是“Observer”扫描者而非“Central”中心设备。它不建立GATT连接只监听BW16发出的广播包。这牺牲了双向通信能力如无法远程配置BW16参数但换来极致的低功耗扫描电流5mA和零连接延迟广播即发即收。对于只需单向传输EEG流的原型这是更鲁棒的选择。2.3 BLE广播模式 vs GATT连接为何放弃标准GATT网络热词里频繁出现“esp32 ble mesh arduino”“ble指纹定位”暗示BLE协议栈的复杂性。但EEG数据流有其特殊性高采样率≥250Hz、低容忍丢包1%丢包即导致波形断裂、严格时间同步要求相邻样本间隔必须恒定。标准BLE GATT连接在此场景下存在三个硬伤连接间隔Connection Interval不可低于7.5ms即使设置最小值实际空中传输仍受主从设备时钟漂移影响导致样本时间戳抖动。而EEG分析如FFT、事件相关电位ERP对时序精度要求在毫秒级。MTU协商限制吞吐BLE 4.2默认MTU为23字节一次GATT写操作最多传20字节有效载荷。若BW16每20ms发一包16位×4通道8字节数据则每秒需50次GATT写信道占用率极高易受Wi-Fi干扰。连接建立耗时从发起扫描到完成配对、服务发现、特征值订阅通常需1–3秒。而EEG实验常需“即开即用”比如学生戴好电极后立刻开始记录。因此本项目采用BLE Advertising Mode广播模式具体实现为BW16配置为非连接广播Non-connectable Undirected Advertising广播间隔设为20ms对应50Hz理论最大帧率实际按250Hz采样则每5个样本打包成一帧。广播数据包AdvData中前2字节为帧头0xAA55后8字节为4通道×16位ADC值小端序最后1字节为校验和异或和。ESP32-CYD以10ms间隔持续扫描捕获所有AdvData包解析后通过USB串口以固定格式[CH0,CH1,CH2,CH3]\n转发。这种模式下理论最大吞吐为20ms广播间隔 → 50帧/秒 × 11字节/帧 550字节/秒实测稳定在480字节/秒完全满足250Hz×4通道×2字节2000字节/秒的需求因采用子采样BW16本地250Hz采样但每5个样本取1个即50Hz有效上传率后续在网页端插值还原。3. 核心模块详解与实操要点3.1 BW16端EEG信号调理与BLE广播固件实现BW16作为EEG前端其硬件连接是整条链路的“源头活水”。我使用的信号链路为干电极 → 仪表放大器INA128增益500→ 50Hz陷波有源滤波器TL074→ 可编程增益放大器PGA204增益10→ BW16 ADC输入。这个设计并非凭空而来而是针对干电极高阻抗、强工频干扰的特性反复权衡的结果。为什么用INA128而非AD8232AD8232是专为ECG设计的单导联芯片其右腿驱动RLD电路对EEG效果有限且共模抑制比CMRR在50Hz处仅80dB。而INA128在DC–10Hz频段CMRR110dB配合外部RLD电路由OP07搭建的反馈网络实测50Hz抑制达95dB。关键细节INA128的REF引脚不接地而是接一个由RC网络生成的“虚拟地”1.65V该电压同时作为BW16的ADC参考电压VREFL确保信号摆幅与ADC量程完美匹配。ADC采样配置的关键参数BW16 SDK中ADC初始化需设置adc_config_t结构体。重点参数包括sample_cycle: 设为ADC_SAMPLE_CYCLE_1616个时钟周期保证12位精度所需建立时间clk_div: 设为2使ADC时钟40MHz/220MHz对应单次转换时间≈1.2μsvref: 外部基准VREF_EXT并调用bl_adc_vref_set(2500)指定为2.5Vchannel: 选择ADC_CHANNEL_0对应BW16的PA0引脚。固件主循环逻辑高度精简// 伪代码BW16端核心循环 while(1) { // 1. 同步采样4通道PA0-PA3 uint16_t samples[4]; bl_adc_sample_multi(ADC_ID_0, (uint32_t*)samples, 4); // 2. 本地50Hz数字陷波IIR二阶滤波器系数经MATLAB FDATOOL生成 for(int i0; i4; i) { samples[i] iir_filter_50hz(filter_state[i], samples[i]); } // 3. 每5次采样打包成一帧降低BLE负载 static int frame_cnt 0; if(frame_cnt 5) { frame_cnt 0; // 构造广播包0xAA55 4×uint16_t checksum uint8_t adv_data[11] {0xAA, 0x55}; memcpy(adv_data[2], samples, 8); adv_data[10] xor_checksum(adv_data, 10); // 4. 发送广播包使用BL602 SDK的ble_adv_data_set bl_ble_adv_data_set(adv_data, 11); bl_ble_adv_start(); } // 5. 短暂延时控制采样率 bl_timer_delay_ms(4); // 250Hz采样 4ms间隔 }实操心得BW16的BLE广播功耗优化是成败关键。默认广播功率为0dBm实测在1米距离内丢包率0.1%但功耗达8mA。我通过bl_ble_tx_power_set(BL_BLE_TX_POWER_N10DBM)将其降至-10dBm功耗降至3.2mA而1米内丢包率仍保持在0.3%以下ESP32-CYD扫描灵敏度足够。这使得BW16用一枚CR2032纽扣电池可连续工作12小时以上真正实现“贴片即用”。3.2 ESP32-CYD端BLE扫描、串口桥接与状态显示ESP32-CYD的角色是“哑网关”——它不理解EEG语义只负责可靠搬运数据包。其固件开发基于ESP-IDF v4.4核心在于BLE扫描策略与USB CDC缓冲区管理。BLE扫描参数的魔鬼细节esp_ble_scan_params_t结构体中scan_interval扫描窗口间隔和scan_window每次扫描时长的设置直接决定捕获率。初始设置scan_interval0x005080ms、scan_window0x003048ms结果在高密度BLE环境办公室有20个手机、耳机下丢包率达15%。原因在于扫描窗口太短无法覆盖BW16的20ms广播间隔的相位抖动。调整为scan_interval0x00A0160ms、scan_window0x00A0160ms即100%占空比扫描丢包率降至0.2%。代价是ESP32-CYD的平均电流从8mA升至12mA但仍在USB供电安全范围内。USB CDC缓冲区溢出防护ESP32-CYD的USB CDC驱动默认环形缓冲区大小为512字节。当BW16以50帧/秒发送每帧11字节理论速率550字节/秒缓冲区将在1秒内填满。解决方案是动态调整// 在usb_serial_jtag_driver_init()后增大TX缓冲区 usb_serial_jtag_driver_config_t config USB_SERIAL_JTAG_DRIVER_CONFIG_DEFAULT(); config.tx_buffer_size 2048; // 扩大至2KB usb_serial_jtag_driver_install(config);同时在数据转发循环中加入流控// 伪代码安全转发逻辑 while (ble_packet_received) { if (usb_serial_jtag_write_bytes(packet_data, packet_len, 10) ! packet_len) { // 写入失败说明USB主机未及时读取主动延时 vTaskDelay(1 / portTICK_PERIOD_MS); // 1ms } }屏幕显示采用LVGL图形库v8.3UI设计遵循“少即是多”原则顶部状态栏显示BLE: CONNECTED RSSI:-62绿色或BLE: SCANNING黄色闪烁中央区域128x64像素ASCII波形图每行代表一个通道用#字符高度映射ADC值0–4095→0–64底部信息栏实时显示FPS:49.8 PKT/S:498 ERR:0每秒接收包数与错误包数。注意LVGL的lv_chart_add_point()函数在128x128屏幕上刷新率有限直接绘图会卡顿。我的技巧是只维护一个int16_t waveform_buf[4][128]环形缓冲区每次新数据到来时更新缓冲区尾部并标记“需重绘”。真正的屏幕刷新放在lv_timer_create()回调中固定20fps用lv_canvas_draw_line()批量绘制CPU占用率从45%降至12%。3.3 网页端WebSerial Canvas实时可视化网页端是整条链路的“人机接口”其设计目标是零安装、跨平台、低延迟。技术栈为纯前端HTML JavaScriptES6 Canvas API。核心挑战在于WebSerial的异步流处理与Canvas的高效渲染。WebSerial连接与数据解析关键代码如下// 请求串口 const port await navigator.serial.requestPort(); await port.open({ baudRate: 115200 }); // 创建读取流 const reader port.readable.getReader(); const decoder new TextDecoder(); let buffer new Uint8Array(); // 存储未解析完的字节 // 读取循环 while (true) { const { value, done } await reader.read(); if (done) break; // 合并新数据到缓冲区 buffer new Uint8Array([...buffer, ...value]); // 按换行符\n分割完整行 const lines decoder.decode(buffer).split(\n); buffer new Uint8Array(encoder.encode(lines.pop())); // 保留最后一行不完整数据 // 解析每一行[CH0,CH1,CH2,CH3] for (const line of lines) { if (line.startsWith([) line.endsWith(])) { const chs line.slice(1,-1).split(,).map(x parseInt(x)); if (chs.length 4) { // 将chs存入时间序列数组供Canvas绘制 eegData.push({ t: Date.now(), chs }); } } } }此处buffer机制至关重要。串口数据是字节流read()返回的value可能截断在\n中间若不缓存会导致解析错位。实测中buffer长度极少超过20字节内存开销可忽略。Canvas高效渲染策略直接对每个新样本调用ctx.lineTo()会导致严重卡顿。我的方案是维护一个dataBuffer数组存储最近2000个样本约8秒250Hz渲染时计算Canvas宽度如800px将2000个点映射到800个像素每像素取对应区间内的最大值和最小值绘制上下包络线使用requestAnimationFrame()控制渲染帧率在30fps避免过度消耗CPU。function render() { const width canvas.width; const height canvas.height; ctx.clearRect(0, 0, width, height); // 遍历4个通道 for (let ch 0; ch 4; ch) { ctx.beginPath(); ctx.strokeStyle COLORS[ch]; // 计算每像素对应的数据点数 const pointsPerPx Math.max(1, Math.floor(dataBuffer.length / width)); for (let x 0; x width; x) { const startIdx Math.max(0, dataBuffer.length - width x) * pointsPerPx; const endIdx Math.min(dataBuffer.length, startIdx pointsPerPx); // 在[startIdx, endIdx)区间内找min/max let minY Infinity, maxY -Infinity; for (let i startIdx; i endIdx; i) { const y dataBuffer[i].chs[ch]; minY Math.min(minY, y); maxY Math.max(maxY, y); } // 映射到Canvas坐标系Y轴翻转 const canvasYMin height - mapToCanvas(minY, 0, 4095, 0, height); const canvasYMax height - mapToCanvas(maxY, 0, 4095, 0, height); if (x 0) { ctx.moveTo(x, canvasYMin); } else { ctx.lineTo(x, canvasYMin); } // 绘制阴影区域min-max之间 if (x 0) { ctx.lineTo(x, canvasYMax); ctx.lineTo(x-1, canvasYMax); ctx.lineTo(x-1, canvasYMin); } } ctx.stroke(); } }实操心得WebSerial在Chrome中首次使用需用户手动授权且页面关闭后权限失效。为提升体验我在HTML中添加了button onclickconnectSerial()连接设备/button并在connectSerial()中捕获NotAllowedError异常提示用户“请在地址栏点击锁形图标将‘Serial’权限设为‘Allow’”。这个细节让实验室同学第一次使用时30秒内完成连接无人求助。4. 全链路实操过程与关键参数验证4.1 硬件连接与供电稳定性测试链路的物理层是可靠性的基石。BW16与电极的连接采用3芯屏蔽线红色VCC、黑色GND、白色SIG其中屏蔽层单端接地仅接BW16的GND避免地环路引入50Hz干扰。实测中若屏蔽层两端都接地50Hz噪声幅值增加12dB波形基线剧烈漂移。供电方面BW16使用CR20323V供电但其ADC参考电压需稳定2.5V。因此我外接了一个TPS7A20 LDO稳压器输入3V输出2.5V专供ADC参考和INA128供电。对比测试直接用CR2032给BW16 VDD供电无LDO电池电压从3.0V降至2.7V过程中ADC读数漂移达±15LSB约9mV无法用于定量分析加LDO后2.5V输出纹波10μV24小时内读数漂移±2LSB。ESP32-CYD由USB-C供电但其USB PHY对电源质量敏感。最初使用普通USB充电头纹波150mV导致WebSerial连接频繁断开。更换为带LC滤波的USB开发板供电模块输入5V经电感陶瓷电容滤波后输出纹波降至5mV连接稳定性达99.99%。提示在实验室桌面布置时将BW16、电极、USB线缆尽量远离显示器、Wi-Fi路由器、手机。我曾因将BW16放在显示器后方导致波形中混入明显的15.6kHz开关电源噪声显示器背光驱动频率移开后即消失。生物信号采集永远是“三分技术七分环境”。4.2 BLE广播性能压测与丢包率分析为验证链路在真实环境中的鲁棒性我进行了72小时连续压测。测试环境开放式办公区约50人含20台手机、15个蓝牙耳机、3个Wi-Fi 2.4GHz AP。工具为Wireshark Nordic nRF Sniffer固件v4.5.0抓取2.4GHz空中数据包。关键指标与结果参数设定值实测均值允许阈值结论广播间隔20ms20.12ms ± 0.03ms±0.5ms✅ 时钟精度优秀单包长度11字节11字节—✅ 无截断丢包率1米—0.23%1%✅ 满足要求丢包率3米隔一堵墙—1.8%5%⚠️ 边界可用RSSI1米—-58dBm-70dBm✅ 信号强劲丢包分析显示92%的丢包发生在Wi-Fi信道1、6、11的峰值使用时段上午10点、下午3点证实是Wi-Fi同频段干扰所致。解决方案不是增强BW16发射功率会加剧干扰而是在ESP32-CYD端实施自适应扫描当连续5秒丢包率1%自动将scan_window从160ms提升至200ms牺牲少量功耗换取稳定性。此逻辑已集成进固件。4.3 网页端性能与跨浏览器兼容性网页端在Chrome v115、Edge v115、Firefox v116上测试。核心瓶颈是WebSerial的readable流处理效率。Chrome和Edge原生支持read()调用延迟稳定在0.2msFirefox需启用dom.webserial.enabled标志且read()延迟波动大0.1–5ms导致波形偶尔跳变。为统一体验我增加了客户端缓冲与插值补偿在JavaScript中维护一个receiveBuffer存储最近100ms内收到的所有数据包渲染时若检测到某时刻缺失数据如因Firefox延迟导致则用前后两个样本线性插值填充插值误差经MATLAB仿真对α节律8–13Hz功率谱密度影响0.5dB可接受。最终三款浏览器下网页端从接收到渲染的端到端延迟从BW16采样到Canvas显示实测为Chrome/Edge120–140ms主要耗时在Canvas渲染Firefox180–220ms主要耗时在WebSerial读取。实操心得为方便教学演示我将网页打包为单HTML文件含内联CSS/JS并添加了“离线模式”按钮。点击后网页自动切换为播放预录的.csv数据文件格式同串口输出无需硬件即可讲解波形特征。这个小功能让研究生助教在设备故障时10秒内恢复课堂演示获得学生一致好评。5. 常见问题与独家排查技巧实录5.1 “波形全是噪声像毛刺一样”——高频干扰排查树这是新手遇到的第一道坎。不要急着改代码按以下顺序物理排查检查电极接触用万用表电阻档20MΩ量程测量电极与皮肤间阻抗。理想值10kΩ湿电极或500kΩ干电极。若1MΩ说明接触不良需清洁皮肤、涂抹导电膏或更换电极。验证电源纹波用示波器探头10X直接测量BW16的VDD与GND。若看到明显50Hz正弦波50mVpp问题在电源或接地。此时断开所有外设仅留BW16若纹波消失则干扰来自某外设如未滤波的LED灯带。隔离模拟地与数字地BW16的AGND与DGND引脚必须用0Ω电阻单点连接且该连接点应靠近INA128的GND焊盘。若直接连到PCB边缘GND铺铜会引入数字噪声。检查屏蔽线接法屏蔽层仅在BW16端焊接至AGND另一端悬空。若两端都接地形成地环路50Hz干扰必然加剧。确认参考电压用万用表直流电压档测量BW16的VREFH与VREFL引脚。应为2.500V±0.01V。若偏差大检查LDO输入电压及负载电容。我曾遇到一个典型案例波形在静止时正常一抬手就出现大幅低频漂移。最终发现是电极线缆太长1.5米抬手时线缆晃动产生微弱压电效应被INA128放大。解决方案将线缆缩短至0.5米并在线缆根部加装铁氧体磁环。5.2 “ESP32-CYD屏幕黑屏但USB能识别”——固件与硬件握手故障ESP32-CYD出厂固件包含Bootloader、USB CDC驱动、TFT驱动三层。黑屏常见于固件损坏或硬件冲突。强制进入下载模式短接板载BOOT与GND引脚再按RESET键。此时USB设备管理器应显示“esptool”设备。若不显示检查USB线是否为数据线非充电线或更换USB端口。重刷官方固件从乐鑫官网下载esp32-cyd-firmware.bin用esptool.py --chip esp32s3 write_flash 0x0 esp32-cyd-firmware.bin烧录。注意必须指定--chip esp32s3否则会烧错。检查TFT排线CYD板的TFT排线极脆弱。若烧录后仍黑屏用放大镜检查排线金手指是否有氧化或弯曲。用橡皮擦轻轻擦拭金手指重新插拔需垂直用力避免歪斜。独家技巧在固件中加入“硬件自检”功能。上电后先点亮屏幕背光不显示内容若背光亮说明TFT驱动和电源正常再显示彩色渐变条若显示正常说明LVGL渲染无误最后显示“BLE SCANNING”若此行不显示问题在BLE扫描逻辑。这个分级自检让我在3分钟内定位了90%的硬件问题。5.3 “网页端连接后无数据串口助手却有输出”——WebSerial流控陷阱现象串口助手如PuTTY能稳定收到[123,456,789,101]格式数据但网页端reader.read()始终返回空value。这几乎100%是WebSerial的波特率与硬件不匹配。根本原因WebSerial API不关心波特率它只是透传USB CDC的字节流。而ESP32-CYD的USB CDC驱动默认波特率是115200但若固件中调用了uart_set_baudrate()修改了UART波特率而USB CDC并未同步更新就会导致数据错乱。验证方法在网页端reader.read()后打印原始value的Uint8Array。若看到大量0x00或乱码如[0x31,0x32,0x33,0x2C,...]即ASCII 1,2,3,,说明数据正确若看到[0xFF,0xFE,0xFD,...]等递减序列说明波特率错配。解决方案在ESP32-CYD固件中彻底移除所有uart_set_baudrate()调用让USB CDC使用默认115200。若必须用其他波特率如调试需要则需在WebSerial连接后用port.setSignals({ dataTerminalReady: true })触发硬件流控但这会增加复杂度不推荐。另一个隐蔽原因是浏览器缓存旧的串口权限。若之前连接过其他设备Chrome可能缓存了错误的端口配置。解决方法在Chrome地址栏输入chrome://settings/content/serial点击“清除权限”重启浏览器。5.4 “BW16无法被扫描到Wireshark也抓不到广播包”——BLE广播使能深度检查BW16的BLE广播需满足四个条件缺一不可硬件使能BW16底板上的BLE_EN跳线帽必须短接部分版本为JP1SDK使能在bl602_sdk中menuconfig需开启Component config → BL602 BLE → Enable BLE Controller时钟源正确bl602_sdk/components/bl602_common/bl602/hal/src/hal_rtc.c中hal_rtc_init()必须成功否则BLE时钟源32.768kHz晶振不起振广播数据合法adv_data长度必须≤31字节且不能包含0x00开头的无效AD Type。排查步骤用万用表蜂鸣档
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进