2. 车速数字仪表显示

任务与实现范围

本案例在 HUD 画面上实时显示车速数字,并提供 km/h 与 mph 两种单位切换。核心逻辑:车速以 km/h 为内部基准值,显示时按当前单位换算;单位切换只改变显示文本,不改变内部数值。车速来源用可替换的输入函数模拟,便于接入真实 CAN 信号。

关键设计

  • 内部统一用 km/h 存储,避免多单位混算。
  • 换算系数:1 km/h ≈ 0.621371 mph。
  • 显示格式:整数 + 单位后缀,例如 72 km/h。
  • 单位切换用枚举,避免字符串散落各处。
车速源(km/h) 单位换算 km/h ↔ mph 格式化文本 HUD

完整代码

#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 的返回值来源,其余逻辑不变。