Arrays 如何使用AVR在C中组合4个字节并进行数学计算

Arrays 如何使用AVR在C中组合4个字节并进行数学计算,arrays,byte,formula,long-integer,avr,Arrays,Byte,Formula,Long Integer,Avr,我有一个使用C的atMega1281微控制器。我有一个从CAN总线上提取4个字节的例程来读取SPN。我可以得到4个字节,但我无法打印4个字节的数字,因为它会截断前2个字节,使其成为16位数字。我尝试过使用unsignedlong作为声明,但没有成功。在AVR中使用32位数字的诀窍是什么 unsigned long engine_hours_raw; float engine_hours_uint; engine_hours_raw = (OneMessage.Msg.Data[3] <

我有一个使用C的atMega1281微控制器。我有一个从CAN总线上提取4个字节的例程来读取SPN。我可以得到4个字节,但我无法打印4个字节的数字,因为它会截断前2个字节,使其成为16位数字。我尝试过使用unsignedlong作为声明,但没有成功。在AVR中使用32位数字的诀窍是什么

unsigned long engine_hours_raw;
float engine_hours_uint;

engine_hours_raw =  (OneMessage.Msg.Data[3] << 24) | (OneMessage.Msg.Data[2] << 16) | (OneMessage.Msg.Data[1] << 8) | OneMessage.Msg.Data[0]);
engine_hours_uint = engine_hours_raw * 0.05;

ftoa(engine_hours_uint, engHours, 1);
UART1_Printf("Engine Hours: %s   ", engHours);
unsigned long engine\u hours\u raw;
浮动发动机小时数;

engine_hours_raw=(OneMessage.Msg.Data[3]
(OneMessage.Msg.Data[3]有更简单、更直接的方法:)


只是想确定一下:您是如何打印4字节数字的?我实际上使用ftoa将浮点转换成字符串,然后作为字符串打印。@Eddie在裸机嵌入式系统上,它不需要遵守标准,因为我们知道指针是内存中的实际地址:)“unsigned long”?看在上帝的份上,一定要对32位无符号整数使用
uint32\u t
!为什么要把它复杂化?我们处在一个裸机嵌入的世界。指针和地址是众所周知的:)这个解决方案有效。我找到了一份文件,解释了关于声明的更多细节。谢谢你,叔叔!
engine_hours_raw = OneMessage.Msg.Data[3];
engine_hours_raw <<= 8;
engine_hours_raw |= OneMessage.Msg.Data[2];
engine_hours_raw <<= 8;
engine_hours_raw |= OneMessage.Msg.Data[1];
engine_hours_raw <<= 8;
engine_hours_raw |= OneMessage.Msg.Data[0];
engine_hours_raw =  ((unit32_t)(OneMessage.Msg.Data[3]) << 24) | ((unit32_t)(OneMessage.Msg.Data[2]) << 16) | ((unit32_t)(OneMessage.Msg.Data[1]) << 8) | (unit32_t)(OneMessage.Msg.Data[0]);
uint32_t *engine_hours_raw = (uint32_t *)OneMessage.Msg.Data;
float engine_hours_uint  = *engine_hours_raw * 0.05;