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

How to combine 4 bytes and do math calculation in C using AVR

我有一个使用 C 语言的 atMega1281 微控制器。我有一个例程可以从 CAN 总线上拉出 4 个字节来读取 SPN。我能够获得 4 个字节,但我无法打印 4 个字节的数字,因为它截断了前 2 个字节,使其成为 16 位数字。我曾尝试使用 unsigned long 作为声明,但没有成功。在 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);

(OneMessage.Msg.Data[3] << 24) 将为 0,因为表达式的默认大小为 int。除非它被施放。

相反,将数据加载到 long int 中,然后执行移位。

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];

您也可以将中间表达式转换为无符号日志或 uint32_t,但它同样混乱并且可能需要更长的时间。

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;