You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将4路ADC浮点测量值通过uint8_t数组经BLE NUS发送?

问题分析与解决方案

乱码的核心原因是发送端的编码/打包规则与接收端的解码/解包规则不匹配,并非单纯修改某一端即可,需要两端逻辑对齐。以下针对你尝试的两种方案逐一说明:

方案1:直接发送浮点值转uint8_t数组

  1. 发送端注意点:

    • 浮点数(如float)遵循IEEE754标准,固定占4字节,需明确字节序(多数MCU为小端模式),直接通过内存拷贝拆分字节:
      float voltages[4] = {v1, v2, v3, v4};
      uint8_t send_buf[16]; // 4路×4字节
      memcpy(send_buf, voltages, sizeof(voltages));
      // 发送时需传递正确的长度:16字节
      ble_nus_data_send(&m_nus, send_buf, sizeof(send_buf), NULL);
      
    • 禁止直接强制类型转换(如(uint8_t*)voltages)后发送,部分编译器可能因内存对齐问题导致数据异常。
  2. 接收端对应处理:

    • Python需用struct模块按相同字节序解析:
      import struct
      # 假设收到的原始字节数据为recv_bytes(长度16)
      # 小端解析4个float,<表示小端,f表示float
      voltages = struct.unpack('<ffff', recv_bytes)
      

方案2:格式化字符串发送

  1. 发送端注意点:

    • 用snprintf生成规范的字符串(如逗号分隔),确保无不可打印字符,且发送时传递实际字符串长度而非缓冲区总长度:
      char send_buf[64];
      // 保留2位小数,用逗号分隔4路电压
      int len = snprintf(send_buf, sizeof(send_buf), "%.2f,%.2f,%.2f,%.2f", v1, v2, v3, v4);
      ble_nus_data_send(&m_nus, (uint8_t*)send_buf, len, NULL);
      
  2. 接收端对应处理:

    • 按发送端的编码(默认ASCII/UTF-8)解码字符串,再拆分解析:
      # 假设收到的原始字节数据为recv_bytes
      recv_str = recv_bytes.decode('utf-8').strip()
      voltages = [float(v) for v in recv_str.split(',')]
      

排查步骤

  1. 先在发送端打印原始电压值、待发送的字节/字符串,确认数据本身无错误;
  2. 用BLE调试工具(如nRF Connect)抓取实际发送的字节流,验证是否与预期一致;
  3. 调整接收端解析逻辑,与抓取的字节流规则完全匹配。

内容的提问来源于stack exchange,提问作者user20656617

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 13:41:03