课程设计(论文)-基于S3C2440的串口传输及其界面设计1.doc_第1页
课程设计(论文)-基于S3C2440的串口传输及其界面设计1.doc_第2页
课程设计(论文)-基于S3C2440的串口传输及其界面设计1.doc_第3页
课程设计(论文)-基于S3C2440的串口传输及其界面设计1.doc_第4页
课程设计(论文)-基于S3C2440的串口传输及其界面设计1.doc_第5页
已阅读5页,还剩28页未读 继续免费阅读

下载本文档

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

文档简介

基于s3c2440的串口传输及其界面设计 专业: 爱心工程 班级: 0802 姓名: 学妹好 学号: 520 指导老师: 吾爱你 设计时间: 5201314 33目录一、 绪论31. 设计目的32. 设计任务及要求3二、 minigui在pc上的安装与运行31. 安装资源文件32. 安装库文件33. 安装qvfb44. 编译演示文件45. 配置参数46. 运行演示文件5三、 移植minigui到开发板61. 设置超级终端62. 配置交叉编译环境63. 新建移植目录74. 编译libminigui75. 编译资源文件96. 修改minigui.cfg文件97. 编译例子程序10四、 minigui串口传输界面设计111. minigui设计知识介绍112. 主要部分解析133. 运行界面14五、 设计总结14六、 参考文献15七、 附录15串口界面源代码151、 绪论1. 设计目的:1进一步巩固嵌入式系统的基本知识;2掌握嵌入式应用系统的基本结构;3掌握嵌入式系统开发环境建立和使用;4掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;5学会查阅有关专业资料及设计手册;6. minigui界面编程。2. 设计任务及要求:1掌握嵌入式系统开发环境建立和使用;2掌握嵌入式系统基本驱动、应用程序的设计调试和编译移植方法;3、minigui在pc上的安装、移植;4、linux串口编程与minigui界面编程;5、串口传输数据(位图)并在tq2440的lcd上显示;6编写设计说明书(方案的确定、设计环节的考虑及必要说明等)及设备的使用说明;7绘制有关图纸。2、 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) 安装:# 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/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 # ./ helloworld3、 移植minigui到开发板1. 设置超级终端:打开“开始-附件-通讯-超级终端”,按照下图进行设置,然后打开开发板2. 配置交叉编译环境:1) 解压安装包:# tar xvfj eabi-4.3.3_embedsky_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) 配置:# 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) 编写脚本:# gedit /libminigui-1.6.10/libsetup.sh复制以下代码: #!/bin/sh ./configure -host=arm-linux -enable-jpgsupport=no -enable-pngsupport=no -enable-gifsupport=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文件的第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/lib下的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) 编写脚本:# 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如果开发板屏幕可以出来相应界面,则表示移植成功。4、 minigui串口传输界面设计1. minigui设计知识介绍1) 基本的编程概念minigui是一个图形用户界面支持的系统,通常的gui编程概念均适用于minigui编程,如窗口和事件驱动编程等。2) minigui的三种运行模式minigui-threads。运行在 minigui-threads 上的程序可以在不同的线程中建立多个窗口,但所有的窗口在一个进程或者地址空间中运行。这种运行模式非常适合于大多数传统意义上的嵌入式操作系统,比如 uc/os-ii、ecos、vxworks、psos 等等。当然,在 linux 和 uclinux 上,minigui 也能以 minigui-threads 的模式运行。 minigui-processes。和 minigui-threads 相反,minigui-processes 上的每个程序是独立的进程,每个进程也可以建立多个窗口。minigui-processes 适合于具有完整 unix 特性的嵌入式操作系统,比如嵌入式 linux。 minigui-standalone。这种运行模式下,minigui 可以以独立进程的方式运行,既不需要多线程也不需要多进程的支持,这种运行模式适合功能单一的应用场合。比如在一些使用 uclinux 的嵌入式产品中,因为各种原因而缺少线程库支持,这时,就可以使用 minigui-standalone 来开发应用软件。 3) 头文件 他们是所有的minigui应用程序都必须包括的头文件。common.h 包含minigui常用的宏以及数据类型定义。minigui.h 包含了全局的和通用的接口函数以及某些杂项函数的定义。gdi.h 包含minigui绘图函数的接口定义。window.h 包含了窗口有关的宏,数据类型,数据结构定义以及函数接口声明。control.h 包含预定义控件。4) 程序入口点一个 minigui 程序的入口点为 miniguimain,该函数原型如下: int miniguimain (int argc, const char* argv);这个函数其实是标准 c 程序入口函数 main 的一个封装宏。5) 对话框的编程在minigui中,对话框是一类特殊的主窗口,这种主窗口只关注与用户的互向用户提供输出信息,但更多的是用于用户输入。对话框可以理解为子类化的主窗类。对话框模板如下: typedef struct char* class_name; dword dwstyle; int x,y,w,h; int id; const char* caption; dword dwadddata; dword dwexstyle;ctrdata;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定义对话框中所有的控件,并利用数组表示;控件在该数组中的顺序,也就是对话框中用户按tab键时控件的切换顺序。然后定义对话框,指定对话框中的控件数目,并指定dlgtemplate结构中的controls指针指向定义控件的数组。 在定义了对话框模板数据后,需要定义对方框的回调函数,并利用dialogboxindirectparam(&dlgyourtaste, hwnd_desktop, dialogboxproc2, 0l)函数建立对话框。dialogboxproc2 (hwnd hdlg, int message, wparam wparam, lparam lparam)的msg_initdialog进行消息的循环。6) 程序退出用户单击窗口右上角的关闭按钮时窗口过程函数将收到一个msg_close消息。程序退出。2. 主要部分解析:1) 发送部分:发送部分采用的是按键发送的消息,然后发送写指令把数据写到串口获取发送信息:存储到buff中。 getwindowtext (hwnd, buff, 10);获取发送id号:发送文本信息:case idc_button_send:getwindowtext (getdlgitem (getparent (hwnd1), idc_send_chars),str,1024); nwrite=write(fd, str, strlen(str);if(nwrite=-1)printf(write serial port failedn); close(fd);break; 2) 接收部分:接收部分采用的是创建一个新线程的办法,在新线程中接收数据,然后通过内存复制,把数据传回进程中。创建线程: if(pthread_create(&thread_id, null, (void*)readthread, null) !=0) printf(readthread_create is failed!n); /*读串口线程*/void readthread(void* arg)int nread;char readdata1024;char str1024;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 failedn);/printf(readdata:%sn,str);getwindowtext (getdlgitem (getparent (hwnd), idc_recieve_chars),str,strlen(str);memcpy(&strstrlen(str),&readdata,strlen(readdata); /printf(readdata:%sn,str);setwindowtext (getdlgitem (getparent (hwnd), idc_recieve_chars),str);/setwindowtext (getdlgitem (getparent (hwnd), idc_recieve_chars),readdata);3. 运行界面:5、 设计总结1. 在pc上运行测试程序时要先打开qvfb,再运行程序。2. 在pc上运行程序时若提示:可以如图修改qvfb的配置3. 若程序运行成功,却只能显示部分界面:可以编辑/usr/local/etc/下的minigui.cfg修改minigui的配置4. 移植程序时要先确认是否配置了交叉编译环境。5. 下载文件至目标板使用超级终端直接发送,优点是方便快捷,缺点是传输速度慢,因本次传送文件较小,故选用此法。6. 运行minigui可执行文件时,可能会出现权限不足的提示:可以修改文件属性来解决:# chmod a+x ./文件名7. 虽然已经基本实现了功能,只是程序在目标板上运行不稳定,因时间有限未能在课程时间内完成改进,不过一定会在课外时间加以完善。8. 因linux是开源系统版本繁多,一些应用软件的安装和配置很容易出现各种问题,这时就非常考验解决问题的能力,要学会根据错误提示、说明文档、参考资料和网络资源,逐个解决问题,在解决问题的过程中,经验和能力可以得到很好的积累。6、 参考文献刘洪涛、孙天泽;嵌入式系统技术与设计;北京:人民邮电出版社minigui编程指南3.0;北京:北京飞漫软件技术有限公司tq2440 用户手册;广州:天嵌技术有限公司7、 附录:串口界面源代码:#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define idc_button_send101 #define idc_button_open 102#define idc_button_close 103#define idc_recieve_chars 104 #define idc_send_chars 105#define idc_button_0106#define idc_button_1107#define idc_button_2108#define idc_button_3109#define idc_button_4110#define idc_button_5111#define idc_button_6112#define idc_button_7113#define idc_button_8114#define idc_button_9115#define idc_button_10116#define idc_prompt_baudrate 200 #define idc_prompt_port 201 #define idc_prompt_databit 202#define idc_prompt_stopbit 203#define idc_prompt_paritybit 204#define idc_prompt_message 205#define idc_box_baudrate 206#define idc_box_port 207#define idc_box_databit 208#define idc_box_stopbit 209#define idc_box_paritybit 210int fd;hwnd hwnd;/*对话框定义*/static dlgtemplate dlgmycom = ws_border | ws_caption, ws_ex_none, 0, 0, 626, 480, jxbs com, 0, 0, 30, null, 0 ; /*定义各类控件*/static ctrldata ctrlmytaste = static, ws_visible | ss_left | ws_group, 280, 360, 100, 50, idc_prompt_port, jxb and fjr design in 2011/12/20, 0 , /*定义端口选择的复选框*/ static, ws_visible | ss_left | ws_group, 16, 60, 100, 80, idc_prompt_port, port select, 0 , combobox, ws_visible | cbs_dropdownlist | cbs_notify, 100, 60, 100, 30, idc_box_port, uart1, 60 ,/*定义波特率设置的复选框*/ static, ws_visible | ss_left | ws_group, 16, 90, 100, 110, idc_prompt_baudrate, set 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, 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, 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, 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, open, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 120, 210, 80, 30, idc_button_close, close, 0 ,/*定义信息显示模块*2*/ static, ws_visible | ss_left | ws_group, 16, 20, 65, 20, idc_prompt_message, initial port, 0 , /*定义发送接收按钮*/ button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 280, 300, 50, 30, idc_button_send, sent, 0 , /*定义数据显示模块*/ static, ws_visible, 280, 30, 65, 20, idc_static, receive data, 0 , ctrl_mledit, ws_visible | ws_border | ws_vscroll | es_baseline | es_autowrap, 280, 50, 180,100, idc_recieve_chars, , 0 , static, ws_visible, 280, 160, 65, 20, idc_static, sentdata, 0 , ctrl_mledit, ws_visible | ws_border | ws_vscroll | es_baseline | es_autowrap, 280, 180, 180,100, idc_send_chars, , 0 ,/*定义键盘*/ button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 56, 360, 30, 30, idc_button_0, 0, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 86, 360, 60, 30, idc_button_10, clear, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 56, 270, 30, 30, idc_button_1, 1, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 86, 270, 30, 30, idc_button_2, 2, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 116, 270, 30, 30, idc_button_3, 3, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 56, 300, 30, 30, idc_button_4, 4, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 86, 300, 30, 30, idc_button_5, 5, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 116, 300, 30, 30, idc_button_6, 6, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 56, 330, 30, 30, idc_button_7, 7, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 86, 330, 30, 30, idc_button_8, 8, 0 , button, ws_visible | bs_defpushbutton | ws_tabstop | ws_group, 116, 330, 30, 30, idc_button_9, 9, 0 ,;/*打开设备*/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; /*设置波特率*/int set_speed(int fd, int speed) int i; int status; int speed_arr = b115200, b57600, b38400, b19200, b9600, b4800, b2400, b300; int name_arr = 115200, 57600, 38400, 19200, 9600, 4800, 2400, 300; 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, 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 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;/设置c_cflag选项数据位为7位 break; case 8: options.c_cflag |= cs8;/设置c_cflag选项数据位为8位 break; default: fprintf(stderr,unsupported 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: options.c_cflag &= parenb; options.c_iflag &= inpck; break; case o: case o: options.c_cflag |= (parodd | parenb); options.c_iflag |= inpck; break; case e: case e: options.c_cflag |= parenb; options.c_cflag

温馨提示

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

评论

0/150

提交评论