通信0801嵌入式课程设计报告new_第1页
通信0801嵌入式课程设计报告new_第2页
通信0801嵌入式课程设计报告new_第3页
通信0801嵌入式课程设计报告new_第4页
通信0801嵌入式课程设计报告new_第5页
已阅读5页,还剩19页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、目录1设计目的:12设计任务及要求:13设计思路24设计实现24.1MiniGui运行环境设置24.2、Minigui交叉编译环境的建立34.3、MiniGui在S3C2440上的移植55界面编程65.1基本的编程概念65.2头文件75.3程序入口点75.4进入消息循环75.5窗口过程函数75.6程序的推出75.7编译、链接和运行75.8对话框编程基础85.9对话框的回调函数85.10控件编程基础105.11可以看到运行的界面如下图所示:165.12打开串口165.13设置串口175.14串口读写195.15键盘处理程序236调试237设计总结248设计参考文献241设计目的:1进一步巩固嵌入

2、式系统的基本知识;2掌握嵌入式应用系统的基本结构;3掌握嵌入式系统开发环境建立和使用;4掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;5学会查阅有关专业资料及设计手册;6. MiniGUI界面编程。2设计任务及要求:1掌握嵌入式系统开发环境建立和使用;2掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;3、MiniGUI在PC上的安装、移植4、Linux串口编程与MiniGUI界面编程5、串口传输数据(位图)并在TQ2440的LCD上显示6编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;7绘制有关图纸.3设计思路基础知识的回顾复习,包括:虚拟机的安

3、装,Fedora10的基本使用,嵌入式系统开发环境建立和使用,嵌入式系统基本驱动、应用程序的设计调试和编译移植方法.。MiniGUI在pc机上的安装。(可参照minigui用户手册)参照Minigui技术白皮书和Minigui编程指南学习基于 MiniGUI的应用界面编程方法。运行minigui演示程序,设计界面,开始界面编程。交叉编译环境的建立,及MiniGui在TQ2440上的移植开始综合调试4设计实现4.1MiniGui运行环境设置1、安装qvfb进入到/opt/minigui目录下:cd /opt/minigui解压:#tar zxvf /mnt/hgfs/linux/ qvfb-1.

4、1.tar.gz#cd / qvfb-1.1#./configure /生成Makefile文件#make /编译#make install /安装测试qvfb#qvfb &2、安装运行MiniGui在/opt下新建目录/opt/minigui1)、先将下载的源码包,包括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

5、.10.tar.gz安装:#cd /minigui-res-1.6.10#make install3)、配置和编译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/lib3)编译并运行MiniGui的演示程序解压:#tar zxvf /mnt/hg

6、fs/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环境成功建立。 4.2、Minigui交叉编译环境的建立1、安装交叉编译器arm-linux-gcc2、在/opt/minigui下新建目录temp #cd /opt/minigui#mkdir temp3、建立交叉编译的lib修改l

7、ibminigui -1.6.10下的configure文件,在文件头添加CC= arm-linux-gccCPP= arm-linux-cppLD= arm-linux-ldAR= arm-linux-arRANLIB= arm-linux-ranlibSTRIP= arm-linux-strip将libcross.sh拷到libminigui -1.6.10文件夹中libcross.sh文件内容如下:#/bin/sh./configure -prefix=/opt/minigui/temp/ -host=arm-linux -target=arm-linuxmakemake install

8、运行脚本#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/shmake install运行脚本#sh rescross.sh可以查看/opt/minigui/temp下面生成usr目录5、修改mg-samples-1.6.10下的con

9、figure文件,在文件头添加CC= arm-linux-gccCPP= arm-linux-cppLD= arm-linux-ldAR= arm-linux-arRANLIB= arm-linux-ranlibSTRIP= 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

10、 CPPFLAGS=-I/opt/minigui/temp/include CFLAGS=-I/opt/minigui/temp/includeMake运行脚本#sh samplecorss.sh可以查看/opt/minigui/ mg-samples-1.6.10/src下生成了可执行文件4.3、MiniGui在S3C2440上的移植1、修改/opt/minigui/temp下的etc下的MINIGUI的配置文件system #GAL engine and default options gal_engine=fbcon defaultmode=800x480-16bpp # IAL eng

11、ine ial_engine=console mdev=/dev/mice mtype=IMPS2 fbcon defaultmode=800x480-16bpp qvfb defaultmode=800x480-16bpp display=0gal_engine:指定使用的图形引擎 defaultmode:指定图形引擎的显示模式,格式为:宽 x高-显示位数(bpp) ial_engine:指定使用的输入引擎 mdev:指定鼠标设备文件 mtype:指定鼠标协议类型 其中ial_engine输入引擎中mdev的设备文件目录路径可通过在超级终端运行:#ls /dev 来具体查看。2、建立超级终端

12、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.16

13、8.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/

14、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显示情况,若能出现相应串口,则证明移植成功。5界面编程5.1基本的编程概念MiniGUI是一个图形用户界面支持的系统,通常的GUI编程概念均适用于MiniGUI编程,如窗口和事件驱动编程等。5.2头

15、文件Com.c的开始所包括的四个头文件分别是: 他们是所有的MiniGUI应用程序都必须包括的头文件。5.3程序入口点一个C程序的入口点为main函数,而一个MiniGUI程序的入口点为MiniGUIMain,该函数原型如下:int MiniGUIMain (int argc, const char* argv)main函数已经在MiniGUI的函数库中定义了,该函数在进行一些MiniGUI的出始化工作之后调用MiniGUIMain函数。5.4进入消息循环在函数DialogBoxIndirectParam (&DlgMyCom, HWND_DESKTOP, DialogBoxProc2, 0L

16、);和函数static int DialogBoxProc2 (HWND hDlg1, int message, WPARAM wParam, LPARAM lParam)的MSG_INITDIALOG进行消息的循环。其中: 1、hwnd 消息发往的窗口的句柄。 2、message 消息标识符。 3、wParam 一个32位的消息参数,其含义是根据消息的不同而不同。 4、IParam 一个32位的消息参数,去含义是取决于消息的类型。5.5窗口过程函数窗口过程函数是MiniGUI程序的主体部分,应用程序实际所做的工作大部分都发生在窗口的过程函数中,以为GUI程序的主要任务是接收和处理窗口收的各种

17、消息。5.6程序的推出用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个MSG_CLOSE消息。5.7编译、链接和运行编写自己的Makefile文件LFLAGS+=-Llib/-lpthread -lminigui -lm -lpng -lpthread ljpeg/库的路径com: com.occ $(LFLAGS) -o com com.ocom.o: com.ccc -c com.cclean:rm *.o com把编好的Makefile文件和C程序放到一起。$make$./ com就可以运行程序了。5.8对话框编程基础在MiniGUI中,对话框是一类特殊的主窗口,这中主窗口只关注与用

18、户的交互向用户提供输出消息,但更多的是用于用户输入。对话框可以理解为子类化之后的主窗口。它针对对话框的特殊性进行了特殊设计。/*对话框定义*/static DLGTEMPLATE DlgMyCom = WS_BORDER | WS_CAPTION, WS_EX_NONE, 0, 0, 800, 480, MyCom, 0, 0, 28, NULL, 0 ;这个函数就是对话框的一个基本定义了。其中28是包含的控件数,如果包含的控件没有填入正确的个数,那么Qt不会正常显示。5.9对话框的回调函数static int DialogBoxProc2 (HWND hDlg, int message, W

19、PARAM wParam, LPARAM lParam) int i; switch (message) case MSG_INITDIALOG: printf(init dialogn); 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); SendDlgItemMes

20、sage(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); Se

21、ndDlgItemMessage(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

22、); 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,

23、(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, C

24、B_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);/对

25、话框缺省消息返回。在DialogBoxProc2中,需要定义对话框模板、对话框的托管主窗口句柄、对话框回调函数地址,以及要传递到对话框过程的参数值。EndDialog用来结束对话框过程。DestroyAllControls用来销毁对话框中的所有子控件。5.10控件编程基础较为复杂的GUI系统中,都带有预定义的控件集合,他们是人机交互的主要元素。而此次实验用到的控件分别是静态框、按钮、多行编辑框、旋钮组合和框。他们的定义分别如下:静态框普通按钮单选按钮多行编辑框旋钮组合和框static CTRLDATA CtrlMyTaste = /*定义端口选择的复选框*/ static, WS_VISIBL

26、E | 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_DRO

27、PDOWNLIST | 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_VISI

28、BLE | 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 |

29、 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,

30、关闭串口, 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, 接收数据,

31、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, ,

32、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

33、_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, 3

34、0, 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,

35、 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文件。

36、5.11可以看到运行的界面如下图所示:5.12打开串口在 Linux 下串口文件是位于 /dev 下的。串口一 为 /dev/ttyS0,串口二 为 /dev/ttyS1。打开串口是通过使用标准的文件打开函数操作:/*打开设备函数*/int OpenDevice(char *Dev) int fd = open( Dev, O_RDWR ); /打开你选择的端口 if (-1 = fd) perror(Cant Open Serial Port); /设备打开失败 return -1; else printf(Open Serial Port:%sn,Dev); return fd; 5.13

37、设置串口最基本的设置串口包括波特率设置,效验位和停止位设置。/*设置波特率*/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_arri) tcflush(fd, TCIOFLUSH); cfsetispeed(&options,

38、 speed_arri);/设置输入波特率 cfsetospeed(&options, speed_arri);/设置输出波特率 status = tcsetattr(fd, TCSANOW, &options); printf(status=%dn,status); if (status != 0) perror(tcsetattr fd); return(-1); options.c_cflag |= (CLOCAL | CREAD); / 使能接收并使能本地状态 tcflush(fd, TCIOFLUSH); return 0; /*设置奇偶检验*/ int set_Parity(int

39、 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,Uns

40、upported data sizen); return -1; /-这里要设置停止位- switch (stopbits) case 1: options.c_cflag &= CSTOPB; break; case 2: options.c_cflag |= CSTOPB; break; default: fprintf(stderr,Unsupported stop bitsn); return -1; /-这里要设置奇偶检验位- switch (parity) case n: case N: /* no parity*/ options.c_cflag &= PARENB; / Cle

41、ar 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; / . optio

42、ns.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 parityn); return -1; if (parity != n)options.c_iflag |= INPCK; options.c_lflag &= (ICANON | ECHO | ECHOE | ISIG); / 原始数据输入,非正规模式 options.c

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论