newlined 发表于 2025-7-26 16:24:43

请教大家:3个字节的数据如何组装起来

如题:我需要把3个字节长度的数据如:0x123456,存到ST32G的Flash中,然后读出来。程序是在例程《19-使用LVD低压检测中断保存EEPROM》的基础上做的,程序如下:


void      READ_DATA(u32 TT_ADDR,u32 TT_DATA)                //读出数据
{                                             
      u8      AA={0,0,0};                                                //低8位,中8位,高8位
      EEPROM_read_n(TT_ADDR,AA,3);                     //调用例程中的函数
      
      SBUF=AA;                                                      //数据读出后送到串口
      while(!TI);
      SBUF=AA;
      while(!TI);
      SBUF=SBUF=AA;
      while(!TI);
      
      TT_DATA=((u32)AA)<<16;                              //组装数据
      TT_DATA=TT_DATA+((u32)AA)<<8;
      TT_DATA=TT_DATA+AA;
      
      SBUF=TT_DATA>>16;                                        //数据再次拆开,送到串口
      while(!TI);
      SBUF=TT_DATA>>8;
      while(!TI);
      SBUF=TT_DATA;
      while(!TI);      
}


经过调试发现,高8位是错的,中8位和低8位是对的,例程中的数据是2字节的,这个是3字节的,是不是TT_DATA=((u32)AA)<<16;                              //组装数据
这一句出了问题?当Flash中没有数据时,读出的应该都是FF,在数据读出后,未组装之前,送到串口都是FF还是对的,在组装后,再次拆开,送到串口,高8位就变成了00,请问3个字节数据如何组装?谢谢。

晓飛飛 发表于 2025-7-26 16:32:22

一般有三种方法,共用体、指针、位移

newlined 发表于 2025-7-26 16:41:38

晓飛飛 发表于 2025-7-26 16:32
一般有三种方法,共用体、指针、位移
请晓版主仔细说下,我以为把u8的数据FF,转化为u32,会变成0x000000FF,所以我就左移16位。

DebugLab 发表于 2025-7-26 17:14:25

所有参与运算的数据,数据类型必须一致,等号两端数据类型必须一致,不一致就加强制类型转换,如(unsigned long)

newlined 发表于 2025-7-28 09:25:33

DebugLab 发表于 2025-7-26 17:14
所有参与运算的数据,数据类型必须一致,等号两端数据类型必须一致,不一致就加强制类型转换,如(unsigned...

谢谢版主回复,我是C的小白 ,我把TT_DATA=((u32)AA)<<16;改为TT_DATA=AA*256*256后,计算正确了,只是困惑为什么左移16次不可以。

ercircle 发表于 2025-7-28 10:10:21

newlined 发表于 2025-7-28 09:25
谢谢版主回复,我是C的小白 ,我把TT_DATA=((u32)AA)

*256*256前面的A也要加上类型转换操作,这两操作是等价的


newlined 发表于 2025-7-28 14:11:26

ercircle 发表于 2025-7-28 10:10
*256*256前面的A也要加上类型转换操作,这两操作是等价的

谢谢版主的回复,加上强制类型转换可以了。我用的是STC32G12K128的CPU,下载菜单中没有选择CPU指令模式这个选项,如果将来用8052的CPU1,这个选项是不是要改为32-bit?

ercircle 发表于 2025-7-28 14:12:24

newlined 发表于 2025-7-28 14:11
谢谢版主的回复,加上强制类型转换可以了。我用的是STC32G12K128的CPU,下载菜单中没有选择CPU指令模式这 ...
这个是Ai8051U系列,能用32bit当然优先选32的。
一些8bit 32bit常见printf问题可以看看:
printf函数 的 格式参数; USB接口 使用 printf 打印数据 - 串行口,DMA支持的4组串口,RS232,RS485,Modbus, CRC16 国芯人工智能技术交流网站 - AI32位8051交流社区

newlined 发表于 2025-7-28 14:19:26

ercircle 发表于 2025-7-28 14:12
这个是Ai8051U系列,能用32bit当然优先选32的。
一些8bit 32bit常见printf问题可以看看:
printf函数 的...

好的,谢谢版主
页: [1]
查看完整版本: 请教大家:3个字节的数据如何组装起来