描述
开 本: 16开纸 张: 胶版纸包 装: 平装是否套装: 否国际标准书号ISBN: 9787302413141丛书名: 高职高专立体化教材计算机系列
本书以完成一个智能家居项目为主线,讲述了实训各个阶段所需要的知识。全书分为三篇,篇讲述了项目的界面部分,用Qt程序设计,并以一个小项目媒体播放器的制作来加深理解。第二篇讲述了项目的驱动程序部分,即基于ARM学习板及扩展电路板的驱动程序的编写。第三篇讲述了系统的集成,即嵌入式Qt界面控制硬件,完成一个简易的智能家居项目。
本书适合作为大专院校嵌入式专业、物联网专业学生的实训教材。此外,有志从事嵌入式Linux开发的人员可以把本书作为入门级读物。
篇 Qt程序设计
第1章 Qt编程基础及开发环境的搭建 1
1.1 Qt的起源 1
1.2 Linux系统下的图形界面 3
1.2.1 Linux本身包括内核和Shell 3
1.2.2 关于X11 4
1.2.3 窗口管理器(综合桌面环境) 5
1.3 Qt的特点及主要构成 5
1.3.1 Qt的特点 5
1.3.2 Qt开发环境的主要构成 7
1.4 Qt开发环境的搭建 8
1.4.1 安装Qt Creator 8
1.4.2 安装虚拟机 11
1.4.3 在虚拟机中安装Linux
操作系统 15
1.5 使用Qt开发环境创建个
应用程序 28
1.5.1 关于可视化编程 28
1.5.2 Qt Creator常用菜单的
功能介绍 28
1.5.3 举例 29
第2章 Qt编程基础 36
2.1 C++基础 36
2.2 Qt程序编译过程分析 43
2.2.1 Qt Creator中应用程序的
编译过程 43
2.2.2 Qt的元对象系统 48
2.2.3 Qt资源文件 49
2.3 Qt控件编程 52
2.3.1 Qt的帮助系统 53
2.3.2 Qt Creator界面中的控件 54
2.3.3 常用控件举例 57
2.4 Qt布局管理 60
2.5 信号与槽 61
2.6 媒体播放器的制作 62
2.6.1 制作界面 62
2.6.2 编写控件的事件代码 64
第3章 智能家居项目Qt界面设计 75
3.1 界面跳转 75
3.2 智能家居多级子项目界面设计 81
3.2.1 智能家居项目需求分析 81
3.2.2 代码实现 82
第二篇 驱动程序开发
第4章 搭建开发环境 93
4.1 软件开发环境的搭建 93
4.1.1 安装VMware Workstation
软件 93
4.1.2 建立虚拟电脑 94
4.1.3 Ubuntu 12.04的安装 102
4.1.4 Ubuntu 12.04系统的配置 106
4.1.5 安装使用Source Insight 113
4.1.6 交叉环境的搭建 127
4.2 硬件环境介绍 129
4.2.1 S3C2440芯片介绍 129
4.2.2 S3C2440开发板主要硬件的
说明 133
第5章 驱动程序开发的内核基础 144
5.1 嵌入式Linux操作系统的移植
过程概述 144
5.1.1 Linux操作系统及其特点 144
5.1.2 嵌入式Linux操作系统的
特点 144
5.1.3 嵌入式Linux系统的
移植步骤 145
5.2 基于GEC2440开发板的内核移植 146
5.2.1 Linux-2.6.30内核移植 146
5.2.2 驱动模块的动态编译与
静态编译 153
5.3 常见的嵌入式内核驱动编译与
移植 161
5.3.1 LCD驱动移植 161
5.3.2 触摸屏驱动移植 166
5.3.3 USB驱动移植 170
5.3.4 网卡驱动移植 174
第6章 智能家居项目驱动程序实验 177
6.1 房间灯驱动程序 177
6.1.1 实验目的 177
6.1.2 实验原理 178
6.1.3 实验步骤 178
6.2 窗帘模块驱动程序 186
6.2.1 光敏电阻驱动程序 186
6.2.2 步进电机的驱动程序 194
6.3 温湿度控制模块驱动程序 203
6.3.1 温湿度传感器DHT11
驱动程序 203
6.3.2 直流电机驱动程序 211
6.4 烟雾及红外检测模块驱动程序 215
6.4.1 烟雾传感器MQ-2驱动
程序 215
6.4.2 红外模块驱动程序 222
6.4.3 蜂鸣器驱动程序 228
第三篇 系统集成
第7章 Qt图形下载到学习板 239
7.1 带QtE4的文件系统分析 239
7.2 对QtE应用程序的编译 240
第8章 智能家居项目集成 241
8.1 把测试程序加入到Qt程序中 241
8.1.1 灯光控制界面 241
8.1.2 窗帘控制界面 244
8.1.3 温湿度控制界面 248
8.1.4 烟雾及红外检测界面 253
8.2 驱动程序的统一加载 257
附录 制作根文件系统 258
参考文献 263
Linux操作系统作为源码开放的自由软件,经过20多年的发展与壮大,越来越受到IT界的认可,运行于ARM平台的嵌入式Linux在智能家居、智能汽车等智能化管理系统中的运用占据了很大的比重。嵌入式Linux的学习和开发相对于纯粹的程序设计或是电路设计而言,门槛更高一点,因为知识面要求更广一点,既要精通软件,硬件知识也要懂一点。横跨软硬件的嵌入式Linux驱动程序开发是学生感困难的地方,但可视化的Qt程序设计,是相对容易一些的。本书通过一个通俗、简易的智能家居项目,先讲述如何以Qt创建界面,然后讲述驱动程序的编写,后集成为可视化的界面控制硬件,从而减轻读者的学习压力,引发读者的学习兴趣。
本书的软件开发是基于Windows下编辑、Linux下编译的模式,注重讲解实验的过程,力求从看到的实验现象去分析背后的原理。
在篇的Qt程序设计中,第1章讲解Qt的起源及开发环境的搭建;第2章通过几个例题讲解,让读者从C++基础知识及Linux中的gcc makefile等基础知识过渡到Qt集成开发环境Qt Creator的使用,并重点分析使用Qt Creator编辑的程序在Linux中编译的过程;第3章详细讲解媒体播放器的制作,加深对Qt程序设计技能的掌握。
在第二篇的驱动程序开发中,第4章讲解软件开发环境的搭建,并详细介绍实验的硬件平台;第5章讲解Linux内核对驱动程序的支撑,并介绍一些常见设备的驱动程序;第6章介绍本书的智能家居项目所需的8个驱动程序。
在第三篇的系统集成中,主要完成的工作是在硬件平台上把图形界面与驱动程序连接起来,实现图形界面与硬件的交互。
本书由广东理工职业学院的龙华和深圳技师学院的谢剑明共同编写,书中的代码在Windows下的Qt Creator、SourceInsight以及Redhat Enterprise 5虚拟机中编写,并且在GEC2440 学习板和扩展板上通过测试。篇和第二篇是相对独立的,读者可以单独学习篇,也可以单独学习第二篇。
本书随书赠送的资源可从清华大学出版社的网站下载。
本书所讲解的简易智能家居项目曾经是作者所带的12级嵌入式专业的“嵌入式技术综合实训”的课程项目,在此感谢这些学生,他们给了作者很多灵感。学生的想法是特殊的、新颖的,特别是在图形界面方面的设计,比老师的更容易扩展。
本书难免有不完美之处和错误的地方,写作方法也因构思创新而有需要进一步改良的地方,恳请广大读者提出宝贵的意见。
龙 华
主要内容
C++基础
Qt程序编译过程分析
Qt的常用控件
Qt布局管理
信号与槽机制
媒体播放器的制作
Qt是一个完全的C++程序开发框架,包含数百个使用C++编写的类组成
的类库和跨平台国际化开发工具。基于控件的编程使得Qt编写界面比
MFC(Windows下的基于C++应用程序框架)更加方便。Qt API和开发工具
对所有支持平台都是一致的,从而可以进行独立于平台的程序开发和
配置,使得跨平台软件编程直观、简易和方便。
2.1 C++基础
Qt是在标准C++上的扩展,读者如果有标准C++的基础,则再学Qt将更
容易一些。
例2.1 建立一个Point类a.cpp,包含数据成员x、y,编写main()进行
测试。
(1) 使用g++进行编译。
(2) 把这个Point类拆分为aa.h、aa.cpp、main.cpp,编写
makefile进行编译。
解:
编写的代码如下:
#include
using namespace std;
class Point
{
public:
Point(float a=0, float b=0);
float getX();
float getY();
protected:
float x, y;
};
Point::Point(float a, float b) {
x = a;
y = b;
}
float Point::getX() {
return x;
}
float Point::getY() {
return y;
}
int main() {
Point point(3.2, 4.5);
cout<
}
使用g++进行编译:g++ -o mm a.cpp,执行./mm,可以看到结果
point: (3.2,4.5)。
我们把a.cpp拆分为3个文件aa.h、aa.cpp、main.cpp,分别如下。
aa.h:
#include
class Point
{
public:
Point(float a=0, float b=0);
float getX();
float getY();
protected:
float x, y;
};
aa.cpp:
#include “aa.h”
Point::Point(float a, float b)
{
x = a;
y = b;
}
float Point::getX()
{
return x;
}
float Point::getY()
{
return y;
}
main.cpp:
#include “aa.h”
using namespace std;
int main()
{
Point point(3.2,4.5);
cout<
}
再编写一个makefile,如下所示,执行make,也可以输出point: (3.2
,4.5)。
aa.o:aa.cpp aa.h
g++ -c aa.cpp -o aa.o
main.o:main.cpp
g++ -c main.cpp -o main.o
mm:aa.o main.o
g++ -o mm aa.o main.o
例2.2 新建Circle类,继承自例2.1中的Point,进行如下操作。
(1) Circle类具有成员变量radius,能够计算面积,使用g++编译
。
(2) 把Circle类拆分成3个文件,即circle.h、circle.cpp、
main.cpp,编写一个makefile,进行编译,达到同样的功能。
解:
(1) 在Linux虚拟机中,使用gedit或vim编辑如下代码,命名为
mm.cpp。
#include
using namespace std;
class Point
{
public:
Point(float a=0, float b=0);
float getX();
float getY();
protected:
float x, y;
};
Point::Point(float a, float b)
{
x = a;
y = b;
}
float Point::getX()
{
return x;
}
float Point::getY()
{
return y;
}
class Circle : public Point
{
public:
explicit Circle(float x=0, float y=0, float r=0);
void setRadius(float r);
float getRadius();
float area();
protected:
float radius;
};
Circle::Circle(float a, float b, float r): Point(a,b),
radius(r)
{
}
void Circle::setRadius(float r)
{
radius = r;
}
float Circle::getRadius()
{
return radius;
}
float Circle::area()
{
return 3.14159*radius*radius;
}
int main()
{
Point point(3.2,4.5);
cout<
Circle *circle = new Circle(2.4, 1.2, 5.6);
cout<area()<
}
使用g++ -o mm mm.cpp,可以得到可执行性文件mm,执行./mm可以得
到结果:
g++ -o mm mm.cpp
./mm
point:(3.2,4.5)
Circle 的面积area is: 98.5203
这里,我们重点解释一下语句Circle::Circle(float a, float b,
float r): Point(a,b), radius(r),这一行是Circle类的构造函数继
承了父类的构造函数,使用标识符“:”,有点像Java编程中的super
关键字,在执行子类的构造函数之前,必须先执行父类的构造函数。
在这一条语句中,子类构造函数参数a、b、r 分别传给了Point(a, b)
和radius(r),对前者就是以a、b为参数,调用Point类的构造函数,
对后者就是把r的值赋给Circle类的成员变量radius。
(2) 在例2.1中,已经将a.cpp拆分为aa.h、aa.cpp了,在本例中
,我们再把Circle类分割成circle.h、circle.cpp,分别如下:
#include “aa.h”
class Circle:public Point
{
public:
explicit Circle(float x=0, float y=0, float r=0);
void setRadius(float r);
float getRadius();
float area();
protected:
float radius;
};
#include “circle.h”
Circle::Circle(float a, float b, float r): Point(a,b),
radius(r)
{
Point(a, b);
radius = r;
}
void Circle::setRadius(float r)
{
radius = r;
}
float Circle::getRadius()
{
return radius;
}
float Circle::area()
{
return 3.14159*radius*radius;
}
再生成一个main.cpp,如下所示:
#include “circle.h”
#include “aa.h”
using namespace std;
int main()
{
Point point(3.2,4.5);
cout<
Circle *circle = new Circle(2.4, 1.2, 5.6);
cout<area()<
}
编写一个makefile,如下:
circle:aa.o circle.o main.o
g++ circle.o main.o aa.o -o circle
aa.o:aa.cpp aa.h
g++ -c aa.cpp -o aa.o
circle.o:circle.cpp circle.h
g++ -c circle.cpp -o circle.o
main.o:main.cpp circle.h
g++ -c main.cpp -o main.o
执行make,再执行./circle,可得上面一样的结果。
评论
还没有评论。