《课程设计(论文)基于S3C2440的串口传输及其界面设计.doc》由会员分享,可在线阅读,更多相关《课程设计(论文)基于S3C2440的串口传输及其界面设计.doc(26页珍藏版)》请在三一办公上搜索。
1、基于S3C2440的串口传输及其界面设计 专业: 电子信息工程 班级: 电子0801 姓名: 学号: 指导老师: 设计时间:2011/2012(1)学期第1、2周目录一、 绪论31. 设计目的:32. 设计任务及要求:3二、 MiniGUI在PC上的安装与运行31. 安装资源文件:32. 安装库文件:33. 安装qvfb:44. 编译演示文件:45. 配置参数:46. 运行演示文件:5三、 移植MiniGUI到开发板61. 设置超级终端:62. 配置交叉编译环境:63. 新建移植目录:74. 编译libminigui75. 编译资源文件96. 修改MiniGUI.cfg文件97. 编译例子程序
2、10四、 MiniGUI串口传输界面设计111. MiniGUI设计知识介绍112. 主要部分解析:133. 运行界面:14五、 设计总结14六、 参考文献15七、 附录:15串口界面源代码:15一、 绪论1. 设计目的:1进一步巩固嵌入式系统的基本知识;2掌握嵌入式应用系统的基本结构;3掌握嵌入式系统开发环境建立和使用;4掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;5学会查阅有关专业资料及设计手册;6. MiniGUI界面编程。2. 设计任务及要求:1掌握嵌入式系统开发环境建立和使用;2掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;3、MiniGUI在PC上的安装、
3、移植;4、Linux串口编程与MiniGUI界面编程;5、串口传输数据(位图)并在TQ2440的LCD上显示;6编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;7绘制有关图纸。二、 MiniGUI在PC上的安装与运行1. 安装资源文件:1) 解压:# tar zxf minigui-res-1.6.10.tar.gz C /opt/minigui2) 安装:# make install2. 安装库文件:1) 解压:# tar zxf libminigui-1.6.10.tar.gz C /opt/minigui2) 编译:# ./configure # make3)
4、安装:# make install3. 安装qvfb:1) 解压:# tar zxf qvfb-1.1.tar.gz C /opt/minigui2) 编译和安装:# ./configure # make # make install4. 编译演示文件:1) 解压:# tar zxf mg-samples-1.6.10.tar.gz C /opt/minigui2) 编译:# ./configure # make # make install5. 配置参数:1) # gedit /usr/local/etc/MiniGUI.cfg2) 输入:# gedit /etc/ld.so.conf.d/
5、minigui.conf添加一行:/usr/local/lib执行:# ldconfigldconfig命令为刷新系统共享库缓存。6. 运行演示文件:1) 打开qvfb:# /opt/minigui/qvfb-1.1/qvfb/qvfb &2) 配置qvfb:3) 打开演示文件:# cd /opt/minigui/mg-samples-1.6.10/src # ./ helloworld三、 移植MiniGUI到开发板1. 设置超级终端:打开“开始-附件-通讯-超级终端”,按照下图进行设置,然后打开开发板2. 配置交叉编译环境:1) 解压安装包:# tar xvfj EABI-4.3.3_Em
6、bedSky_20091210.tar.bz2 C /opt2) 配置:# gedit /etc/profile ,添加一行pathmunge /opt/EmbedSky/4.3.3/bin ,如图所示:再执行# source /etc/profile 使配置立即生效。3) 输入# arm-linux-gcc v 查看是否成功:3. 新建移植目录:# mkdir /minigui-arm# mkdir /minigui-arm/tmp4. 编译libminigui1) 解压:# tar zxf libminigui-1.6.10.tar.gz C /minigui-arm2) 配置:# ged
7、it configure在头文件开头指明交叉编译路径: CC= arm-linux-gcc CPP= arm-linuxcpp LD= arm-linux-ld AR= arm-linux-ar RANLIB= arm-linux-ranlib STRIP= arm-linux-strip3) 编写脚本:# gedit /libminigui-1.6.10/libsetup.sh复制以下代码: #!/bin/sh ./configure -host=arm-linux -enable-jpgsupport=no -enable-pngsupport=no -enable-gifsupport=
8、no -disable-lite -prefix=/minigui-arm/tmp -enable-smdk2410ial=yes make make install4) 执行脚本:# ./libsetup.sh编译后会在/minigui-arm/tmp下生成etc include lib 目录更新缓存: # cd /minigui-arm/tmp/lib # ldconfig5. 编译资源文件1) 解压:# tar zxvf minigui-res-1.6.10.tar.gz -C /minigui-arm2) 进入minigui-res-1.6.10目录,修改config.linux文件的
9、第11行 TOPDIR=/minigui-arm/tmp3) 编译:# make install生成的文件会保存到/minigui-arm/tmp/usr/local/lib/minigui/res 下,有以下几个目 录:bmp cursor font icon imetab6. 修改MiniGUI.cfg文件# gedit /minigui-arm/tmp/etc/MiniGUI.cfg再将MiniGUI.cfg下载到开发板 /etc 目录下,将/minigui-arm/tmp/lib目录下的文件下载到开发板/usr/lib目录下,将/minigui-arm/tmp/usr/local/li
10、b下的minigui目录下载到开发板/usr/local/lib目录下。7. 编译例子程序1) 解压:# tar zxf mg-samples-1.6.10.tar.gz -C /minigui-arm/2) 修改mg-samples-1.6.10目录下的configure文件:# gedit configure在头文件开头指明交叉编译路径: CC= arm-linux-gcc CPP= arm-linuxcpp LD= arm-linux-ld AR= arm-linux-ar RANLIB= arm-linux-ranlib STRIP= arm-linux-strip3) 编写脚本:#
11、gedit sampsetup.sh #!/bin/sh ./configure -build=i686-pc-linux-gnu -host=arm-linux -prefix=/minigui-arm/tmp/ LDFLAGS=-L/minigui-arm/tmp/lib CPPFLAGS=-I/minigui-arm/tmp/include CFLAGS=-I/minigui-arm/tmp/include make4) 拷贝可执行程序helloworld到开发板,并在超级终端运行测试程序:# ./helloworld如果开发板屏幕可以出来相应界面,则表示移植成功。四、 MiniGUI串
12、口传输界面设计1. MiniGUI设计知识介绍1) 基本的编程概念MiniGUI是一个图形用户界面支持的系统,通常的GUI编程概念均适用于MiniGUI编程,如窗口和事件驱动编程等。2) 头文件 他们是所有的MiniGUI应用程序都必须包括的头文件。Common.h 包含MiniGUI常用的宏以及数据类型定义。Minigui.h 包含了全局的和通用的接口函数以及某些杂项函数的定义。Gdi.h 包含MiniGUI绘图函数的接口定义。Window.h 包含了窗口有关的宏,数据类型,数据结构定义以及函数接口声明。Control.h 包含预定义控件。3) 程序入口点一个C程序的入口点为main函数,而
13、一个MiniGUI程序的入口点为MiniGUIMain,该函数原型如下:int MiniGUIMain (int argc, const char* argv)4) 对话框的编程在MiniGUI中,对话框是一类特殊的主窗口,这种主窗口只关注与用户的互向用户提供输出信息,但更多的是用于用户输入。对话框可以理解为子类化的主窗类。对话框模板如下: Typedef struct Char* class_name; DWORD dwStyle; Int x,y,w,h; Int id; Const char* caption; DWORD dwAddData; DWORD dwExStyle;CTRDA
14、TA;Typedef CTRLDATA* PCTRLDATA;Typedef struct DWORD dwStyle; DWORD dwExStyle; int x,y,w,h; const char* caption; HICON hicon; HMENU hMenu; int controlnr; PCTRLDATA controls; DWORD dwAddData;DLGTEMPLATE;typedef DLGTEMPLATE * PDLGTEMPLATE; 结构CTRLDATA用来定义控件,DLGTEMPLATE用来定义对话框本身。在程序中,应该首先利用CTRLDATA定义对话框中
15、所有的控件,并利用数组表示;控件在该数组中的顺序,也就是对话框中用户按TAB键时控件的切换顺序。然后定义对话框,指定对话框中的控件数目,并指定DLGTEMPLATE结构中的controls指针指向定义控件的数组。 在定义了对话框模板数据后,需要定义对方框的回调函数,并利用DialogBoxIndirectParam(&DlgYourTaste, HWND_DESKTOP, DialogBoxProc2, 0L)函数建立对话框。DialogBoxProc2 (HWND hDlg, int message, WPARAM wParam, LPARAM lParam)的MSG_INITDIALOG进
16、行消息的循环。5) 程序退出用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个MSG_CLOSE消息。程序退出。2. 主要部分解析:1) 发送部分:发送部分采用的是按键发送的消息,然后发送写指令把数据写到串口获取发送信息:存储到BUFF中。 GetWindowText (hwnd, buff, 10);获取发送ID号:发送文本信息:case IDC_SEND:nwrite=write(fd,buff,strlen(buff);if(nwrite0) printf(Receive letters=%sn,buff); printf(nwrite=%dn,nwrite); nwrite=0; b
17、reak;2) 接收部分:接收部分采用的是创建一个新线程的办法,在新线程中接收数据,然后通过内存复制,把数据传回进程中。创建线程: if(pthread_create(&thread_id,NULL,(void*)ReadThread,NULL)!=0) printf(readthread create is failedn);线程程序: void ReadThread(void* arg) int nread; char str100; while(1) sleep(1); str99=0; nread=read(fd,str,100); if(nread0) printf(send let
18、ters nread=%dn,nread); printf(str=%sn,str); memcpy(&bufferstrlen(buffer),&str,strlen(str); 显示到文本框中:case IDC_RECEIVE:SetWindowText(GetDlgItem(GetParent(hwnd),IDC_CHARS),buffer);for (i=0;i100;i+) bufferi=0; break;3. 运行界面:五、 设计总结1. 在PC上运行测试程序时要先打开qvfb,再运行程序。2. 移植程序时要先确认是否配置了交叉编译环境。3. 开发板下载文件有以下三个方法:1)使
19、用超级终端直接发送,优点是方便快捷,缺点是传输速度慢。2)利用NFS挂载PC,优点是传输速度快,缺点是配置繁琐,测试过程中经常导致开发板死机。3)开发板挂载U盘,经测试此方法简单易用,传输速度良好,故采用此方法,挂载命令如下:# mount t vfat /dev/sda /mnt/usbsda为U盘设备号,可能为其他。4. 运行脚本时,可能会出现权限不足的提示:可以修改文件属性来解决:# chmod 777 libsetup.sh六、 参考文献刘洪涛、孙天泽;嵌入式系统技术与设计;北京:人民邮电出版社李佳.ARM系列处理器应用开发技术完全手册;北京:人民邮电出版社,2006.MINIGUI编
20、程指南2.0-4e;北京:北京飞漫软件技术有限公司MINIGUI-USER-MANUAL-V1.3-1-C;北京:北京飞漫技术有限公司MINIGUI-PROG-GUIDE-V1.3-C;北京:北京飞漫技术有限公司MINIGUI技术白皮书;北京:北京飞漫技术有限公司MINIGUI用户手册2.0-4e;北京:北京飞漫技术有限公司TQ2440 用户手册;广州:天嵌技术有限公司七、 附录:串口界面源代码:#include #include #include #include #include #include #include #include #include #include #include #
21、include #include #include #define False -1int speed_arr = B115200,B38400, B19200, B9600, B4800, B2400, B1200, B300,B38400, B19200, B9600, B4800, B2400, B1200, B300, ;int name_arr = 115200,38400, 19200, 9600, 4800, 2400, 1200, 300, 38400, 19200, 9600, 4800, 2400, 1200, 300, ;int fd=0;int nwrite=0;pth
22、read_t thread_id;char *dev =/dev/tty;unsigned char buff 200=0;unsigned char buffer100;static DLGTEMPLATE DlgBoxInputChar = WS_BORDER | WS_CAPTION, WS_EX_NONE, 15, 15, 500, 400,#ifdef _LANG_ZHCN ,#else Serial Debugging Software,#endif 0, 0,17, NULL,0;#define IDC_CHAR 100#define IDC_CHARS 110#define I
23、DC_NUM1 121#define IDC_NUM2 122#define IDC_NUM3 123#define IDC_NUM4 124#define IDC_NUM5 125#define IDC_NUM6 126#define IDC_NUM7 127#define IDC_NUM8 128#define IDC_NUM9 129#define IDC_NUM0 130#define IDC_CLEAR 131#define IDC_SEND 132#define IDC_RECEIVE 133static CTRLDATA CtrlInputChar = CTRL_STATIC,
24、WS_VISIBLE , 10, 10, 380, 18, IDC_STATIC, #ifdef _LANG_ZHCN :, #else Please input a letter:, #endif 0 , CTRL_SLEDIT, WS_VISIBLE | WS_TABSTOP | WS_BORDER | ES_CENTER, 10, 40, 80, 25, IDC_CHAR, NULL, 0 , CTRL_STATIC, WS_VISIBLE , 10, 100, 380, 18, IDC_STATIC, #ifdef _LANG_ZHCN :, #else Receive letters
25、:, #endif 0 , CTRL_MLEDIT, WS_VISIBLE | WS_BORDER | WS_VSCROLL | ES_BASELINE | ES_AUTOWRAP, 15, 150, 470, 140, IDC_CHARS, NULL, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 170, 30, 25, 25, IDC_NUM1, 1, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 205, 30, 25, 25, IDC
26、_NUM2, 2, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 240, 30, 25, 25, IDC_NUM3, 3, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 170, 65, 25, 25, IDC_NUM4, 4, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 205, 65, 25, 25, IDC_NUM5, 5, 0 , CTRL_BUTTON,
27、WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 240, 65, 25, 25, IDC_NUM6, 6, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 170, 100, 25, 25, IDC_NUM7, 7, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 205, 100, 25, 25, IDC_NUM8, 8, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE |
28、 BS_DEFPUSHBUTTON, 240, 100, 25, 25, IDC_NUM9, 9, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 275, 100, 25, 25, IDC_NUM0, 0, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 275,30, 25, 60, IDC_CLEAR, C, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 110, 3
29、20, 80, 25, IDC_SEND, SEND, 0 , CTRL_BUTTON, WS_TABSTOP | WS_VISIBLE | BS_DEFPUSHBUTTON, 220, 320, 80, 25, IDC_RECEIVE, RECEIVE, 0 ,;int OpenDev(char *Dev) fd = open(Dev, O_RDWR | O_NOCTTY | O_NDELAY); if (-1 = fd) perror(Cant Open Serial Port); printf(dakai failn); return False; else return fd; int
30、 set_speed(int fd, int speed) int i; int status; struct termios Opt; tcgetattr(fd, &Opt); for ( i= 0; i 0) printf(send letters nread=%dn,nread); printf(str=%sn,str); memcpy(&bufferstrlen(buffer),&str,strlen(str); static void my_notif_proc (HWND hwnd, int id, int nc, DWORD add_data) int i; unsigned c
31、har data10=1,2,3,4,5,6,7,8,9,0; if (id = IDC_CHAR & nc = EN_CHANGE) GetWindowText (hwnd, buff, 10); switch(id)case IDC_NUM1:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data0,0L);break;case IDC_NUM2:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data1,0L);break;case IDC_N
32、UM3:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data2,0L);break;case IDC_NUM4:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data3,0L);break;case IDC_NUM5:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data4,0L);break;case IDC_NUM6:SendMessage (GetDlgItem (G
33、etParent(hwnd),IDC_CHAR),MSG_CHAR,data5,0L);break;case IDC_NUM7:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data6,0L);break;case IDC_NUM8:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data7,0L);break;case IDC_NUM9:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data8,0L);break;case IDC_NUM0:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_CHAR,data9,0L);break;case IDC_CLEAR:SendMessage (GetDlgItem (GetParent(hwnd),IDC_CHAR),MSG_SETTEXT,NULL,);break;case IDC_SEND:nwrite=write(fd,buff,strlen(b