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

如何在C语言中拼接数组中的整数二进制值?嵌入式ADC数据处理

解决SPI接收24位ADC数据的拼接与归一化问题

没问题,这事儿其实挺 straightforward 的,我给你拆解成数据拼接和归一化计算两步来实现,附上代码示例和关键注意点,完全适配嵌入式系统的场景:

1. 拼接24位整数

你的SPI数据是大端顺序(第一个字节是24位数据的最高8位),所以我们需要把三个字节按位拼接成一个完整的24位无符号整数。这里要注意数据类型的强制转换,避免嵌入式系统中常见的符号扩展或溢出问题。

代码实现:

#include <stdint.h> // 嵌入式系统必备的标准整数类型头文件

// 假设你的SPI接收缓冲区已经存好数据
uint8_t data_buffer[] = {0x18, 0x11, 0x8C}; // 对应你给出的24, 17, 140

// 拼接24位数据到32位无符号整数中(避免溢出)
uint32_t data_value = ((uint32_t)data_buffer[0] << 16)  // 高8位左移16位
                    | ((uint32_t)data_buffer[1] << 8)   // 中间8位左移8位
                    | data_buffer[2];                   // 低8位直接保留

关键说明:

  • 必须用uint32_t来存储拼接结果:如果直接用int,在16位或32位嵌入式系统中可能会出现溢出或符号问题;
  • 移位前强制转成uint32_t:如果你的data_buffer是signed char类型(部分编译器默认),不转换的话,当字节值大于0x7F时会触发符号扩展,导致拼接结果错误。

2. 计算归一化值

接下来把拼接好的24位整数除以0x7FFFFF(对应你的示例结果0.188,你问题里写的0x7FFFFFF应该是笔误),得到归一化后的浮点值。

代码实现:

// 用double精度更高,嵌入式系统如果有FPU的话效率也不差
double normalized_value = (double)data_value / 0x7FFFFF;

// 如果你的系统没有FPU,用float会更高效(精度稍低但足够)
// float normalized_value = (float)data_value / 0x7FFFFF;

验证你的示例:

拼接后的data_value是0x18118C(十进制1577356),除以0x7FFFFF(十进制8388607),计算结果正好是≈0.188,和你的预期完全一致。

完整测试代码

如果你想在PC上先验证逻辑,可以用这段完整代码:

#include <stdint.h>
#include <stdio.h>

int main() {
    uint8_t data_buffer[] = {0x18, 0x11, 0x8C};
    uint32_t data_value = ((uint32_t)data_buffer[0] << 16) | 
                          ((uint32_t)data_buffer[1] << 8) | 
                          data_buffer[2];
    double normalized_value = (double)data_value / 0x7FFFFF;
    
    printf("拼接后的24位值: 0x%X\n", data_value);
    printf("归一化结果: %.3f\n", normalized_value);
    
    return 0;
}

运行后会输出:

拼接后的24位值: 0x18118C
归一化结果: 0.188

额外注意事项

  • 字节顺序确认:如果你的ADC是小端输出(第一个字节是24位数据的最低8位),需要反转拼接顺序:data_value = ((uint32_t)data_buffer[2] <<16) | ((uint32_t)data_buffer[1] <<8) | data_buffer[0];
  • 无符号类型优先:嵌入式系统中处理外设数据时,尽量用uint8_t/uint32_t这类无符号整数类型,避免符号位带来的意外问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 06:23:47