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

STM32使用memcpy组装浮点数据包后值异常的问题排查求助

STM32蓝牙UART发送浮点数据异常排查求助

问题代码

uint8_t sendPacket[200];

float a = 22.0f;  

char buffer[4] ={0x01,0x02,0x03,0x04};


memcpy(&buffer, &a, sizeof(a));
memcpy(sendPacket+92,buffer,sizeof(buffer));
        
HAL_UART_Transmit(&huart7, (uint8_t*)sendPacket, length+5, 0xFFFF);

问题描述

在STM32中使用上述代码,通过memcpy将浮点变量a(值为22.0f)写入buffer,再将buffer内容复制到sendPacket偏移92的位置,最后通过蓝牙UART发送数据包。观测到数据包中的值异常,发送端蓝牙输出正常,但实际获取的值不符合预期,Live Watch结果与附图一致(上方其他重复代码已省略)。

排查方向

  • 修正memcpy参数:memcpy(&buffer, &a, sizeof(a))中&buffer写法错误,buffer本身就是数组首地址,应改为memcpy(buffer, &a, sizeof(a)),虽然地址值一致,但规范写法可避免潜在编译器优化问题。
  • 检查字节序匹配:STM32采用小端字节序,22.0f的IEEE754单精度表示为0x41B00000,小端存储后字节顺序是0x00 0x00 0xB0 0x41。若接收端按大端解析,会得到错误数值,需确认接收端的字节序处理逻辑是否与发送端匹配。
  • 验证数组访问边界:确认length+5的取值正确,保证sendPacket+92+4不超出数组200的长度,越界会覆盖其他数据导致数据包异常。
  • 简化复制流程:跳过buffer中间环节,直接将a复制到sendPacket对应位置:memcpy(sendPacket+92, &a, sizeof(a)),排除中间数组的潜在问题。
  • 确认观测对象:检查Live Watch是否正确显示sendPacket偏移92开始的4字节数据,避免因观测对象错误导致误判。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 01:50:35