2. 车速数字仪表显示
任务与实现范围
本案例在 HUD 画面上实时显示车速数字,并提供 km/h 与 mph 两种单位切换。核心逻辑:车速以 km/h 为内部基准值,显示时按当前单位换算;单位切换只改变显示文本,不改变内部数值。车速来源用可替换的输入函数模拟,便于接入真实 CAN 信号。
关键设计
- 内部统一用 km/h 存储,避免多单位混算。
- 换算系数:1 km/h ≈ 0.621371 mph。
- 显示格式:整数 + 单位后缀,例如
72 km/h。 - 单位切换用枚举,避免字符串散落各处。
完整代码
#include <stdio.h>
#include <string.h>
typedef enum { UNIT_KMH, UNIT_MPH } SpeedUnit;
typedef struct {
float speed_kmh; /* 内部统一以 km/h 存储 */
SpeedUnit unit;
} SpeedDisplay;
/* 模拟车速输入,实际项目替换为 CAN 信号读取 */
static float read_speed_kmh(void) {
return 72.0f;
}
static void set_unit(SpeedDisplay *d, SpeedUnit u) {
d->unit = u;
}
/* 将内部 km/h 按当前单位格式化为显示文本 */
static void format_speed(const SpeedDisplay *d, char *out, size_t n) {
if (d->unit == UNIT_MPH) {
float mph = d->speed_kmh * 0.621371f;
snprintf(out, n, "%.0f mph", mph);
} else {
snprintf(out, n, "%.0f km/h", d->speed_kmh);
}
}
int main(void) {
SpeedDisplay disp;
disp.speed_kmh = read_speed_kmh();
disp.unit = UNIT_KMH;
char buf[32];
format_speed(&disp, buf, sizeof(buf));
printf("HUD: %s\n", buf);
set_unit(&disp, UNIT_MPH);
format_speed(&disp, buf, sizeof(buf));
printf("HUD: %s\n", buf);
return 0;
}
运行与验证
编译运行:gcc speed.c -o speed && ./speed。输入车速固定为 72 km/h,按代码逻辑可唯一推出输出:
HUD: 72 km/h
HUD: 45 mph
判定通过条件:第一行单位后缀为 km/h 且数值等于输入车速;第二行单位后缀为 mph 且数值等于 72×0.621371 四舍五入结果(45)。若接入真实车速源,只需替换 read_speed_kmh 的返回值来源,其余逻辑不变。