找回密码
 立即注册
查看: 79|回复: 8

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

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 5 天前 | 显示全部楼层 |阅读模式
如题:我需要把3个字节长度的数据如:0x123456,存到ST32G的Flash中,然后读出来。程序是在例程《19-使用LVD低压检测中断保存EEPROM》的基础上做的,程序如下:


void        READ_DATA(u32 TT_ADDR,u32 TT_DATA)                //读出数据
{                                               
        u8        AA[3]={0,0,0};                                                //低8位,中8位,高8位
        EEPROM_read_n(TT_ADDR,AA,3);                       //调用例程中的函数
        
        SBUF=AA[2];                                                        //数据读出后送到串口
        while(!TI);
        SBUF=AA[1];
        while(!TI);
        SBUF=SBUF=AA[0];
        while(!TI);
        
        TT_DATA=((u32)AA[2])<<16;                                //组装数据
        TT_DATA=TT_DATA+((u32)AA[1])<<8;
        TT_DATA=TT_DATA+AA[0];
        
        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[2])<<16;                                //组装数据
这一句出了问题?当Flash中没有数据时,读出的应该都是FF,在数据读出后,未组装之前,送到串口都是FF还是对的,在组装后,再次拆开,送到串口,高8位就变成了00,请问3个字节数据如何组装?谢谢。

回复

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:500
  • 最近打卡:2025-07-31 02:10:14
已绑定手机

38

主题

2302

回帖

3014

积分

荣誉版主

积分
3014
发表于 5 天前 | 显示全部楼层
一般有三种方法,共用体、指针、位移
睁开眼睛做场梦~~~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 5 天前 | 显示全部楼层
晓*** 发表于 2025-7-26 16:32
一般有三种方法,共用体、指针、位移

请晓版主仔细说下,我以为把u8的数据FF,转化为u32,会变成0x000000FF,所以我就左移16位。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-07-31 08:58:47
已绑定手机

87

主题

5532

回帖

1万

积分

超级版主

DebugLab

积分
10123
发表于 5 天前 | 显示全部楼层
所有参与运算的数据,数据类型必须一致,等号两端数据类型必须一致,不一致就加强制类型转换,如(unsigned long)
DebugLab
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 3 天前 | 显示全部楼层
Debu*** 发表于 2025-7-26 17:14
所有参与运算的数据,数据类型必须一致,等号两端数据类型必须一致,不一致就加强制类型转换,如(unsigned  ...

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

点评

*256*256前面的A也要加上类型转换操作,这两操作是等价的 [attachimg]110010[/attachimg]  详情 回复 发表于 3 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-31 08:55:10
已绑定手机

78

主题

2294

回帖

5226

积分

荣誉版主

无情的代码机器

积分
5226
发表于 3 天前 | 显示全部楼层
newl*** 发表于 2025-7-28 09:25
谢谢版主回复,我是C的小白 ,我把TT_DATA=((u32)AA[2])

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

截图202507281010151544.jpg
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2025-7-28 10:10
*256*256前面的A也要加上类型转换操作,这两操作是等价的

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

点评

这个是Ai8051U系列,能用32bit当然优先选32的。  详情 回复 发表于 3 天前
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家I
  • 打卡总天数:253
  • 最近打卡:2025-07-31 08:55:10
已绑定手机

78

主题

2294

回帖

5226

积分

荣誉版主

无情的代码机器

积分
5226
发表于 3 天前 | 显示全部楼层
newl*** 发表于 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交流社区
三天不学习,赶不上刘少奇~
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:441
  • 最近打卡:2025-07-31 07:53:41

41

主题

213

回帖

1439

积分

金牌会员

积分
1439
发表于 3 天前 | 显示全部楼层
erci*** 发表于 2025-7-28 14:12
这个是Ai8051U系列,能用32bit当然优先选32的。
一些8bit 32bit常见printf问题可以看看:
printf函数 的  ...

好的,谢谢版主
回复 支持 反对

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-7-31 22:56 , Processed in 0.120179 second(s), 96 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表