“嵌入式系统课程设计”报告要求
1、学生应独立完成不少于15页5000字以上的设计报告,A、B两同学报告
雷同超过60%都设计成绩均记不及格。
2、课程设计报告要求用A4纸打印。题目:2号黑体;一级标题:3号宋体;
二级标题:小3号宋体;三级标题:4号宋体;正文:小4号宋体,1.5倍行距。页边距:上下左2.5cm、右2.0cm。图表要规范,清晰,有图名及表名。
3、封面格式统一(见最后一页)。
4、报告要求包含下列内容:
设计题目、设计要求、设计的作用目的、设计方案、系统硬件设计、系统软件设计(硬件设计要分模块电路设计及分析、软件设计要有程序流程图)、系统仿真与调试(调试过程中出现的问题及解决方法)、心得体会、参考文献,以上不分章节,每一点作为一级标题。
5、课程设计报告(打印稿)应在设计结束后的下周一(第16周周一)前交指导教师批阅,延迟不交者成绩记不及格。课程设计成绩应按教学大纲基本要求和相应评分细则进行评定和记载。成绩分为优秀、良好、中等、及格、不及格五个等级,优秀率一般不超过学生人数的15%。对不及格学生,应严格按照学院学分制与学籍管理实施细则的有关规定处理。
电气与信息工程学院
报告雷同者、报告内容文不对题者、格式混乱者,成绩记不及格!!!
报告内容提纲
一、设计题目
二、设计要求(包括设计内容描述)
三、设计作用与目的
四、所用设备及软件
五、系统设计方案
1系统总体设计(要有系统总体结构框图)
2.简要阐述系统工作原理
六、系统硬件设计(包含系统总体结构电路原理图及各部分电路原理图)
1.系统整体设计
2.各单元电路设计
七、系统软件设计(要有程序流程图)
1.主程序流程设计
2.子程序设计
八、仿真调试分析(仿真调试工具、方法、运行效果)
九、设计中的问题及解决方法
十、嵌入式系统学习心得
十一、参考文献
湖南文理学院
课程设计报告
课程名称: 嵌入式系统课程设计 专业班级: 通信工程11101班 学号(2位) 学生姓名:
指导教师:
完成时间: 20xx年 月 日
报告成绩:
湖南文理学院制
目录
1设计目的:... 1
2设计任务及要求:... 1
3设计思路... 2
4设计实现... 2
4.1MiniGui运行环境设置... 2
4.2、Minigui交叉编译环境的建立... 3
4.3、MiniGui在S3C2440上的移植... 5
5界面编程... 6
5.1基本的编程概念... 6
5.2头文件... 7
5.3程序入口点... 7
5.4进入消息循环... 7
5.5窗口过程函数... 7
5.6程序的推出... 7
5.7编译、链接和运行... 7
5.8对话框编程基础... 8
5.9对话框的回调函数... 8
5.10控件编程基础... 10
5.11可以看到运行的界面如下图所示:... 16
5.12打开串口... 16
5.13设置串口... 17
5.14串口读写... 19
5.15键盘处理程序... 23
6调试... 23
7设计总结... 24
8设计参考文献... 24
1.进一步巩固嵌入式系统的基本知识;
2.掌握嵌入式应用系统的基本结构;
3.掌握嵌入式系统开发环境建立和使用;
4.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
5.学会查阅有关专业资料及设计手册;
6. MiniGUI界面编程。
1.掌握嵌入式系统开发环境建立和使用;
2.掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;
3、MiniGUI在PC上的安装、移植
4、Linux串口编程与MiniGUI界面编程
5、串口传输数据(位图)并在TQ2440的LCD上显示
6.编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;
7.绘制有关图纸.
基础知识的回顾复习,包括:虚拟机的安装,Fedora10的基本使用,嵌入式系统开发环境建立和使用,嵌入式系统基本驱动、应用程序的设计调试和编译移植方法.。
MiniGUI在pc机上的安装。(可参照《minigui用户手册》)
参照《Minigui技术白皮书》和《Minigui编程指南》学习基于 MiniGUI的应用界面编程方法。
运行minigui演示程序,设计界面,开始界面编程。
交叉编译环境的建立,及MiniGui在TQ2440上的移植
开始综合调试
1、安装qvfb
进入到/opt/minigui目录下:cd /opt/minigui
解压:#tar zxvf /mnt/hgfs/linux/ qvfb-1.1.tar.gz
#cd / qvfb-1.1
#./configure //生成Makefile文件
#make //编译
#make install //安装
测试qvfb
#qvfb &
2、安装运行MiniGui
在/opt下新建目录/opt/minigui
1)、先将下载的源码包,包括libminigui-1.6.10.tar.gz minigui-res-1.6.10.tar.gz、mde-1.6.10.tar.gz放到共享目录下。
2)、资源文件的安装
进入到/opt/minigui目录下:cd /opt/minigui
解压:#tar zxvf /mnt/hgfs/linux/minigui-res-1.6.10.tar.gz
安装:#cd /minigui-res-1.6.10
#make install
3)、配置和编译minigui
进入到/opt/minigui目录下cd /opt/minigui
解压:#tar zxvf /mnt/hgfs/linux/libminigui -1.6.10.tar.gz
#cd / libminigui -1.6.10
#./configure //生成Makefile文件
#make //编译
#make install //安装
在文件/etc/ld.so.conf添加/usr/local/lib
3)编译并运行MiniGui的演示程序
解压:#tar zxvf /mnt/hgfs/linux/mg-samples-1.6.10.tar.gz
#cd mg-samples-1.6.10
#./configure
#make
#qvfb & //出现如下图所示
为了匹配,修改配置如下图:
#cd /opt//minigui/mg-samples-1.6.10/src
#./helloworld
执行完后会启动字体演示程序,若能正常显示,说明 MiniGui环境成功建立。
1、安装交叉编译器arm-linux-gcc
2、在/opt/minigui下新建目录temp
#cd /opt/minigui
#mkdir temp
3、建立交叉编译的lib
修改libminigui -1.6.10下的configure文件,在文件头添加
CC= arm-linux-gcc
CPP= arm-linux--cpp
LD= arm-linux-ld
AR= arm-linux-ar
RANLIB= arm-linux-ranlib
STRIP= arm-linux-strip
将libcross.sh拷到libminigui -1.6.10文件夹中
libcross.sh文件内容如下:
#/bin/sh
./configure --prefix=/opt/minigui/temp/ --host=arm-linux --target=arm-linux
make
make install
运行脚本#sh libcross.sh
之后可以查看到/opt/minigui/temp下面生成了etc、lib、include三个目录
4、建立交叉编译的res
修改minigui-res-1.6.10下的config.linux文件的第11行TOPDIR=/home/nick/minigui/tmp
将rescross.sh 拷到minigui-res-1.6.10文件夹中
rescross.sh文件内容如下:
#!/bin/sh
make install
运行脚本#sh rescross.sh
可以查看/opt/minigui/temp下面生成usr目录
5、修改mg-samples-1.6.10下的configure文件,在文件头添加
CC= arm-linux-gcc
CPP= arm-linux--cpp
LD= arm-linux-ld
AR= arm-linux-ar
RANLIB= arm-linux-ranlib
STRIP= arm-linux-strip
将samplecorss.sh拷到mg-samples-1.6.10文件夹中
samplecorss.sh文件内容如下:
#!/bin/sh
./configure --host=arm-linux --target=arm-linux --prefix=/opt/minigui/temp/ LDFLAGS=-L/opt/minigui/temp/lib CPPFLAGS=-I/opt/minigui/temp/include CFLAGS=-I/opt/minigui/temp/include
Make
运行脚本#sh samplecorss.sh
可以查看/opt/minigui/ mg-samples-1.6.10/src下生成了可执行文件
1、修改/opt/minigui/temp下的etc下的MINIGUI的配置文件
[system]
#GAL engine and default options
gal_engine=fbcon
defaultmode=800x480-16bpp
# IAL engine
ial_engine=console
mdev=/dev/mice
mtype=IMPS2
[fbcon]
defaultmode=800x480-16bpp
[qvfb]
defaultmode=800x480-16bpp
display=0
gal_engine:指定使用的图形引擎
defaultmode:指定图形引擎的显示模式,格式为:宽 x高-显示位数(bpp)
ial_engine:指定使用的输入引擎
mdev:指定鼠标设备文件
mtype:指定鼠标协议类型
其中ial_engine输入引擎中mdev的设备文件目录路径可通过在超级终端运行:#ls /dev 来具体查看。
2、建立超级终端
1)pc机与开发板串口相连
2)开始-附件-通信-超级终端(波特率115200,数据位8,奇偶校验:无,停止位1,数据控制流:无)
3.NFS服务配置
1)、#setup,选择system services 将nfs选中
点ok退出选择Firewall configuration 进入防火墙设置
将enable前的*号去掉
2)、将pc机与开发板的网线相连
执行#ifconfig 查看pc机 ip地址,或是修改pc机的ip地址
#ifconfig eth1 192.168.1.10
在超级终端同样执行:#ifconfig查看开发板的IP地址,实验中查得为192.168.1.6,然后执行#ping 192.168.1.10 若能ping得同,说明网线正常连接
#vim /etc/profile,修改/etc/profile中内容如下:
#service nfs reatart 启动nfs服务,启动成功会有如下图所示:
3)在超级终端运行:
#mount –o nolock,rsize=1024,wsize=1024 192.168.1.10:/ /mnt
完成pc机根目录下的内容挂载至开发板/mnt目录下。
#cd /mnt
#ls
若能看到pc机的根目录内容,说明挂载成功。
4、移植
1)将/opt/minigui/temp/etc下的Mingui.cfg文件拷到开发板/etc目录下。2)将/opt/minigui/temp /lib下的所有文件拷贝到开发板/usr/lib目录下
3)将pc机/opt/minigui/temp/usr/local/lib中所有内容拷贝到开发板的/usr/local/lib下
12、把/opt/minigui/mg-samples-1.6.10/src中任意可执行文件和资源文件拷贝到开发板的/usr/minigui下面,没有这个目录自己建一个,最后运行科执行程序,观察开发板上的lcd显示情况,若能出现相应串口,则证明移植成功。
MiniGUI是一个图形用户界面支持的系统,通常的GUI编程概念均适用于MiniGUI编程,如窗口和事件驱动编程等。
Com.c的开始所包括的四个头文件分别是:
<minigui/common.h> <minigui/minigui.h> <minigui/gdi.h> <minigui/window.h>
他们是所有的MiniGUI应用程序都必须包括的头文件。
一个C程序的入口点为main函数,而一个MiniGUI程序的入口点为
MiniGUIMain,该函数原型如下:
int MiniGUIMain (int argc, const char* argv[])
main函数已经在MiniGUI的函数库中定义了,该函数在进行一些MiniGUI的出始化工作之后调用MiniGUIMain函数。
在函数DialogBoxIndirectParam (&DlgMyCom, HWND_DESKTOP, DialogBoxProc2, 0L);和函数static int DialogBoxProc2 (HWND hDlg1, int message, WPARAM wParam, LPARAM lParam)的MSG_INITDIALOG进行消息的循环。
其中: 1、hwnd 消息发往的窗口的句柄。
2、message 消息标识符。
3、wParam 一个32位的消息参数,其含义是根据消息的不同而不同。
4、IParam 一个32位的消息参数,去含义是取决于消息的类型。
窗口过程函数是MiniGUI程序的主体部分,应用程序实际所做的工作大部分都发生在窗口的过程函数中,以为GUI程序的主要任务是接收和处理窗口收的各种消息。
用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个MSG_CLOSE消息。
编写自己的Makefile文件
LFLAGS+=-Llib/-lpthread -lminigui -lm -lpng -lpthread –ljpeg//库的路径
com: com.o
cc $(LFLAGS) -o com com.o
com.o: com.c
cc -c com.c
clean:
rm *.o com
把编好的Makefile文件和C程序放到一起。
$make
$./ com
就可以运行程序了。
在MiniGUI中,对话框是一类特殊的主窗口,这中主窗口只关注与用户的交互—向用户提供输出消息,但更多的是用于用户输入。对话框可以理解为子类化之后的主窗口。它针对对话框的特殊性进行了特殊设计。
/***************对话框定义****************************************/
static DLGTEMPLATE DlgMyCom =
{
WS_BORDER | WS_CAPTION,
WS_EX_NONE,
0, 0, 800, 480,
"MyCom",
0, 0,
28, NULL,
0
};这个函数就是对话框的一个基本定义了。其中28是包含的控件数,如果包含的控件没有填入正确的个数,那么Qt不会正常显示。
static int DialogBoxProc2 (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)
{
int i;
switch (message) {
case MSG_INITDIALOG:
printf("init dialog\n");
{
for (i = IDC_BUTTON_SEND; i <= IDC_BUTTON_9; i++)
SetNotificationCallback (GetDlgItem (hDlg, i), my_notif_proc);
}
/*端口选择*/
SendDlgItemMessage(hDlg, IDC_BOX_PORT, CB_ADDSTRING, 0, (LPARAM)"串口0");
SendDlgItemMessage(hDlg, IDC_BOX_PORT, CB_ADDSTRING, 0, (LPARAM)"串口1");
/*波特率设置*/
SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "115200");
SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "57600");
SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "38400");
SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "19200");
SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "9600");
SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "4800");
SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "2400");
SendDlgItemMessage(hDlg, IDC_BOX_BAUDRATE, CB_ADDSTRING, 0, (LPARAM) "300");
/*奇偶校验位*/
SendDlgItemMessage(hDlg, IDC_BOX_PARITYBIT, CB_ADDSTRING, 0, (LPARAM)"None");
SendDlgItemMessage(hDlg, IDC_BOX_PARITYBIT, CB_ADDSTRING, 0, (LPARAM)"Odd");
SendDlgItemMessage(hDlg, IDC_BOX_PARITYBIT, CB_ADDSTRING, 0, (LPARAM)"Even");
SendDlgItemMessage(hDlg, IDC_BOX_PARITYBIT, CB_ADDSTRING, 0, (LPARAM)"Space");
/* 加入数据位 */
SendDlgItemMessage(hDlg, IDC_BOX_DATABIT, CB_ADDSTRING, 0, (LPARAM)"8");
SendDlgItemMessage(hDlg, IDC_BOX_DATABIT, CB_ADDSTRING, 0, (LPARAM)"7");
/* 加入停止位 */
SendDlgItemMessage(hDlg, IDC_BOX_STOPBIT, CB_ADDSTRING, 0, (LPARAM)"0");
SendDlgItemMessage(hDlg, IDC_BOX_STOPBIT, CB_ADDSTRING, 0,(LPARAM) "1");
return 1;
case MSG_COMMAND:
switch (wParam) {
case IDOK:
break;
case IDCANCEL: //窗口关闭消息时,销毁对话框,控件
EndDialog (hDlg, wParam); //退出对话框
break;
}
break;
};
return DefaultDialogProc (hDlg, message, wParam, lParam);//对话框缺省消息返回。
}
在DialogBoxProc2中,需要定义对话框模板、对话框的托管主窗口句柄、对话框回调函数地址,以及要传递到对话框过程的参数值。EndDialog用来结束对话框过程。DestroyAllControls用来销毁对话框中的所有子控件。
较为复杂的GUI系统中,都带有预定义的控件集合,他们是人机交互的主要元素。而此次实验用到的控件分别是静态框、按钮、多行编辑框、旋钮组合和框。
他们的定义分别如下:
static CTRLDATA CtrlMyTaste[] =
{
/*****************定义端口选择的复选框***************************************/
{
"static",
WS_VISIBLE | SS_LEFT | WS_GROUP,
16, 60, 100, 80,
IDC_PROMPT_PORT,
"串口选择",
0
},
{
"combobox",
WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,
100, 60, 100, 30,
IDC_BOX_PORT,
"串口0",
60
},
/*****************定义波特率设置的复选框***************************************/
{
"static",
WS_VISIBLE | SS_LEFT | WS_GROUP,
16, 90, 100, 110,
IDC_PROMPT_BAUDRATE,
"波特率设置",
0
},
{
"combobox",
WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,
100, 90, 100, 30,
IDC_BOX_BAUDRATE,
"115200",
60
},
/**************定义数据位的复选框********************************/
{
"static",
WS_VISIBLE | SS_LEFT | WS_GROUP,
16, 120, 100, 30,
IDC_PROMPT_DATABIT,
"数据位",
0
},
{
"combobox",
WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,
100, 120, 100, 30,
IDC_BOX_DATABIT,
"8",
60
},
/**************定义停止位的复选框********************************/
{
"static",
WS_VISIBLE | SS_LEFT | WS_GROUP,
16, 150, 100, 30,
IDC_PROMPT_STOPBIT,
"停止位",
0
},
{
"combobox",
WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,
100, 150, 100, 30,
IDC_BOX_STOPBIT,
"1",
40
},
/**************定义奇偶校验位的复选框********************************/
{
"static",
WS_VISIBLE | SS_LEFT | WS_GROUP,
16, 180, 100, 30,
IDC_PROMPT_PARITYBIT,
"奇偶校验位",
0
},
{
"combobox",
WS_VISIBLE | CBS_DROPDOWNLIST | CBS_NOTIFY,
100, 180, 100, 30,
IDC_BOX_PARITYBIT,
"N",
60
},
/**************************定义打开、关闭串口按钮*****************************/
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
16, 210, 80, 30,
IDC_BUTTON_OPEN,
"打开串口",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
120, 210, 80, 30,
IDC_BUTTON_CLOSE,
"关闭串口",
0
},
/***********************定义信息显示模块**********2***********************/
{
"static",
WS_VISIBLE | SS_LEFT | WS_GROUP,
16, 30, 150, 20,
IDC_PROMPT_MESSAGE,
"等待.....................",
0
},
/**************************定义发送接收按钮*****************************/
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
146, 270, 50, 30,
IDC_BUTTON_SEND,
"发送",
0
},
/***********************定义数据显示模块***********************************/
{
"static",
WS_VISIBLE,
280, 30, 200, 370,
IDC_STATIC,
"接收数据",
0
},
{
CTRL_MLEDIT,
WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_BASELINE | ES_AUTOWRAP,
280, 50, 180,350,
IDC_RECIEVE_CHARS,
"",
0
},
{
"static",
WS_VISIBLE,
16, 280, 200, 120,
IDC_STATIC,
"发送数据",
0
},
{
CTRL_MLEDIT,
WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_BASELINE | ES_AUTOWRAP,
16, 300, 180,100,
IDC_SEND_CHARS,
"",
0
},
/***********************定义键盘***********************************/
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
530, 280, 30, 30,
IDC_BUTTON_0,
"0",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
500, 310, 30, 30,
IDC_BUTTON_1,
"1",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
530, 310, 30, 30,
IDC_BUTTON_2,
"2",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
560, 310, 30, 30,
IDC_BUTTON_3,
"3",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
500, 340, 30, 30,
IDC_BUTTON_4,
"4",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
530, 340, 30, 30,
IDC_BUTTON_5,
"5",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
560, 340, 30, 30,
IDC_BUTTON_6,
"6",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
500, 370, 30, 30,
IDC_BUTTON_7,
"7",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
530, 370, 30, 30,
IDC_BUTTON_8,
"8",
0
},
{
"button",
WS_VISIBLE | BS_DEFPUSHBUTTON | WS_TABSTOP | WS_GROUP,
560, 370, 30, 30,
IDC_BUTTON_9,
"9",
0
},
};
在上面的定义中,我们可以通过坐标来改变他们的位置,使控件能摆放到合适的位置上去。其中,BUTTON控件有3中风格,我采用了普通按钮和单选按钮的风格。
其中在Qt上进行文字打印时,只需要加以个静态框定义。通过SetWindowText
()函数来实现,文本的打印。
把编写好的com.c文件进行make生成可执行文件com.然后运行com文件。
在 Linux 下串口文件是位于 /dev 下的。串口一 为 /dev/ttyS0,串口二 为 /dev/ttyS1。打开串口是通过使用标准的文件打开函数操作:
/*****************打开设备函数**************************************/
int OpenDevice(char *Dev)
{
int fd = open( Dev, O_RDWR ); //打开你选择的端口
if (-1 == fd)
{
perror("Can't Open Serial Port"); //设备打开失败
return -1;
}
else
{
printf("Open Serial Port:%s\n",Dev);
return fd;
}
}
最基本的设置串口包括波特率设置,效验位和停止位设置。
/*****************设置波特率**************************************/
int set_speed(int fd, int speed)
{
int i;
int status;
struct termios options;
bzero(&options, sizeof(options));
tcgetattr(fd,&options); // 得到当前串口的参数
for (i = 0; i < sizeof(speed_arr)/sizeof(int); i++)
{
if (speed == name_arr[i])
{
tcflush(fd, TCIOFLUSH);
cfsetispeed(&options, speed_arr[i]); //设置输入波特率
cfsetospeed(&options, speed_arr[i]); //设置输出波特率
status = tcsetattr(fd, TCSANOW, &options);
printf("status=%d\n",status);
if (status != 0)
{
perror("tcsetattr fd");
return(-1);
}
}
options.c_cflag |= (CLOCAL | CREAD); // 使能接收并使能本地状态
tcflush(fd, TCIOFLUSH);
}
return 0;
}
/*****************设置奇偶检验**************************************/
int set_Parity(int fd, char databits, char stopbits, char parity)
{
struct termios options;
if(tcgetattr(fd,&options)!=0){
perror("Setup Serial Port");
return -1;
}
options.c_cflag &= ~CSIZE;
//--------------------------这里要设置数据位------------------------------------------------------
switch (databits)
{
case '7':
options.c_cflag |= CS7;
break;
case '8':
options.c_cflag |= CS8;
break;
default:
fprintf(stderr,"Unsupported data size\n");
return -1;
}
//--------------------------这里要设置停止位------------------------------------------------------
switch (stopbits)
{
case '1':
options.c_cflag &= ~CSTOPB;
break;
case '2':
options.c_cflag |= CSTOPB;
break;
default:
fprintf(stderr,"Unsupported stop bits\n");
return -1;
}
//--------------------------这里要设置奇偶检验位------------------------------------------------------
switch (parity)
{
case 'n':
case 'N': /* no parity*/
options.c_cflag &= ~PARENB; // Clear parity enable
options.c_iflag &= ~INPCK; // Disnable input parity checking
break;
case 'o':
case 'O':
options.c_cflag |= (PARODD | PARENB); // ......
options.c_iflag |= INPCK; // Enable input parity checking
break;
case 'e':
case 'E':
options.c_cflag |= PARENB; // Enable parity
options.c_cflag &= ~PARODD; // ......
options.c_iflag |= INPCK; // Enable input parity checking
break;
case 'S':
case 's': /*as no parity*/
options.c_cflag &= ~PARENB;
options.c_cflag &= ~CSTOPB;
break;
default:
fprintf(stderr,"Unsupported parity\n");
return -1;
}
if (parity != 'n')options.c_iflag |= INPCK;
options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG); // 原始数据输入,非正规模式
options.c_oflag &= ~(OPOST);
/*设置等待时间和最小接收字符********************************/
options.c_cc[VTIME] = 100; // 20 seconds
options.c_cc[VMIN] = 0;
tcflush(fd,TCIFLUSH); // 处理未接收的字符
tcsetattr(fd,TCSANOW,&options); // 激活新配置
if(tcsetattr(fd,TCSANOW,&options)!=0){
perror("Setup Serial Port");
return -1;
}
//printf("初始化..........\n");
return 0;
}
/*用于定义动态显示,其中id为各个控件的id号,nc为控件的状态如:按下,选中等,控件id要与对应显示位置对应***/
static void my_notif_proc (HWND hwnd1, int id, int nc, DWORD add_data)
{
char READ_BAUDRATE[8];
char speed[8][8]={"115200","57600", "38400", "19200", "9600", "4800", "2400", "300"};
int name_arr[8] = {115200, 57600, 38400, 19200, 9600, 4800, 2400, 300};
char READ_PORT[8];
char PORT[2][8]={"串口0","串口1"};
char dev[2][12]={"/dev/tq2440_serial0","/dev/tq2440_serial1"};
char READ_DATABIT[8];
char DATABIT[2][8]={"8","7"};
char DATALEN[2]={8,7};
char databits;
char READ_STOPBIT[8];
char STOPBIT[2][8]={"1","2"};
char STOPLEN[2]={1,2};
char stopbits;
char READ_PARITY[8];
char PARITYBIT[4][8]={"None","Odd","Even","Space"};
char PARITYSTYLE[4]={'N','O','E','S'};
char parity;
int i,j,nwrite;
char str[1024];
pthread_t thread_id;
hwnd=hwnd1;
switch (id)
{
case IDC_BUTTON_OPEN:
/*选择端口*/
GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_BOX_PORT),READ_PORT,sizeof(READ_PORT));
for(i = 0; i < 2; i++)
for(j =0; PORT[i][j]==READ_PORT[j] && j<6;j++)
{
if(j == 5)
{
//fd = OpenDevice(dev[i]);
fd = OpenDevice("/dev/tq2440_serial0");
}
}
/*设置波特率*/
GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_BOX_BAUDRATE),READ_BAUDRATE,sizeof(READ_BAUDRATE));
for(i = 0; i < 8; i++)
for(j =0; speed[i][j]==READ_BAUDRATE[j] && j<8;j++)
{
if(j==2)
{
set_speed(fd,name_arr[i]);
//printf("BAUDRATE=%s\n",READ_BAUDRATE);
}
}
/*设置数据位、停止位、奇偶检验*/
GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_PROMPT_DATABIT),READ_DATABIT,sizeof(READ_DATABIT));
for(i = 0; i < 8; i++)
for(j =0; DATABIT[i][j]==READ_DATABIT[j] && j<8;j++)
{
if(j==1)
{
databits=DATALEN[i];
//printf("DATABIT=%c\n",databits);
}
}
GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_PROMPT_STOPBIT),READ_STOPBIT,sizeof(READ_STOPBIT));
for(i = 0; i < 8; i++)
for(j =0; STOPBIT[i][j]==READ_STOPBIT[j] && j<8;j++)
{
if(j==1)
{
stopbits=STOPLEN[i];
//printf("STOPBIT=%c\n",stopbits);
}
}
GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_PROMPT_PARITYBIT),READ_PARITY,sizeof(READ_PARITY));
for(i = 0; i < 8; i++)
for(j =0; PARITYBIT[i][j]==READ_PARITY[j] && j<8;j++)
{
if(j==2)
{
parity=PARITYSTYLE[i];
//printf("PARITYBIT=%c\n",parity);
}
}
set_Parity(fd, databits, stopbits, parity);
if(pthread_create(&thread_id, NULL, (void*)ReadThread, NULL) !=0)//创建读串口线程
printf("ReadThread_create is failed!\n");
//pthread_join(thread_id, NULL);
break;
case IDC_BUTTON_CLOSE:
close(fd);
printf("Close Serial Port\n");
break;
case IDC_BUTTON_SEND:
GetWindowText (GetDlgItem (GetParent (hwnd1), IDC_SEND_CHARS),str,1024);
//printf("%s\n",str);
nwrite=write(fd, str, strlen(str));
if(nwrite==-1)
{
printf("Write Serial Port Failed\n");
close(fd);
}
else ;
//printf("String length=%d ,Writed length=%d\n",strlen(str),nwrite);
break;
case IDC_BUTTON_0:ButtonDown(IDC_BUTTON_0);break;
case IDC_BUTTON_1:ButtonDown(IDC_BUTTON_1);break;
case IDC_BUTTON_2:ButtonDown(IDC_BUTTON_2);break;
case IDC_BUTTON_3:ButtonDown(IDC_BUTTON_3);break;
case IDC_BUTTON_4:ButtonDown(IDC_BUTTON_4);break;
case IDC_BUTTON_5:ButtonDown(IDC_BUTTON_5);break;
case IDC_BUTTON_6:ButtonDown(IDC_BUTTON_6);break;
case IDC_BUTTON_7:ButtonDown(IDC_BUTTON_7);break;
case IDC_BUTTON_8:ButtonDown(IDC_BUTTON_8);break;
case IDC_BUTTON_9:ButtonDown(IDC_BUTTON_9);break;
default: break;
}
}
/*读串口线程*/
void ReadThread(void* arg)
{
int nread;
char readdata[1024];
char str[1024];
while(1)
{
sleep(1);
//printf("\nnow it begain to read words.\n");
memset(&readdata,0,1024);
nread = read(fd,readdata,1024);
if(nread==-1)
{
printf("Read Serial Port Failed\n");
}
//printf("readdata:%s\n",str);
GetWindowText (GetDlgItem (GetParent (hwnd), IDC_RECIEVE_CHARS),str,strlen(str));
memcpy(&str[strlen(str)],&readdata,strlen(readdata));
//printf("readdata:%s\n",str);
SetWindowText (GetDlgItem (GetParent (hwnd), IDC_RECIEVE_CHARS),str);
//SetWindowText (GetDlgItem (GetParent (hwnd), IDC_RECIEVE_CHARS),readdata);
}}
void ButtonDown(int id)
{
char button_data;
int length;
char str[1024];
button_data=id-58;
GetWindowText (GetDlgItem (GetParent (hwnd), IDC_SEND_CHARS),str,strlen(str));
length=strlen(str);
str[length]=button_data;
str[length+1]='\0';
SetWindowText (GetDlgItem (GetParent (hwnd), IDC_SEND_CHARS),str);
}
由于要验证收发程序是否正确,通过一根交叉线,把电脑的COM端口和开发板的COM口连接好,电脑打开串口调试助手,开发板运行自己的程序,设置好端口选择对应的波特率和奇偶校验位,停止位等。
通过这次的课程设计进一步巩固嵌入式系统的基本知识,基本掌握嵌入式应用系统的基本结构,嵌入式系统开发环境建立和使用,掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法,学会了查阅有关专业资料及设计手册实现简单的MiniGUI界面编程。
开发过程中遇到许多问题,主要原因是对于基本知识掌握的不够牢固,所以一旦遇到问题就会摸不着头脑,不知道从何下手。但通过上网查资料和向老师和同学的请教。终于对整个设计有了进一步的理解也更深层次的了解了整个的设计思路,更通过学习掌握了Minigui的设计方法。
在最后的综合调试中,编写触摸屏的输入引擎,没有成功,主要原因还是对于嵌入式系统的驱动了解不够深入,对于输入引擎这个概念也还不是非常理解。
总之,虽然这次课程设计,使我进步不少,但同时也看到了自己还有非常大的差距,所以更需加倍努力。
1.《嵌入式系统接口设计与Linux驱动程序开发》
2.《ARM9嵌入式LINUX系统构建与应用》
3.《Minigui用户手册》
4.《MiniGUI编程指南》
5.Linux应用程序编程
6.Linux驱动编程
7.《minigui技术白皮书》
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
嵌入式系统课程设计报告基于ARM的楼宇对讲系统设计摘要采用模块化设计方法设计出一款基于ARM微控制芯片和Linux操作系统的楼宇对…
XXXX课程设计报告课程名称嵌入式系统设计题目专业班级学生姓名学生学号指导老师二一三年一月八日目录1概述111背景112设计目标2…
7嵌入式系统课程设计必做部分学院电控学院专业通信工程设计名称IIC同步串行通讯1设计的目的1掌握S3C44B0IIC控制器的编程方…
嵌入式系统课程设计报告设计任务一十字路口交通灯控制一设计目的1了解基于ARM7核的LPC2106的管脚功能和特点掌握IO控制寄存器…
福建工程学院嵌入式系统课程设计报告书题目基于S3C2440设备驱动及其界面设计班级姓名学号指导老师陈靖张平均李光炀2目录一设计课题…
湖南科技大学计算机科学与工程学院嵌入式系统设计与开发实验报告书题目远程温光数据监测系统班级12级计算机一班姓名刘政材学号120xx…
课程设计报告基于ARM的嵌入式电子点菜系统班学姓级号名09061320xx061316叶尔多斯海拉提20xx年10月1题目基于AR…
中南大学嵌入式系统实验设计报告指导老师吴志虎李志民设计者连金涛专业班级测控0801班学号0909081012时间20xx年6月1实…
XXXX课程设计报告课程名称嵌入式系统设计题目专业班级学生姓名学生学号指导老师二一三年一月八日目录1概述111背景112设计目标2…
本学期为期一周的嵌入式课程设计在不知不觉中结束了,虽说这次课程设计时间不是很长,但是感觉自己收获颇丰,不仅学习到了一些新知识,回顾…