如何将4路ADC浮点测量值通过uint8_t数组经BLE NUS发送?
问题分析与解决方案
乱码的核心原因是发送端的编码/打包规则与接收端的解码/解包规则不匹配,并非单纯修改某一端即可,需要两端逻辑对齐。以下针对你尝试的两种方案逐一说明:
方案1:直接发送浮点值转uint8_t数组
发送端注意点:
- 浮点数(如
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)后发送,部分编译器可能因内存对齐问题导致数据异常。
- 浮点数(如
接收端对应处理:
- Python需用
struct模块按相同字节序解析:import struct # 假设收到的原始字节数据为recv_bytes(长度16) # 小端解析4个float,<表示小端,f表示float voltages = struct.unpack('<ffff', recv_bytes)
- Python需用
方案2:格式化字符串发送
发送端注意点:
- 用
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);
- 用
接收端对应处理:
- 按发送端的编码(默认ASCII/UTF-8)解码字符串,再拆分解析:
# 假设收到的原始字节数据为recv_bytes recv_str = recv_bytes.decode('utf-8').strip() voltages = [float(v) for v in recv_str.split(',')]
- 按发送端的编码(默认ASCII/UTF-8)解码字符串,再拆分解析:
排查步骤
- 先在发送端打印原始电压值、待发送的字节/字符串,确认数据本身无错误;
- 用BLE调试工具(如nRF Connect)抓取实际发送的字节流,验证是否与预期一致;
- 调整接收端解析逻辑,与抓取的字节流规则完全匹配。
内容的提问来源于stack exchange,提问作者user20656617
相关产品推荐
相关产品推荐

