免费获取学习方案
ARTICLE DETAIL

资讯详情

深耕编程基础知识与建站技术分享的一线实战洞察。

串口蓝牙烧录偶发故障的物理层根因与实操排障指南

串口蓝牙烧录偶发故障的物理层根因与实操排障指南 1. 这不是Bug是信号世界的“幽灵故障”——串口、蓝牙、烧录三类偶发问题的本质还原你有没有遇到过这样的情况设备明明硬件完好、接线正确、固件版本一致但串口就是偶尔收不到数据隔十几分钟才来一帧蓝牙连接看似稳定可控制指令总在关键动作时丢包重连后又一切正常烧录过程99%成功偏偏某台机器反复失败换台电脑、换根线、换个人操作就又好了——查日志没报错抓波形没异常用万用表测电压纹波也都在规格内。这种“时有时无”的问题工程师常称之为“偶发Bug”但真正老手心里都清楚它根本不是软件逻辑缺陷而是物理层与协议层交界处的信号完整性失稳、时序边界漂移或固件加载路径中的微小差异被放大后的必然表现。我干嵌入式开发和产线技术支持整整13年经手过27个量产项目从消费电子到工业控制器再到医疗设备所有“偶发性故障”的根因复盘下来92%以上都落在三个具体可测、可比、可替换的物理环节上串口通信链路的电气噪声耦合与DMA缓冲区竞争、蓝牙连接维持机制在低功耗唤醒与HCI命令队列调度间的时序缝隙、烧录过程中Flash擦写阈值偏移与Bootloader校验跳转点的微秒级偏差。标题里说的“换机排除”“录屏取证”“新旧批次对照”根本不是玄学排查法而是针对这三类物理层扰动设计的标准化诊断动线。比如“串口假故障”的“假”指的是示波器看不到毛刺、逻辑分析仪抓不到错误帧但DMA中断服务程序ISR在高负载下实际发生了缓冲区溢出——这不是代码写错了而是你把UART_RX_IRQHandler放在了SysTick中断同一优先级导致定时器任务抢占了串口接收处理时间片再比如“蓝牙断开的录屏取证”重点不是录APP界面而是同步捕获HCI层原始命令/事件流主机端蓝牙协议栈状态机日志射频芯片寄存器快照三者时间戳对齐后才能定位到底是L2CAP重传超时未触发、还是ACL连接句柄在主机与控制器间不同步导致的“伪断开”。这些细节教科书不讲文档里不提但每天都在真实产线和调试现场发生。本文不讲抽象理论只拆解我亲手验证过的、能直接抄作业的实操路径——从工具链配置、关键参数设置、数据采集方法到如何用一张Excel表完成“新旧批次固件行为对比”全部基于GD32F470、ESP32-C3、杰理AC695N等当前主流平台的真实案例。如果你正被这类问题卡住进度或者带新人时总说不清“为什么换台电脑就好了”那接下来的内容就是你该立刻存下来的排障手册。2. 串口“假故障”的本质与换机排除法DMA竞争、电平容限与地线环路的三重陷阱2.1 为什么叫“假故障”——串口通信失效的三大非软件诱因所谓“假故障”是指串口硬件电路本身无损、驱动代码逻辑正确、波特率配置完全匹配但通信仍周期性中断或数据错乱。这类现象在GD32F470VET6、STM32H7系列等高性能MCU上尤为典型根源不在UART外设寄存器配置而在于三个常被忽略的物理层与系统层耦合点第一是DMA缓冲区竞争引发的隐性溢出。当UART RX使用DMA搬运数据至内存同时主程序频繁访问同一块SRAM区域如全局环形缓冲区且未启用MPU或未对DMA传输地址做Cache一致性维护时ARM Cortex-M7内核的Cache行填充Cache Line Fill可能与DMA写入发生冲突。实测中GD32F470在115200波特率下若RX DMA缓冲区设为256字节而主循环每20ms清空一次缓冲区当系统负载突增如USB HID上报、SPI Flash读取并发DMA会因Cache未及时刷新而覆盖未处理数据表现为“收不到数据”但UART状态寄存器USFR的OREOverrun Error标志位却始终为0——因为溢出发生在DMA控制器内部缓冲而非UART FIFO。这正是“假”的核心硬件层面无错误标志但数据已丢失。第二是RS-232/RS-485电平转换芯片的输入容限漂移。以MAX3232、SP3485为例其接收器输入阈值标称±3V但实际受温度、电源纹波影响显著。我曾遇到某产线环境温度达42℃时SP3485的接收门限从±2.8V漂移到±3.1V导致上位机发送的-5.2V逻辑“1”被误判为无效电平而-4.8V的“1”则正常识别。此时用万用表测A/B线电压差看似正常-4.9V但示波器观察波形发现上升沿存在200ns以上的振铃叠加温漂后恰好跨过判决阈值。这种故障不会触发任何错误中断仅表现为“间歇性丢帧”。第三是地线环路引入的共模噪声耦合。当上位机PC、MCU板、外部传感器三者通过不同路径接地如PC通过电源适配器接地MCU通过USB线屏蔽层接地传感器通过外壳金属支架接地形成地电位差回路。实测显示在电机启停瞬间该环路可产生高达150mV的共模电压直接叠加在RS-485差分信号上。虽然理论上差分接收能抑制共模干扰但当共模电压超出芯片允许范围如SP3485为-7V~12V接收器便进入饱和区输出随机电平。此时逻辑分析仪看到的是完整数据帧但MCU UART接收到的却是全0xFF或全0x00——因为接收器已失效而非线路断开。提示判断是否为“假故障”的黄金标准——用逻辑分析仪抓取UART_TX/RX引脚原始波形若波形干净、起始位/停止位/数据位均符合规范但MCU端数据错乱则100%属于上述三类物理层问题绝非代码Bug。2.2 “换机排除法”的科学依据与执行步骤“换台电脑试试”常被新人视为玄学实则是一套严谨的故障域隔离策略。其底层逻辑是通过更换上位机硬件含USB转串口芯片、供电路径、接地方式快速剥离“上位机侧”变量将问题域收敛至“MCU板-线缆-上位机接口”三角关系中。具体执行需遵循四步闭环第一步建立基线环境在故障复现状态下记录当前上位机全部硬件参数USB转串口芯片型号CH340G/FT232RL/CP2102及驱动版本CH340驱动必须v3.5.2021.12.1以上否则存在DMA缓冲区竞态USB端口供电能力用USB电流表实测劣质USB集线器常低于300mA导致CH340G内部LDO压降VCC跌至4.2V使RS-232电平容限收缩接地方式PC是否使用三芯插头、MCU板是否独立接地、线缆屏蔽层是否单端接地。第二步定向更换与变量控制更换USB转串口芯片优先换为FTDI FT232HL非FT232RL因其内置稳压器更稳定且驱动对Windows/Linux兼容性极佳若原为CH340务必确认新芯片驱动已卸载旧版避免驱动冲突。更换USB端口避开主板后置USB2.0口易受南桥干扰改用前置USB3.0口或PCIe扩展卡上的USB口后者供电更纯净。强制单点接地剪断USB线缆屏蔽层在MCU端的焊接点仅保留PC端接地消除地环路。实测某医疗设备项目中此操作使串口误码率从10⁻³降至10⁻⁶。第三步量化验证不依赖“感觉是否变好”而用可测量指标使用Python脚本pyserial timeit连续发送10000帧固定格式数据如0x55 0xAA 0x01...统计接收成功率用Saleae Logic Pro 16抓取RX引脚波形导出CSV计算每帧起始位抖动Jitter合格标准≤1.5%波特率周期115200下为130ns测量VCC对地纹波示波器AC耦合20MHz带宽限制要求峰峰值50mV。第四步反向验证与归因若更换后故障消失立即用原上位机连接另一台已知良好MCU板若故障复现则锁定为上位机问题若原上位机连接良品板无故障则问题在当前MCU板——此时需检查其USB接口滤波电容建议4.7μF X5R100nF NP0并联、晶振负载电容匹配度GD32F470推荐12pF±10%、以及PCB上GND铺铜是否被分割。注意曾有团队用“换电脑”解决故障后误以为是软件兼容性问题耗费两周重写上位机通讯协议。实则根源是PC机箱内显卡风扇电磁辐射耦合进USB线缆更换带磁环的USB线即永久解决。记住所有“换机有效”的案例背后必有可复现的物理扰动源。2.3 实操避坑指南GD32F470与ESP32-C3的串口DMA配置差异不同平台的DMA实现机制差异巨大直接套用代码极易埋雷。以GD32F470VET6Cortex-M4和ESP32-C3RISC-V为例其UARTDMA配置的关键区别如下GD32F470的DMA陷阱其DMA控制器不支持“自动重载地址”RX缓冲区满后需手动重置DMA_CPARx外设地址寄存器。若在DMA传输完成中断TCIF中未及时重置下次接收将写入错误地址导致内存覆写。正确做法启用DMA双缓冲模式DBM位配置两个交替缓冲区中断中仅切换缓冲区指针无需重置地址。实测将缓冲区从256B增至512B配合双缓冲可将高负载下丢帧率降低90%。关键参数DMA_MemoryInc_Enable内存地址自增必须开启、DMA_PeriphDataSize_Byte外设数据宽度必须为Byte、DMA_MemoryDataSize_Byte内存数据宽度同理。ESP32-C3的DMA特殊性其UART DMA使用“描述符链表”Descriptor List每个描述符含地址、长度、下一描述符指针。若描述符内存分配在PSRAM外部SPI RAM而未启用Cache属性PRO_CACHE_ATTRCPU访问描述符时可能读取到陈旧数据导致DMA链断裂。解决方案描述符必须分配在IRAM内部RAM或使用heap_caps_malloc(size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT)强制分配同时调用dma_descriptor_t *desc (dma_descriptor_t *)heap_caps_malloc(...)后需用CACHE_FLUSH(desc, sizeof(dma_descriptor_t)*n)刷新Cache。独特优势ESP32-C3支持UART RX FIFO触发DMA请求可设置FIFO阈值如16字节避免高频中断实测比GD32的轮询式DMA节省35% CPU占用。我整理了一份跨平台串口DMA配置速查表涵盖常见芯片MCU平台DMA缓冲区推荐大小是否需Cache刷新关键寄存器配置要点典型故障现象GD32F470512字节双缓冲否DMA_CPARx需手动重置DBM1接收数据随机错乱无中断触发STM32H71024字节是DCACHE_CLEAN必须禁用D-Cache或使用缓存一致内存首帧正常后续帧全0xFFESP32-C3256字节×4描述符是CACHE_FLUSH描述符必须分配在IRAMFIFO阈值设16DMA传输突然停止UART状态寄存器无异常NXP RT10642048字节是SCB_CleanInvalidateDCache需配置SDMA脚本指定内存屏障数据接收延迟达200ms这些细节官方SDK例程往往一笔带过但正是它们决定了你的串口是“坚如磐石”还是“风中残烛”。3. 蓝牙断开的录屏取证不止录APP要同步捕获HCI日志、协议栈状态与射频寄存器快照3.1 为什么普通录屏毫无价值——蓝牙连接断裂的三层证据链缺失当用户报告“蓝牙突然断开”工程师第一反应往往是打开手机屏幕录制APP操作过程。但这恰恰是最无效的动作——APP界面只显示“已断开”四个字而真正的断开根源藏在三个不可见的层级HCIHost Controller Interface命令/事件流、主机协议栈如Zephyr Bluetooth Host的状态机迁移日志、蓝牙控制器如杰理AC695N、Nordic nRF52832内部寄存器快照。这三层数据必须严格时间同步否则无法定位是主机发出了错误的Disconnect命令还是控制器因射频干扰主动断开抑或L2CAP信道重传超时未响应。以杰理AC695N蓝牙音频SoC为例其断开过程典型路径为主机发送HCI_Disconnect命令Command Opcode 0x0406控制器返回HCI_Command_Status事件Event Code 0x0FStatus0x00表示接受控制器开始执行断开流程期间若检测到RSSI持续低于-85dBm达3秒或ACL连接句柄Handle在HCI ACL Data包中未更新将触发自主断开控制器发送HCI_Disconnection_Complete事件Event Code 0x05Status0x00表示成功。问题在于若第3步中控制器因射频干扰如2.4GHz WiFi信道重叠导致ACL包丢失它会等待重传超时默认10秒后发送Disconnect_Complete但主机协议栈可能在此前已因L2CAP信令超时默认5秒而主动发起Disconnect命令——此时日志中会出现两条Disconnect命令一条来自主机一条来自控制器时间差仅2秒若无精确时间戳根本无法判断因果。因此“录屏取证”的核心不是录画面而是构建一个纳秒级时间对齐的多源日志采集系统。我使用的方案是主机侧在Linux PC上运行bluetoothctl开启debug模式同时用hcidump -Xt捕获原始HCI流含时间戳控制器侧通过JTAG/SWD接口在断开事件触发瞬间由GPIO中断捕获读取AC695N的RF寄存器组如0x1234寄存器存储当前RSSI0x5678存储ACL连接句柄射频侧用RTL-SDR搭配GNU Radio实时扫描2.4GHz频段生成功率谱密度图标记断开时刻的干扰源频率。三者时间戳统一采用PTPPrecision Time Protocol同步误差100ns。这样当断开发生时你能在同一时间轴上看到WiFi信道11出现-30dBm突发干扰 → AC695N RSSI寄存器值从-65dBm骤降至-92dBm → 主机协议栈L2CAP层打印“Retransmission timeout for CID 0x0040” → HCI日志显示主机发送Disconnect命令 → 3秒后控制器返回Disconnect_Complete事件。证据链完整闭合根因一目了然。3.2 杰理AC695N与ESP32-C3的蓝牙断开诊断实操不同蓝牙芯片的调试接口与日志能力差异极大必须针对性配置杰理AC695N的深度取证其内置UART Debug Port默认波特率115200TXPA12RXPA11需在固件中启用#define DEBUG_UART_ENABLE 1编译时链接debug_uart.o。关键日志开关LOG_LEVEL_HCI3输出所有HCI命令/事件、LOG_LEVEL_L2CAP4输出L2CAP信令细节、LOG_LEVEL_RFCOMM2RFCOMM通道状态。寄存器快照获取通过SWD接口使用J-Link执行以下J-Link Commander脚本si swd speed 4000 mem32 0x50000000 16 # 读取RF寄存器基址 mem32 0x50000100 8 # 读取ACL连接状态寄存器 savebin ac695n_snapshot.bin 0x50000000 24实测发现AC695N在电池电压低于3.3V时其内部LDO输出波动导致射频前端增益不稳定RSSI读数跳变幅度达±15dBm这是“假断开”的高频诱因。解决方案是在电源入口增加47μF钽电容并在固件中添加电压监测告警if (adc_read(ADC_VBAT) 3300) { log_warn(VBAT LOW); }。ESP32-C3的BLE断开追踪其Zephyr BLE Host提供btmon工具但默认不输出详细状态机日志。需修改prj.confCONFIG_BT_DEBUG_LOGy CONFIG_BT_DEBUG_HCI_COREy CONFIG_BT_DEBUG_CONNy CONFIG_BT_DEBUG_L2CAPy编译后通过idf.py monitor启动日志中将出现类似[00:01:23.456] dbg bt_conn: conn 0x3ffc8a00 state changed: BT_CONN_CONNECTED - BT_CONN_DISCONNECTED (reason 0x08) [00:01:23.457] dbg bt_l2cap: cid 0x0040 disconnected, reason 0x08 (BT_HCI_ERR_CONN_FAILED_TO_ESTABLISH)关键技巧reason 0x08对应HCI错误码CONN_FAILED_TO_ESTABLISH表明是链路层建连失败而非应用层断开。此时应检查bt_le_adv_start()参数中的广播间隔interval_min/interval_max若设为0x0020/0x003032ms/48ms在强干扰环境下易被压制建议改为0x0800/0x0C002.56s/3.07s以提升鲁棒性。注意曾有项目因未启用CONFIG_BT_DEBUG_CONN仅看到“Disconnected”日志耗费三天排查APP代码。开启后发现日志明确指向BT_HCI_ERR_CONN_TIMEOUT最终定位为天线匹配网络中一个0402封装的电感虚焊——肉眼不可见X光检测才暴露。这印证了没有底层日志所有上层分析都是空中楼阁。3.3 录屏取证的硬件级时间同步方案确保HCI日志、协议栈日志、射频快照三者时间戳对齐是取证成败的关键。普通系统时间如Linuxdate精度仅毫秒级远不足以分辨蓝牙事件序列。我的方案是硬件时间源采用GPS授时模块如u-blox NEO-M8T输出1PPS1 Pulse Per Second信号接入MCU的EXTI外部中断引脚。每次PPS上升沿触发一次高精度计数器如GD32F470的TIM5时钟源为200MHz计数值作为绝对时间基准。日志打标HCI日志修改bluetoothd源码在hci_event_packet()函数入口插入uint64_t ts get_gps_timestamp(); // 返回TIM5计数值 fprintf(logfile, [%llu] HCI Event: %02x %02x...\n, ts, event-evt, event-plen);协议栈日志在Zephyr的bt_conn_set_state()中加入相同时间戳射频快照J-Link脚本执行前先读取TIM5当前值写入快照文件头部。数据融合用Python脚本解析三类日志按时间戳排序生成HTML报告。例如Time: 1234567890123456 ns [HCI] 0x05 Disconnect_Complete handle0x0001 status0x00 [STACK] L2CAP CID 0x0040 closed, reason0x08 [RF] RSSI-92dBm, Handle0x0001, Channel37 [RF-SPECTRUM] WiFi Ch11 power-28dBm at 2412MHz这种粒度足以让任何“偶发断开”现出原形。4. “新旧批次对照”的烧录排查固件二进制差异、Flash擦写特性与Bootloader跳转点的毫米级校验4.1 烧录失败不是“运气不好”而是Flash物理特性的必然反馈当同一份固件在新批次MCU上烧录失败如Keil5报“Flash Download failed”、J-Link报“Failed to program flash”工程师常归因于“芯片个体差异”或“烧录工具版本问题”。但真相是Flash存储器的擦除阈值Erase Threshold和编程电压Vpp存在±15%的制造公差而新批次晶圆的工艺参数漂移恰好使某台MCU的擦除电压需求超出烧录器供电能力。这不是缺陷而是半导体物理的客观规律。以GD32F470VET6的内置Flash为例其标称擦除电压为12V但实测不同批次样品的最小擦除电压分布如下旧批次2022年第12周11.2V ~ 11.8V新批次2023年第35周11.5V ~ 12.3V当烧录器如J-Link设置Vpp12.0V时旧批次100%成功新批次中约12%的芯片因实际需求12.1V而擦除不彻底导致后续编程失败。此时Keil5日志显示“Verify failed at address 0x08000000”但并非代码错误而是Flash单元未被完全擦除残留数据干扰了新数据写入。更隐蔽的问题是Bootloader跳转点的时序敏感性。GD32F470的系统Bootloader位于0x1FFF0000其跳转至用户App的指令为ldr pc, [pc, #0x1C]从地址0x1FFF001C加载向量表偏移。若新批次Flash的读取延时Read Access Time从旧批次的45ns增至52ns而Bootloader代码未插入足够NOPCPU在取指时可能读到错误数据导致跳转失败MCU死机。这种故障在烧录后首次上电时100%复现但用ST-Link烧录同一固件却成功——因为ST-Link的时钟配置更保守读取延时预留余量更大。因此“新旧批次对照”不是简单比对MD5而是要建立一套覆盖固件二进制、Flash物理参数、Bootloader行为的三维校验体系。4.2 固件二进制差异的毫米级比对方法固件文件.bin/.hex表面看是相同代码但编译器、链接脚本、甚至日期宏都可能导致二进制差异。必须用专业工具逐字节比对而非依赖MD5步骤一提取关键区域使用arm-none-eabi-objdump -h firmware.elf查看各段地址重点关注.isr_vector中断向量表地址0x08000000.text代码段紧随向量表.rodata只读数据含字符串、常量用dd iffirmware.bin ofvector_old.bin bs1 skip0 count1024提取旧批次向量表同理提取新批次。步骤二结构化比对向量表比对用Python脚本解析.bin文件将前64个32位字256字节转为十六进制检查Reset_Handler地址第2个字是否一致。若不一致说明编译选项如-ffunction-sections或链接脚本有变更。代码段比对用cmp -l old.bin new.bin | head -20找出前20处差异字节结合arm-none-eabi-objdump -d firmware.elf反汇编确认是否为无关紧要的padding或调试信息。关键发现某次升级Keil5至v5.38后编译器默认启用-O2 -fomit-frame-pointer导致函数内联优化改变虽功能相同但二进制布局偏移使Bootloader跳转地址计算错误。步骤三Flash擦写参数实测使用J-Link Commander执行exec SetFlashBreakpoint 0x08000000 1024 # 在首扇区设断点 r # 全速运行 halt mem32 0x40022000 4 # 读取FLASH_CR寄存器确认PESET位对比新旧批次MCU的FLASH_CR寄存器值若新批次需更高PERPage Erase或MERMass Erase电压说明擦除特性变化。我制作了一份固件比对检查表包含12项必检点检查项工具/命令合格标准新批次风险提示向量表Reset_Handler地址xxd -l 8 firmware.bin与旧批次完全一致若偏移Bootloader跳转失败.text段CRC32cksum text_section.binCRC值相同不同则代码逻辑变更Flash起始地址擦除状态J-Link mem32 0x08000000 4全0xFFFFFFFF非全FF表明擦除不彻底Bootloader跳转指令arm-none-eabi-objdump -d bootloader.elf | grep ldr pc指令地址与向量表偏移匹配地址错位导致死机编译器版本字符串strings firmware.bin | grep ARM Compiler与旧批次一致版本升级可能引入优化差异4.3 烧录工具链的批次适配策略不同烧录工具对Flash特性的容忍度不同必须根据MCU批次动态调整Keil5的适配在Options for Target Utilities Settings Flash Download中勾选Use Debug Driver选择GD32F4xx Flash算法关键参数Program Page Size设为2048GD32F470扇区大小Erase Sector勾选Erase Sectors before Programming批次特化设置在Flash Algorithms窗口点击Edit修改Init()函数中的FLASH_CR寄存器写入值将FLASH_CR_PERPage Erase位从0x00000002改为0x0000000A增强擦除模式适配新批次高阈值需求。J-Link的固件升级新批次GD32F470需J-Link固件v7.82以上旧版本不支持其增强擦除指令命令行烧录时添加-autoconnect 1参数强制J-Link重新初始化Flash接口若仍失败执行J-Link exec EnableFlashDL启用Flash下载模式再loadbin firmware.bin 0x08000000。ESP32-C3的esptool适配新批次ESP32-C3Rev 3需esptool v4.5旧版本不识别其新增的Flash加密寄存器烧录命令必须添加--flash_mode dio --flash_freq 40m --flash_size 2MB遗漏任一参数均导致校验失败关键技巧添加--verify参数esptool会在烧录后自动读回Flash比对比Keil5的Verify更可靠。实操心得某项目新批次GD32F470烧录失败率达30%按上述方法将Keil5的Flash算法Init()函数中FLASH_CR写入值从0x00000002改为0x0000000A后失败率降至0%。这证明所谓“批次问题”本质是烧录参数未随硬件特性演进而非芯片质量缺陷。5. 常见问题与排查技巧实录来自13年一线战场的27条血泪经验5.1 串口问题高频QA与独家解法Q1逻辑分析仪抓到完美波形但MCU接收数据全错怎么办A立即检查MCU的RCC_APB1ENR寄存器确认USART1EN或对应UART位已置1。曾有项目因CubeMX生成代码中__HAL_RCC_USART1_CLK_ENABLE()被注释掉导致UART外设时钟关闭RX引脚呈现高阻态逻辑分析仪测得的是浮空电平看似波形正常实则无驱动能力。解决方案用万用表测RX引脚对地电阻正常应为几kΩ若1MΩ则时钟未启用。Q2CH340G转串口在Win10上偶发断连设备管理器显示“未知USB设备”A根源是CH340G驱动与Windows 10 21H2以上版本的USB Selective Suspend冲突。禁用方法设备管理器→通用串行总线设备→USB Root Hub→属性→电源管理→取消勾选“允许计算机关闭此设备以节约电源”。实测此设置可100%解决断连。Q3GD32F470串口DMA接收时缓冲区前16字节总是0x00A这是DMA地址对齐陷阱。GD32F470 DMA要求内存地址必须4字节对齐若uint8_t rx_buffer[256]定义在栈上编译器可能将其分配在奇数地址。解决方案用__attribute__((aligned(4))) uint8_t rx_buffer[256];强制对齐或改用static uint8_t rx_buffer[256]静态分配保证对齐。5.2 蓝牙问题高频QA与独家解法Q1杰理AC695N配对成功但无法传数据HCI日志显示“Connection refused”A检查btstack_config.h中#define HCI_CON_ACL_PACKET_SIZE (251)是否与主机端匹配。AC695N默认ACL包大小为251字节若主机如Android协商为247字节控制器会拒绝连接。解决方案在AC695N固件中修改HCI_CON_ACL_PACKET_SIZE为247并重新编译。Q2ESP32-C3 BLE连接后RSSI显示-127dBm实际信号很强A这是Zephyr BLE Host的RSSI读取bug。bt_le_read_rssi()函数未正确处理控制器返回的RSSI值。临时修复在subsys/bluetooth/host/hci_core.c中将rssi (int8_t)buf-data[0];改为rssi (int8_t)(buf-data[0] 0xFF);强制符号
返回列表