文章目录
- 前言
- 一、项目介绍
-
- [1.1 项目目标](#1.1 项目目标)
- [1.2 技术栈与主要组件](#1.2 技术栈与主要组件)
- [1.3 整体架构思路](#1.3 整体架构思路)
- 二、车载中控系统界面
-
- [2.1 主界面](#2.1 主界面)
- [2.2 天气预报](#2.2 天气预报)
- [2.3 音乐播放器](#2.3 音乐播放器)
- [2.4 视频播放器](#2.4 视频播放器)
- [2.5 GPS定位](#2.5 GPS定位)
- [2.6 环境监测界](#2.6 环境监测界)
- 三、硬件驱动
- 总结
前言
提示:这里可以添加本文要记录的大概内容:
一、项目介绍
本项目是一个基于 Qt 5 + C++ 的车载中控系统 ,上层为 Qt 图形界面应用,下层通过 Linux 字符设备驱动与真实传感器和执行器交。
项目框架:

项目演示:




1.1 项目目标
- 提供一个接近真实车机的中控界面:环境监测、天气信息、简易地图、多媒体播放等。
- 打通从 Linux 设备驱动 → 上位机 C++ 封装 → Qt UI 展示/控制 的完整链路。
- 演示 多线程采集 + 信号槽更新 UI + 多媒体播放 + 硬件告警联动 的典型车载应用模式。
1.2 技术栈与主要组件
- 上层 UI:Qt Widgets(.ui 表单)、QSS 皮肤、QTimer/QPainter、自定义控件(如 RotatableWidget)。
- 多媒体:QMediaPlayer、QMediaPlaylist、歌词同步、进度控制与动画。
- 业务模块:Widget(主界面)、Environment(环境监测)、Weather、Map、Audio、Player 等。
- 硬件访问:Dht11、Sr04、Mq135、Led、Buzzer 等 C++ 类,封装对 /dev/* 字符设备的读写。
- 底层驱动:driver 目录中的 C 语言 Linux 驱动,向用户态导出 /dev/mysr04 等设备节点。
1.3 整体架构思路
- main.cpp 中创建 QApplication 和 Widget 主窗体,作为整个车机 UI 的"中控台"。
- Widget 聚合多个业务子界面,并通过信号槽进行模块切换与功能启动。
- 环境监测、多媒体播放等模块内部再拆分为:UI 层(QWidget)、逻辑层(工作线程/控制器对象)、硬件/数据访问层(设备封装类或多媒体引擎)。
二、车载中控系统界面
2.1 主界面
主界面类为 Widget,是一个继承自 QWidget 的窗口,职责类似"车机主菜单":
主界面职责:
- 展示车机首页:时间、天气概要、环境状态、多媒体状态等。
- 提供入口按钮或快捷方式,进入环境监测、天气、地图、音乐、视频等子界面。
- 通过信号 weather_start、environment_start、audio_start、player_start、map_start 拉起对应模块界面。
界面展示:

2.2 天气预报
本项目中的天气预报模块基于 Qt Widgets 实现,界面由 Weather 窗口负责展示当前天气概况和未来一段时间的天气信息。模块通过网络请求或本地模拟数据获取气象信息,然后在界面上以图标、温度、天气描述等形式进行直观展示。借助 Qt 的信号槽机制,界面可以在定时器触发或用户手动刷新时自动更新天气数据,并在主界面中以简要形式做概览展示,在独立的天气页面中呈现更详细的信息。
在实现过程中,天气模块主要涉及到网络数据获取(如 HTTP 请求与 JSON 解析)、数据模型与 UI 绑定以及多城市/多天的列表展示等内容,是一个把网络通信与界面展示结合起来的典型案例。关于天气预报模块的完整实现细节(包括数据获取、解析与界面布局),我在另一篇博客中做了更系统的说明,感兴趣可以参考:
https://blog.csdn.net/m0_73606184/article/details/155751608
界面展示:

2.3 音乐播放器
本项目的音乐播放器基于 Qt 的多媒体框架实现,核心使用 QMediaPlayer 搭配 QMediaPlaylist 来完成本地音乐的解码和播放。通过这两个类,可以方便地实现 mp3 等音频文件的顺序播放、单曲循环、上一首/下一首切换等常见功能,并结合 Qt 的信号槽机制完成界面联动。
QMediaPlayer 提供了丰富的信号,例如 stateChanged(QMediaPlayer::State state),可以用来判断当前是播放、暂停还是停止状态,从而动态更新播放按钮图标、进度条和歌词显示等界面元素。播放器界面整体包含:播放/暂停控制、上一首/下一首按钮、进度显示与拖动、播放模式切换、音量调节以及基础的歌曲信息展示,各部分逻辑都围绕 QMediaPlayer 的状态和位置变化信号来驱动。
音乐播放器的实现细节(包括播放列表管理、歌词显示、进度条联动等),我在另一篇博客中做了更完整的说明,感兴趣可以参考这里:
https://blog.csdn.net/m0_73606184/article/details/155792037
界面展示:

2.4 视频播放器
视频播放器模块与音乐播放器类似,同样基于 QMediaPlayer 实现媒体解码与控制,不同的是需要额外指定一个视频输出窗口(如 VideoWidget),让解码后的视频画面在该窗口中进行显示。
界面展示:

2.5 GPS定位
2.6 环境监测界
环境监测界面主要用于实时显示车内外的环境信息,包括温湿度(DHT11)、距离/防碰撞(SR04)、空气质量(MQ135)等指标,通过后台采集线程从底层驱动读取传感器数据,再以数值、进度条和告警灯等形式在界面上直观展示,并在超出阈值时联动 LED、蜂鸣器进行提示。
界面展示:

三、硬件驱动
3.1 底层驱动设计
在 driver 目录中,使用 C 语言实现了多个 Linux 字符设备驱动,用于访问不同的传感器和执行器,例如:
传感器类设备
- DHT11 温湿度传感器:驱动负责在内核态按协议读取数据,并通过 /dev 设备节点提供给用户态。
- SR04 超声波测距:驱动完成触发和回响时间测量,为用户态提供距离数据接口(如 /dev/mysr04)。
- MQ135 气体传感器:驱动对模拟/数字信号采集,并转换为相对浓度值。
执行器类设备
- Led:通过 GPIO 控制 LED 的开关或闪烁模式。
- Buzzer:控制蜂鸣器发声,实现告警提示。
这些驱动通常会:
- 在内核中注册字符设备,分配主从设备号。
- 实现 open/read/write/ioctl 等文件操作接口。
- 将底层硬件访问封装为简单的用户态读写操作。
编写驱动的步骤:
-
硬件分析与驱动模型选择
明确设备接口(如 I2C、SPI、内存映射)及硬件特性,据此选择驱动框架------字符设备、块设备、网络设备,或基于总线的驱动(如 platform、I2C、PCI)。
-
定义设备匹配信息
通过设备树(Device Tree)或在板级文件中定义静态平台数据,提供设备的硬件资源(寄存器地址、中断号等),确保驱动能正确识别并绑定设备。
-
实现驱动的入口和出口函数
- 使用 module_init() 指定初始化函数,在其中完成驱动注册(如platform_driver_register 或字符设备注册)。
- 使用 module_exit() 指定清理函数,完成注销操作。
- 对于总线驱动,设备的具体初始化通常在 probe 回调中完成;对于字符设备驱动,初始化函数会包含后续的设备号分配、cdev 注册等步骤。
-
确定设备号(字符设备驱动)
采用静态指定(register_chrdev_region)或动态分配(alloc_chrdev_region)方式获取主次设备号。
-
定义 file_operations 结构体
声明一个 static const struct file_operations 类型的变量,并根据需要初始化 .open、.read、.write、.unlocked_ioctl 等成员。
-
实现具体的操作函数
编写对应的 open、release、read、write 等方法,使用 copy_to_user/copy_from_user 安全传递数据,并考虑并发访问控制(如互斥锁)。
-
向内核注册字符设备
使用 cdev_init 初始化 struct cdev,再调用 cdev_add 将设备添加到内核;也可直接使用传统的 register_chrdev 函数。
-
自动创建设备节点
在驱动初始化成功(或总线驱动的 probe 函数)中,调用 class_create 创建一个设备类,然后使用 device_create 在 /dev 目录下生成设备文件,方便用户空间访问。
-
清理与释放资源
在出口函数(或总线驱动的 remove 函数)中,按相反顺序释放之前申请的资源:先销毁设备节点(device_destroy)和设备类(class_destroy),再删除字符设备(cdev_del),最后释放设备号(unregister_chrdev_region)。
以上步骤涵盖了从硬件分析到驱动卸载的完整流程,既适用于纯粹的字符设备驱动,也可融入总线驱动模型(如 platform 设备),实际开发时需根据具体场景适当调整。
3.2 底层驱动的具体实现
限于篇幅,各模块的具体驱动实现请参阅我此前的文章:
其余模块虽未单独成文,但其实现原理与上述示例基本一致,读者可参照理解。
3.3 环境监测链路示例
以环境监测为例,典型的数据流/调用链如下:
- 用户在主界面点击"环境监测"按钮,Widget 发出 environment_start 信号。
- 创建并显示 Environment 界面,同时启动 EnvironmentWork 后台工作对象(运行在 QThread 中)。
- EnvironmentWork 周期性调用 Dht11、Sr04、Mq135 等封装类,从 /dev/* 设备节点读取数据。
- 采集到的数据通过信号(如 sig_dht11_data(char[2])、sig_sr04_data(float))发送到 Environment 界面的槽函数 dht11_ui、sr04_ui、mq135_ui。
- Environment 根据数据更新 UI 控件(温湿度数值、距离条、空气质量指示灯等),并在必要时控制 Led、Buzzer 发出视觉或声音告警。
总结
本项目基于 Qt 5 和 C++ 实现了一套车载中控系统,完整打通了从底层 Linux 字符设备驱动到上层图形界面的开发链路。系统集成了环境监测(DHT11、SR04、MQ135)、天气预报、多媒体播放及 GPS 定位等功能,并通过多线程采集与信号槽机制实现了 UI 实时更新与硬件联动(LED、蜂鸣器)。底层驱动严格遵循字符设备规范,完成设备号分配、file_operations 实现与自动创建设备节点。本项目为嵌入式 Linux 与 Qt 联合开发提供了一个从硬件到应用的全流程参考范例,有助于理解系统分层、模块协作及多线程编程的实战应用。