请教大家: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
一般有三种方法,共用体、指针、位移
请晓版主仔细说下,我以为把u8的数据FF,转化为u32,会变成0x000000FF,所以我就左移16位。 所有参与运算的数据,数据类型必须一致,等号两端数据类型必须一致,不一致就加强制类型转换,如(unsigned long) DebugLab 发表于 2025-7-26 17:14
所有参与运算的数据,数据类型必须一致,等号两端数据类型必须一致,不一致就加强制类型转换,如(unsigned...
谢谢版主回复,我是C的小白 ,我把TT_DATA=((u32)AA)<<16;改为TT_DATA=AA*256*256后,计算正确了,只是困惑为什么左移16次不可以。 newlined 发表于 2025-7-28 09:25
谢谢版主回复,我是C的小白 ,我把TT_DATA=((u32)AA)
*256*256前面的A也要加上类型转换操作,这两操作是等价的
ercircle 发表于 2025-7-28 10:10
*256*256前面的A也要加上类型转换操作,这两操作是等价的
谢谢版主的回复,加上强制类型转换可以了。我用的是STC32G12K128的CPU,下载菜单中没有选择CPU指令模式这个选项,如果将来用8052的CPU1,这个选项是不是要改为32-bit? 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交流社区
ercircle 发表于 2025-7-28 14:12
这个是Ai8051U系列,能用32bit当然优先选32的。
一些8bit 32bit常见printf问题可以看看:
printf函数 的...
好的,谢谢版主
页:
[1]