郑州大学远程教育学院毕业文,免费毕业文下载郑州

(声明:因为这是本人毕业论文,仅供大家参考学习之用,请勿用于其他用途!由于其他用途所产生的一切不良后果本人概不负责,若不同意此声明,请立即删除本文件,读者没有删除此文件即被看做认可本声明,谢谢合作.)

基于ARM的GPRS通信系统的设计

1引言

1.1选题背景

与此同时,中国移动于2002年5月正式开通GPRS网络(2.5G移动通信技术),由于GPRS网络支持TCP/IP协议,这使得无线数据传输变得更加轻松,而且相对比S(短消息)等要便宜许多.因此,综合嵌入式LINUX技术和GPRS网络来实现无线数据采集与传输具有非常诱人的前景,必将受到越来越多的重视.

中国成为世界制造中心甚至设计中心的趋势,必然导致对小型数字控制系统的需求越来越大.在嵌入式系统开发方面,最核心的就是微处理器芯片和嵌入式操作系统.其中ARM已经给出了理想的一个答案,而在嵌入式操作系统方面,从上世纪80年始,出现了各种各样的商用嵌入式操作系统百家争鸣的局面,比较着名的有WindRiver公司的VXWorks,PSOS和WindowsCE等等,这些操作系统大部分是为专有系统而开发的.

嵌入式Linux是一款遵循GPL协议的免费使用和自由传播的实时嵌入式操作系统,它继承了它的父亲Linux的所有的优点,并且拥有一大批的社区维护和爱好者.它的源码开放性允许任何人可以获取并修改Linux的源代码.这样一方面大大的降低了开发的成本,另一个方面又可以提高开发产品的效率.嵌入式Linux支持X86,PowerPC,ARM,XSCALE[1]等多种体系结构,并且移植到多种硬件平台.这对于经费,时间受限制的研究和开发项目很有吸引力,并且Linux采取一个统一的框架对硬件管理,所以上层应用程序可以方便的移植到不同的平台上.基于以上的原因,我决定使用嵌入式Linux搭配高端的XSCALE270芯片来构建这个项目.


1.2目的和意义

目的是使用基于亿道XSBASE270的开发评估板(此评估板是基于XSCALE体系结构),利用实时多任务嵌入式操作系统Linux和图形开发环境QTE,实现GPRS/G的短信与的功能.

程序做出后放入Linux社区,实现源代码共享,推动嵌入式Linux的发展.

1.3技术要求,设计范围与主要问题

对于设计者的要求比较高,它要求:

必须熟练C/C++语言.

熟悉并拥有至少半年的Linux操作经验.

熟悉操作系统的一些相关知识例如多线程[2].

熟悉图形化界面的开发.

拥有快速学习的能力.

这个设计了对硬件的理解,对操作系统的理解以及对应用层的操作.

主要问题与解决方法:

移植内核的问题参考了开发板供应商提供的相关文档.

串口的操作参考了指导老师给的资料和一些相关源代码.

QTE的配置编译主要参考了网上的资料和指导老师的建议.

AT指令有开发经验的工程师

1.4国内外发展现状

近年来,我国嵌入式系统应用产品日益丰富,市场呈现快速增长趋势,尤其在家电,电子,汽车,通信,交通,金融,网络,监控,工业自动化等领域应用更加广泛,发展嵌入式系统技术和产业已经成为信息化带动工业化,工业化促进信息化的方针,使我国产品由中国制造向中国创造迈进的突破口.

但就目前的国际产业状况而言,我国尚处于产业链的末端,传统产业结构面临着全面的升级调整.加快产业结构的升级与转型,已成为国内经济发展的首要问题.做为集成电路设计技术和软件技术的结合和延伸,嵌入式系统技术决定着电子产品的智能化水平及科技含量,而嵌入式系统技术在传统产业中的广泛应用则可显着地降低传统产业的生产成本,提高运营效率,以嵌入式软件为核心的嵌入式系统将成为传统产业升级改造的主要推动力. 2方案论证

2.1系统

2.1.1PC端系统的选择

PC端的软件主要是系统的选择,是选择双系统(Linux+WindowsXP)还是选择虚拟机安装LINUX.前者的优点是运行速度快,缺点是切换系统的时候需要重新启动.后者的优点是可以切换系统,缺点是对硬件要求较高.建议512内存,P4以上的PC使用后者.

2.1.2

纯商业性的嵌入式操作系统主要有WinCE和VxWorks,开源的嵌入式操作系统有嵌入式Linux,其他的还有rtLinux,uC/OS-II等.由于条件的限制,只供WinCE和Linux可供选择.Linux是目前最为流行的一款开放源代码的操作系统,从1991年问世到现在,不仅在PC平台,还在嵌入式应用中大放光彩,逐渐形成了与其他商业EOS抗衡的局面.目前正在开发的嵌入式系统中,70%以上的项目选择Linux作为嵌入式操作系统.

经过改造后的嵌入式Linux具有适合于嵌入式系统的特点.

(内核精简,高性能,稳定,

(良好的多任务支持,

(适用于不同的CPU体系架构:支持多种体系架构,如X86,ARM,MIPS,ALPHA,SPARC等,

(可伸缩的结构:可伸缩的结构使Linux适合于从简单到复杂的各种嵌入式应用,

(外设接口统一:以设备驱动程序的方式为应用提供统一的外设接口,

(开放源码,软件资源丰富:广泛的软件开发者的支持,低廉,结构灵活,适用面广,

(完整的技术文档,便于用户的二次开发.

而WindowsCE的最新版本WindowsCE.NET的目的,是让不同语言所写的程序可以在不同的硬件上执行,也就是所谓的.NETCompactFramework,在这个Framework下的应用程序与硬件互相独立无关.而核心本身是一个支持多线程以及多CPU的操作系统.在工作调度方面,为了提高系统的实时性,主要设置了256级的工作优先级以及可嵌入式中断处理[3].其提供的协议软件非常完整,如基本的PPP,TCP/IP,IrDA,ARP,ICMP,WirelessTunableTCP/IP,PPTP,SNMP,HTTP,等等几乎应有尽有,甚至还提供了有保密与验证的加密通信,如PCT/SSL.

相比易开发性,WinCE似乎更胜一筹,但基于中国的现在的国情,免费且开源的Linux拥有着WinCE永远无法超越的优势,预计未来使用免费开源代码开发的产品远远大于使用商业操作系统.所以我选择了嵌入式Linux来开发这次的项目.

2.1.3为一个可收发的系统,在处理收发信息之间的同步关系和数据交互可以有两种方案可供选择,一种就是常用的多线程,第二种就是使用定时器,多线程流程图如图1所示.

图1多线程结构

多线程的优点是可以完整的读出所有从串口发过来的数据,因为多线程结构有一个线程专门负责读串口的,这样保证了数据的完整性.

多线程的缺点就是因为多线程的使用带来了很多不确定因素[4],简单的数据传输就必须使用线程间通信的方式例如管道加信号来解决,也在另一种方面增加了它的技术难度.

定时器的流程图如图2所示.

图2定时器结构

定时器的优点相对多线程来说就是容易控制,不会出现进程通信之间产生的一些异常的不确定因素.

的运行模式是每两百毫秒读一次串口看是否有数据,如果有数据就处理,没有数据就继续等待下一个两百毫秒.

定时器 的缺点就是不能连续读串口,每次读串口之间都有200毫秒的延时,所以不能够读超过比串口通道缓冲区更大的数据.而硬件的缓冲区一般只有几十字节到几KB.但GPRS模块接收的AT命令指令很短,所以对GPRS通信系统来说,定时器的缺点是不影响数据接收的.

综上所述,我采用的流程选择为定时器流程.

2.2运行环境和开发工具的构建

2.2.1

(1)能够流畅运行WINXP/Linux(双系统)的PC机作为主机端.

只是要求主机端的OS要求有XP和LINUX两种类型的OS,便于调试和开发.WINXP系统是运行虚拟机程序和查阅资料的.而在LINUX下是运行ARM交叉编译环境及开发QTE界面,与开发板通信以及程序的编写的.

(2)基于XSCALE270的评估板一个.

用于烧写Bootloader的JTAG线一条,交叉串口线,交叉网线,RS232串口线各一条.

(3)一个型号为西门子MC39I的GPRS模块.

2.2.2

(1)QT2.3.2为UI设计程序.

(2)tmake-1.11用于生成makefile文件.

(3)qt-2.3.7用于生成应用程序所依赖的库文件libqte.so.2.3.7.

(4)qtopia用于虚拟开发板上的桌面系统.

(5)arm-linux-toolchain.tar.gz为交叉工具链,使用它产生目标机的可执行程序.

3

3.1GPRS通信系统设计过程的关键问题

GPRS通信系统的设计首先基本的系统才能实现GPRS通信,所以此系统的关键问题之一就是如何把嵌入式操作系统移植到XSBASE270开发板上,这就涉及到的具体的Bootloader移植[5],文件系统的移植,内核的移植,并使这个嵌入式Linux系统能够正常运行.

其次是应用程序的编写,其中最主要的就是QT环境的编译,因为编译出来两个程序,一个是在主机上调试的,另外一个是移植到开发板的,所以Qt2.3.7需要编译两次来满足程序编写的需求.

最后是AT命令的编码和解码,本系统的短信是采用PDU模式来接收和发送信息的.

3.2以上需求经过细化,整个系统要完成以下模块的设计,总体框架图如图3所示.

图3总体框架图总体设计流程分为硬件部分和软件部分,硬件部分做的就是为软件部分搭建环境,包括移植Linux内核[6]等等.软件部分做的就是完成GPRS的发短信和拨打的功能,的如图4所示.

图4系统总体设计流程图

4过程论述

4.1硬件设计流程论述

4.1.1硬件

XSBASE270是基于Intel高性能的PXA270处理器并支持嵌入式Linux/WinCE系统的针对教学/实验的多功能嵌入式开发平台.XSBASE270的处理器主频率达到了520MHz,SDRAM为64MB,FLASH达到32MB640*480的TFT液晶屏,带4线式触摸屏,以及一个串口接口和扩展总线[7].

总体硬件如图5所示.

图5总体硬件图

GPRS模块采用的是德国西门子MC39iG/GPRS终端,它设计小巧,功耗很低.RS232接口配件有天线,串口线,电源.该设备支持短信收发,语音,传真,GPRS上网,数据传输等.GPRS模块如图所示.

图GPRS模块

4.1.2安装交叉编译工具链

进入Linux系统,将光盘自带的xscalev1.tar.gz拷贝到/opt目录下,并解压缩:

tarxvfzxscalev1.tar.gz

修改配置文件使得每次登录都可以使用它:

vi~/.bash_profile

在该文件最后一行加入

PATH等于$PATH:/opt/xscalev1/bin

然后重新登录即可.

4.1.3Bootloader的移植

Bootloader的主要功能:

初始化硬件

初始化CPUclock,Memorytiming,interrupt,UART和GPIO.启动Linux这是bootloader最重要的功能.它将内核映像复制到SDRAM中并跳转到内核入口地址处.

下载Image下载内核和文件镜像到SDRAM中.下载只能通过以太网.

Ether–tftpandbootp.

Flash存储器管理

用write,erase,lock,andunlock等命令管理Flash存储器.

在亿道提供的开发包中已经拥有了完整的Bootloader镜像和源文件,我使用的是自己编译源文件得到的Bootloader.

下面是我的编译和烧录步骤:

进入光盘自带的Jflash-XSBase270目录,执行make命令,生成Jfalshmm.该工具用于烧录Bootloader.

将光盘中源文件移植到/work/Bootloader(没有请创建)目录下.然后执行make指令生成bootloader的镜像boot.

将/work/Bootloader中刚生成的boot复制到Jflash-XSBase270中,连接好目标板和主机之间的JTAG线,打开目标板,在Jflash-XSBase270目录中执行下列命令:

./jflashmmboot

出现Verificationsuccesul!则说明烧录成功,否则请检查JTAG电缆连接情况,然后,对目标板后再进行尝试.

4.1.4裁剪编译Linux2.4.21

创建一个系统镜像文件的过程需要使用光盘中的程序linux-2.4.21-51Board_EDR.tar.gz.

在/work下面创建一个kernel目录,然后将linux-2.4.21-51Board_EDR.tar.gz复制到该目录下面并解压缩.

tarxvfzlinux-2.4.21-51Board_EDR.tar.gz

cdlinux-2.4.21-51Board_EDR

makemenuconfig

使用该命令来配置内核[8],根据需求不同而在里面选择不同的模块,例如进入内核配置的主界面,如图所示.

选择SystemType,如图所示.

第二级菜单SystemTpye

进入IntelPXA270/250/210Implementations选项,并检查XSBase270-EDR平台是否被选择了,如图所示.

第菜单IntelPXA270/250/210Implementations

配置完成之后执行make生成zImage_e24qt.

4.1.5制作文件系统镜像

本系统采用的是JFFS2文件系统.

JFFS2是一种日志结构化的文件系统,是专门为类似闪存芯片这样的嵌入式设备创建的文件系统.

使用脚本mkrootfs.sh来创建JFFS2文件系统如下命令:

rm–rfrootfs270.img

#./mkrootfs.sh

最后生成一个名为rootfs270.img就是我们所需要的文件系统了.

4.1.6烧录镜像文件

在Linux中打开mini,设置波特率为115200,然后打开开发板的电源,mini中会显示:

Weletouse51BoardBootloaderforXSBase270board

Copyright(C)2002-200651BoardCoLtd.

Support:51Board.

Version:01.00.03

flash:base等于0x00000000,size等于0x02000000

Ethportcanaccess,thebaseaddressis0x0c000300

EthchipisLAN91C111

autobootinprogress,pressanykeytostop.

Bootdelay2seconds

autobootaborted.

等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于OperationMenu等于等于等于等于等于等于等于等于等于等于等于等于等于等于

[0]ComanndLinemode

[1]Viewcurrentconfiguration

[2]Bootp

[3]DownloaddefaultKernel(zImage_EDR_temp)

[4]FlashKernel

[5]DownloaddefaultFilesystem(rootfs270qt.img)

[6]FlashFilesystem

[7]Bootsystem

[8]Rebootsystem

[9]Resettofactorydefaultconfiguration

[a]SetdefaultKernelfilenameandFilesystemfilename

[b]Setbootdelaytime

[c]Help(togetalistofmands)

等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于等于 等于等于等于等于等于等于等于等于

Pleaseenteryourselection:

使用如下命令来下载内核:

1.设置需要下载的镜像名:在菜单模式下,选择a",按提示输入内核镜像和文件系统镜像名,用户必须保证在/tftpboot目录下存在同名的镜像文件.

2下载内核镜像:在菜单模式下,选择3",此时,内核镜像通过以太网下载到开发板的sdram上,若传输超时或失败,请重新执行.

3烧写到flash:在菜单模式,选择4",将刚下载的内核镜像烧到flash上.

假设文件系统的镜像名为rootfs270.img,使用tftp命令将其下载到目标板

1.设置需要下载的镜像名:在菜单模式下,选择a",按提示输入内核镜像和文件系统镜像名,用户必须保证在/tftpboot目录下存在同名的镜像文件.若上一节已设置镜像名,此步可略.

2下载文件系统镜像:在菜单模式下,选择5",此时,文件系统镜像通过以太网下载到开发板的sdram上,若传输超时或失败,请重新执行.

3烧写到flash:在菜单模式,选择6",将刚下载的文件系统镜像烧到flash上.

4.2软件设计流程论述

4.2.1QT环境的配置和搭建

环境的配置和搭1.从光盘的QT目录下获得以下文件[9]

tslib.tar.bz2

tmake-1.11.tar.gz

qt-embedded-2.3.7.tar.gz

qtopia-free-1.7.0.tar.gz

ent-target.sh,tslib.sh,qt-2.3.7.sh

2编译Qt/Embedded的环境参数的设置

在编译Qt/Embedded时,用户在PC机上应对编译时所需的环境变量进行设置(假设Qt解压后目录为/work/qt-2.3.7),主要参数包括:

(1)QTDIR-Qt解压后的所在的目录

(2)LD_LIBRARY_PATH-Qt共享库存放的目录.

(3)QPEDIR-qtopia解压后的所在的目录

(4)TMEPATH-tmake编译工具的路径(假设tmake-1.1所在的目录为/work)

(5)TMEDIR-tmake编译工具的目录

(6PATH-交叉编译工具arm-linux-gcc的路径

针对ARM开发平台的Qt/Embedded的编译步骤:

根据编译Qt/Embedded的环境变量的设置方法设置环境变量,进入/qt2目录运行脚本:ent-target.sh,该脚本会设置所需要的环境变量.

[root@localhostroot]$cdqt2

[root@localhostqt2]$.ent-target.sh

QT工具链的配置

[root@localhostqt2]$tar–zxvf/root/source/tmake-1.11.tar.gz.

[root@localhostqt2]$tar–zxvf/root/source/qt-embedded-2.3.7.tar.gz.

[root@localhostqt2]$mvqt-2.3.7qt-2.3.7-target

[root@localhostqt2]$tar–jxvf/root/source/tslib.tar.bz2.

拷贝需要的脚本和补丁到对应的目录:

[root@localhostqt2]$cp/root/source/patch.–rf

[root@localhostqt2]$cp/root/source/ent-target.sh.

[root@localhostqt2]$cp/root/source/tslib.shtslib

[root@localhostqt2]$cp/root/source/qt-2.3.7.shqt-2.3.7-host.sh

触摸屏共享库的编译和Qt/Embedded源代码的修改

Qt/Embedded只支持鼠标和键盘的操作,但在大部分嵌入式系统中利用触摸屏,所以用户必须对触摸屏的相关操作编译成共享库或静态库.下面介绍触摸屏共享库的编译过程.

进入/qt2/tslib"目录,运行该目录下的tslib.sh"脚本.

[root@localhostroot]$cd/qt2/tslib

[root@localhosttslib]$./tslib.sh

tmake的设置

解压后的tmake-1.11源文件需要作一定的修改后才能用于产生Makefile文件,需修改的内容如下:

[root@localhosttslib]$vi/qt2/tmake-1.11/lib/qws/linux-arm-g++/tmake.conf

在TME_LIBS处加–lts,在TME_LINK处该为arm-linux-g++.

输入:w!保存.

编译qt-embedded-2.3.7.进入qt-2.3.7-target目录,运行qt-2.3.7.sh"脚本

[root@localhosttslib]cd/qt2/qt-2.3.7-target

[root@localhostqt-2.3.7-target]$.qt-2.3.7.sh

(choiseitem:licenseyes:colordepth:16,VirtualFramebuffer:no)

以后即可以在此目录下面编译可在目标机上面运行的程序.

4.2.2串口通信模块的实现

串口操作主要是先打开串口,再设置它的参数,串口流程如图所示.

图串口通信流程图

本系统采取了将串口的所有操作做成一个类,类名为MySerial,它包含了3个函数,分别为:

taticintset_opt(intfd,intnSpeed,intnBits,charnEvent,intnStop),

该函数实现了设置串口的一些参数,fd为用户打开的文件标识符,nSpeed为波特率,nBits为数据位,nEvent为奇偶效验,nStop为停止位.失败返回0.

把三个函数都设置成为静态函数的原因是它们可以和类无关,可以单独被调用或者设置,也可以使用类来调用它们.

其中设置串口参数的关键是在于串口配置的数据结构[9]:

structtermio {

unsignedshortc_iflag,/*输入模式标志*/ unsignedshortc_oflag,/*输出模式标志*/ unsignedshortc_cflag,/*控制模式标志*/ unsignedshortc_lflag,/*localmodeflags*/ unsignedcharc_line,/*linediscipline*/ unsignedcharc_cc[NCC],/*controlcharacters*/ },

设置串口的过程如下:

串口配置使用tcgetattr(fd,&,oldtio)函数

structtermiosnewtio,oldtio,

tcgetattr(fd,&,oldtio),

激活选项有CLOCAL和CREAD,用于本地连接和接收使能.

newtio.c_cflag|等于CLOCAL|CREAD,

设置波特率,使用函数cfsetispeed,cfsetospeed

cfsetispeed(&,newtio,B115200),

cfsetospeed(&,newtio,B115200),

设置数据位,需使用掩码设置.

newtio.c_cflag&,等于~CSIZE,

newtio.c_cflag|等于CS8,

设置奇偶校验位,使用c_cflag和c_iflag.

设置奇校验:

newtio.c_cflag|等于PARENB,

newtio.c_cflag|等于PARODD,

newtio.c_iflag|等于(INPCK|ISTRIP),

设置偶校验:

newtio.c_iflag|等于(INPCK|ISTRIP),

newtio.c_cflag|等于PARENB,

newtio.c_cflag&,等于~PARODD,

设置停止位,通过激活c_cflag中& #30340;CSTOPB实现.若停止位为1,则清除CSTOPB,若停止位为2,则激活CSTOPB.

newtio.c_cflag&,等于~CSTOPB,

设置最少字符和等待时间,对于接收字符和等待时间没有特别要求时,可设为0.

newtio.c_cc[VTIME]等于0,

newtio.c_cc[VMIN]等于0,

处理要写入的引用对象

tcflush函数刷清(抛弃)输入缓存(终端驱动程序已接收到,但用户程序尚未读)或输出缓存(用户程序已经写,但尚未发送).

inttcflush(intfiledes,intqueue)

激活配置.在完成配置后,需激活配置使其生效使用tsettattr()函数原型:

inttcgetattr(intfiledes,structtermios*termptr),

inttcsetattr(intfiledes,intopt,conststructtermios*termptr),

staticintopen_port(intfd,intport),

该函数实现了打开端口,第一个参数为任意,第二个参数为打开的串口端口,如port为1则打开串口0(ttyS0).返回打开的文件标识符.

因为在Linux下操作串口等设备与操作文件相同.所以操作串口的函数是下面一些常用的函数:

fd等于open("/dev/ttyS0",O_RDWR|O_NOCTTY|O_NDELAY),

read(fd,buff,8),

write(fd,buff,8),

open函数是打开串口0并返回文件标识符,read和write分别是读和写的函数.其中fd为文件标识符,buff为缓冲区,8为缓冲区大小.

而open_port函数则封装了open函数,open_port第二个参数为选择串口号的参数.

staticintnwrite(intserialfd,constchar*data,intdatalength),

该函数实现了往串口写数据,其中第一个参数是文件标识符,data为要传送的数据,datalength为要传送数据的长度.返回成功写入数据的长度.

nwrite函数则将write函数封装,实现把第二个参数的字符串输出到串口.

nwrite第二个参数设置成constchar*方便在主程序使用QString.原因在于QString有个函数为latin1(),将QString转换成constchar*.

4.2.3应用程序的UI设计

本系统采用的是QT2.3.2界面设计程序UI[10].它拥有两个UI界面,一个为短信界面,一个为界面.

背景图片和按钮图片都是用photoshop完成的,在程序中加载.

短信界面如图1所示.

图1短信界面

短信UI拥有4个按钮,5个文本框,1个图片框,它们分别拥有如下功能:

Call按钮:进入Call的UI界面.

Send按钮:发送短信(发送前检测短信中心,接受和内容是否为空).

Open按钮:阅读对方指定ID的短信.

Exit按钮:退出按钮.

短信中心文本框:显示短信中心,属性为只读.内容(左)文本框:预发送的短信内容.

对方文本框:预发送短信的接收人的.

内容(右)文本框:显示读出来的内容,属性为只读.

State文本框:显示所有的状态信息.

图片框:显示背景图片.

此UI为继承gprs类的gprs_impl类的对象[11],而gprs类是一个框架类,并不包含图片等信息,所以在gprs_impl类的构造函数中要初始化图片.图片相关的信息在构造函数将调用的initPic()中初始化.

QStringstrPicDir等于"/pic/",

Btn_Close->,setPixmap(QPixmap(strPicDir+"1_exit.png")),

Btn_Open->,setPixmap(QPixmap(strPicDir+"1_open.png")),

Btn_Call->,setPixmap(QPixmap(strPicDir+"1_call.png")),

Btn_Send->,setPixmap(QPixmap(strPicDir+"1_send.png")),

BackImg->,setPixmap(QPixmap(strPicDir+"m.png")),

其中strPicDir是图片存放的目录,本系统是放在根目录下的pic目录中.

界面如图12所示.

图1界面

UI拥有16个按钮,2个文本框,1个图片框,它们分别拥有如下功能:

Exit按钮:退出该UI回到短信UI.

Message按钮:退出该UI

打按钮:拨打

挂按钮:挂

0-9按钮:数字按钮,按相应键在Num文本框中显示

C按钮:删除上一个数字

#按钮:#号

Num文本框:显示的文本框,属性为只读,初始值为10086

State文本框:显示所有的状态信息.

图片框:显示背景图片.

此UI与gprs_impl类似,是继承call类的call_impl类的对象,而call类是一个框架类,并不包含图片等信息,所以在call_impl类的构造函数中要初始化图片.图片相关的信息在构造函数将调用的initPic()[12]中初始化.

4.2.4AT命令编码解码模块的实现

G规范对短消息传输定义了三种控制协议:即二进制协议(块模式),基于字符的AT命令接口协议(文本模式)和基于字符的十六进制编码二进制传输块接口协议(PDU模式).

块模式(Blockmode)是使用二进制编码来传输用户数据的接口协议.为了提高可靠性,它带有差错保护,适合于链接不完全可靠的地区,尤其是要求控制远程设备的情况.它属于G第一阶段的短消息传输接口协议.目前,PDU已取代了块模式.

文本模式(Textmode)是使用AT命令传输文本数据的接口协议.该模式适合于非智能终端,终端仿真器等.

PDU模式相当于计算机网络中的分组交换接口协议.这种传送方式能够很平稳地过渡到GPRS,因此G规范要求用户尽可能地使用PDU模式处理短消息.

所以本采用的是PDU模式来编码和解码. 表1常用与短消息相关的AT指令

AT指令功能AT+CMGCSendanSmand(发出一条短消息命令)AT+CMGDDeleteSmessage(删除SIM卡内存的短消息)AT+CMGFSelectSmessageformate(选择短消息信息格式:0-PDU,1-文本)AT+CMGLListSmessagefrompreferredstore(列出SIM卡中的短消息PDU/text:0/"RECUNREAD"-未读,1/"RECREAD"-已读,2/"STOUNSENT"-待发,3/"STOSENT"-已发,4/"ALL"-全部的)AT+CMGRReadSmessage(读短消息)AT+CMGSSendSmessage(发送短消息)AT+CMGWWriteSmessagetomemory(向SIM内存中写入待发的短消息)AT+CMSSSendSmessagefromstorage(从SIM内存中发送短消息)AT+CNMINewSmessageindications(显示新收到的短消息)AT+CPMSPreferredSmessagestorage(选择短消息内存)AT+CSCASservicecenteraddress(短消息中心地址)AT+CSCBSelectcellbroadcastmessages(选择蜂窝广播消息)AT+CPSetStextmodeparameters(设置短消息文本模式参数)AT+CSSelectMessageService(选择短消息服务)短信系统中最关键的就是定时器函数的实现.定时器是在第一个UI界面的构造函数中初始化的,由它每两百毫秒调用一次read_timeout_slot().

在read_timeout_slot()里面依赖一些位信息来处理事件,例如BInit为1的时候就处理初始化的代码.系统初始化及定时器函数如图1所示.

图1系统初始化及定时器函数

[13].

有新出现提示如图14所示.

图14有新提示

解码函数ProcessMessage的作用就是将别人发过来的解码成信息,包括对方,对方发送短信的时间,对方发送的消息内容[14]等等.本系统提供了两种解码方式,一种为7位解码,一种为PDU解码,这样就兼容了不同手机发送短信的编码方式.strMsg为:

"0891683108706105F0040D91685129563107F300008060908063922306E8329BFD0E01".由于短信原语串的可变内容为短信内容,而短信内容在原语串的最末尾,所以短信原语串中很多数据例如对方可以在固定的位置读取出来.

将短信内容和时间等数据提取出 469;为strData为"00008060908063922306E8329BFD0E01".

将对方提取出来为strnumber为"5129563107F3".

使用一个for循环将strnumber转换成正常格式的为"15926513703".

从strData中提取时间strdate为"806090806392".

使用一个for循环将strdate转换为正常格式"08-06-0908:36:29".

提取短信内容的原语串strSrc为"E8329BFD0E01".

获得该短信的编码方式nType"00",并判断为7位解码形式,如果不是"00"则使用PDU格式解码.使用Bit7Decode(strSrc)函数转换成正常格式,解码出来即为"hello!".

解码流程如图1所示.

图1解码流程

发送短信两个步骤:

第一个步骤就是发送AT+CMGS,然后GPRS模块会进入等待发送信息状态,就可以发送已经编码好的AT原语了.

所以编码函数PreSendMessage的作用在于将欲发送的短信内容用PDU格式编码成AT原语格式,并向串口写入AT+CMGS命令使得GPRS模块处于等待短信输入状态.strSendMsg等于"hello!",strPhoneNumber等于"15926513703",strServerNumber等于"13800716500".并定义一个QString类型strSendTemp来保存编码结果.

1.strSendTemp加上第一个固定原语字符串即strSendTemp等于"089168".这里的"08"代表短信中心的长度,共8位,"91"代表短信中心用国际形式表示在前面加"+","68"与后面加入的短信中心一起构成国际形式即8613800716500.

2.使用NumberConversion函数将对方手机号转换成原语形式,即将strServerNumber从"13800716500"转换成"3108706105F0".

3.将刚转换完的strServerNumber添加到原语中,strSendTemp现在为:"0891683108706105F0".

4.加上固定原语字符串"11000B81",strSendTemp现在内容为:"0891683108706105F011000B81".这里的"11"表示基本参数,发送的固定格式,"00"表示消息基准值为0,"0B"表示对方数字个数为11位,"81"表示非国际形式即没有"+"号.

5.使用NumberConversion函数将短信中心转换成原语形式,即将strPhoneNumber从"15926513703"转换成"5129563107F3".

6.将刚转换完的strServerNumber添加到原语中,strSendTemp现在为:"0891683108706105F011000B815129563107F3".

7.加上固定原语字符串"0008AA",strSendTemp现在内容为:"0891683108706105F011000B815129563107F30008AA".这里的"00"是协议标识,表示此是普通G类型,点到点方式,"08"表示用户信息编码方式为PDU编码方式,"AA"表示短信有效期为最大.

8.使用ToUnicode函数将欲发送的字符串成原语形式,即将strSendMsg从"hello!"转换成"0c00680065006c006c006f0021".

9.将刚转换完的strSendMsg添加到原语中,strSendTemp现在为:"0891683108706105F011000B815129563107F30008AA0c00680065006c006c006f0021".

10.转换结束,将strSendTemp返回.

编码流程如图1所示.

图1编码流程

阅读短信的原理就是先获取欲读短信的短信ID号,然后从GPRS模块中读对应ID号的短信即可.

为了增加可操作性,本系统增加了两项新功能,就是查看所有短信和查看新短信的功能.分别在接收号文本框中写ALL或者NEW就可以分别查看到SIM卡中所有的短信和所有的未读短信了.阅读短信步骤如图1所示.

图1阅读短信

发送短信的原理就是先获得欲发送的内容,再检查对方和短信中心是否正确,然后执行编码函数即可.

发送信息如图1所示.

图1发送短信流程

获得新短信的步骤和读短信类似,一般新短信来到的时候GPRS模块都有提示信息,信息中包含了CMTI,本系统就是依靠判断串口信息中是否含有CMTI来判断是否有新短信.然后从新短信中获得它的短信ID号,最后和读信息一样用AT+CMGR等于ID来将这条新短信读出来.

收新信息如图1所示.

图1获得新短信流程

拨打相对容易实现,的输入是靠界面上的键盘,而拨打和挂断就是分别发送相应的指令就可以了.

拨打实现如图所示.

图拨打4.2.5界面与模块之间的整合

因为QT采用的是信号与槽的连接方式,所以本系统在界面和模块整合这个方面上做的就是将按钮等控件的响应事件与具体的函数相关联起来.

这是短信界面的控件事件和函数关联的代码[15]:

QObject::connect(Btn_Close,SIGNAL(clicked()),this,SLOT(close_slot())),

QObject::connect(Btn_Open,SIGNAL(clicked()),this,SLOT(open_slot())),

QObject::connect(Btn_Send,SIGNAL(clicked()),this,SLOT(send_slot())),

QObject::connect(Btn_Call,SIGNAL(clicked()),this,SLOT(call_slot())),

这是界面的控件事件和函数关联的代码:

QObject::connect(Btn_exit,SIGNAL(clicked()),this,SLOT(close())),

QObject::connect(Btn_Dial,SIGNAL(clicked()),this,SLOT(Dial_slot())),

QObject::connect(Btn_UnDial,SIGNAL(clicked()),this,SLOT(UnDial_slot())),

QObject::connect(Btn_Message,SIGNAL(clicked()),this,SLOT(Message_slot())),

QObject::connect(Btn_1,SIGNAL(clicked()),this,SLOT(n1_slot())),

QObject::connect(Btn_2,SIGNAL(clicked()),this,SLOT(n2_slot())),

QObject::connect(Btn_3,SIGNAL(clicked()),this,SLOT(n3_slot())),

QObject::connect(Btn_4,SIGNAL(clicked()),this,SLOT(n4_slot())),

QObject::connect(Btn_5,SIGNAL(clicked()),this,SLOT(n5_slot())),

QObject::connect(Btn_6,SIGNAL(clicked()),this,SLOT(n6_slot())),

QObject::connect(Btn_7,SIGNAL(clicked()),this,SLOT(n7_slot())),

QObject::connect(Btn_8,SIGNAL(clicked()),this,SLOT(n8_slot())),

QObject::connect(Btn_9,SIGNAL(clicked()),this,SLOT(n9_slot())),

QObject::connect(Btn_0,SIGNAL(clicked()),this,SLOT(n0_slot())),

QObject::connect(Btn_c,SIGNAL(clicked()),this,SLOT(c_slot())),

4.2.6系统测试

在阶段,发现了的问题

第一个就是总要将程序下载到开发板上才能调试,所以我在PC机上装了一个环境来运行程序,这样就避免了每次都要下载到开发板上的繁琐.

第二个就是程序退出的时候平时都是调用的系统的close()函数,但发现这样并没有退出QT程序,而只是关掉了那个界面,真正的程序还在后台运行.所以在查阅相关资料之后,我使用了qApp->,quit()函数.

第三个就是界面,使用QTDesigner 后,系统的背景图被默认放在最顶层了,所以就遮盖了其他的控件.要修改就必须直接修改.ui文件,然后将对应的背景图片控件提到最底层.

第四个就是波特率,GPRS模块在开发板上不支持115200,所以采用的是串口2的9600波特率,否则将会出现乱码.

第五个就是关于开发板上的QTE的库问题,需要在目标机的makefile文件中添加触摸屏支持,在link选项后加入-lts.

5,图,图2:

图21硬件设备图

图22在开发板上运行短信界面

图23在开发板上运行界面

系统完成了发送短信拨接的功能. 6

本文的实现的就是一个可以收发短信和拨接的功能的通信系统.并完成Bootloader的烧写,嵌入式Linux的编译和移植,QT图形库的配置和移植以及整个系统程序的编写.

该通信系统的硬件采用GPRS模块通过串口与基于PXA270芯片的XSBASE270开发板连接,该通信系统的软件部分则采用嵌入式Linux环境下的QT2.3.2开发完成.

本GPRS通信系统是一个ootLoader的配置与移植在实际完成论文的过程中,由于受个人的知识,经验和能力的限制,论文肯定存在不足之处,我恳请各位老师提出批评和指正.我会在以后的学习和工作中严格要求自己,努力提高自己的专业水平,以不辜负老师对我的期望.

[1]Intel,IntelPXA27xProcessorFamilyDeveloper'sManual,2004

[2]Sloss,A.NARM嵌入式系统开发-软件设计与优化沈建华等译.北京:北京航空航天大学出版社,2005

[3]孙天泽,袁文菊嵌入式设计及Linux驱动开发指南——基于ARM9处理器(第2版)电子工业出版社,2007

[4]RaiKamal嵌入式系统—体系结构.编程与设计北京:清华大学出版社2005

[5]胥静嵌入式系统设计与开发实例详解-基于ARM的应用北京:北京航空航天大学出版社,2005

[6]毛德操胡希明Linux内核情景分析浙江:浙江大学出版社,2005

[7]JonatbanCorbetAlessandroRubini,GregKroab-Hartman,Linux设备驱动(第三版)魏永明,耿岳,钟书毅译北京:中国电力出版社,2006

[8]StephenPrataCprimerplus(第五版)北京人民邮电出版社2005

[9]KirkZurell,嵌入式系统的C程序设计北京机械工业出版社2002

[10]DanielSolin,24小时学通qt编程袁鹏飞译北京:人民邮电出版社2005

[11]沈美明IBM-PC汇编语言程序设计(第二版)北京:清华大学出版社2002

[12]杜春雷ARM体系结构与编程北京:清华大学出版社2003

[13]罗蕾嵌入式实时操作系统及应用开发北京:航空航天大学出版社2005

[14]苗忠良Qtopia编程之道0.5版2006

[15]Daniel.P.Bovet,深入理解Linux内核陈莉君译,北京:中国电力出版社2001

致谢

在此毕业论文完成之际,我首先衷心感谢我的指导老师程世旭教授.在我的课题设计中她给予了我精心的指导和热情的帮助.程老师那严谨的治学态度,渊博的学识,敏锐的洞察力和忘我的工作精神让我受益匪浅.她不仅仅在学习工作中指导和支持我们,而且在生活方面也细微的关心我们,为我们能够顺利成功的完成大学阶段的学习提供了一个良好的环境.在此,谨向程老师表达我深深的谢意!

其次要感谢林华老师和赵立辉老师,他们不嫌辛苦替我们联系实习单位,才能使我直接面对开发板供应商的工程师们,并得到他们的帮助,在此也要感谢亿道电子有限公司的工程师们.我还要再次感谢实验室的赵立辉老师,有了他的耐心的提供设备上的支持和帮助,我才能有条件完成本次毕业设计.

然后要感谢同一实验室做毕业设计的同学们,他们也给了我很大的帮助和支持.在他们的真诚合作与帮助下,我的研究工作才得以顺利展开和进行下来,在此一并向他们表示衷心的感谢.

此外还要感谢许多关心我的朋友和同学,他们总能在任何时候都给我不断的鼓励和帮助.

最后要感谢我的父母和家人,他们的关爱和支持永远是我前进的最大动力.在任何时候,他们都给予我最大的鼓励和支持.

基于ARM的GPRS通信系统的设计

引言

第4页(共52页)

第1页(共52页)

方案论证

总体设计论述

过程论述

系统运行情况

基于ARM的GPRS通信系统的设计

结束语

第36页(共52页)

第37页(共52页)

引言

第34页(共45页)

附录

"取消"

向串口写入:

ATH

"确定"

向串口写入:

ATA

弹出对话框,询问是否接.

Y

安装交叉编译工具链

硬件系统相关设计

软件系统相关设计

测试,调试,完成

界面与模块之间的整合

短信与拨打的实现

应用程序的UI设计与美化

GPRS模块串口通信的实现

QT环境的配置和搭建

烧录镜像文件,并能成功在开发板上运行

裁剪编译Linux2.4.21,制作文件系统镜像文件

Bootloader的移植

软件相关

硬件相关

GPRS通信系统,其中包括编码和解码,以及串口的传输以及短信的实现.

QT图形界面库

经过裁剪的嵌入式Linux系统,libc库

XSBASE270实验平台,GPRS模块

strRecv中是否有RING

拨打成功

显示在文本框中

小键盘输入

向串口写入ATD+

点击拨打按钮

向串口写入AT命令:

AT+CMGR等于x

其中x即为接收号文本框的值.

进入ReadMessage函数

新短信来到

在串口读入的数据中提取新信息的ID号

将内容和两个作为参数传给编码函数PreSendMessage

判断短信中心和接受人的是否格式正确

点击Send按钮

发短信函数send_slot()

向串口写入AT命令:

AT+CMGR等于x

其中x即为接收号文本框的值.

进入ReadMessage函数

都不满足

是否为new或NEW

如果是,则向串口写入

AT+CMGL等于0

将在状态栏中列出所有的段信息

是否为all或者ALL

如果是,则向串口写入

AT+CMGL等于4

将在状态栏中列出所有的段信息

点击OPEN按钮

读出接收号文本框的值并判断

读短信函数open_slot()

将头信息和转换后的按AT命令格式保存到strEncodeMsg,等待发送.

向串口设备写入命令使得GPRS模块处于等待短信输入的状态.

把第二个参数strPhoneNumber对方和第三个参数strServerNumber短信中心转换为AT语句的格式.使用NumberConversion函数转换.

QStringgprs_impl::PreSendMessage(QStringstrSendMsg,QStringstrPhoneNumber,QStringstrServerNumber)成功后返回编码后的原语

编码函数

解码函数

返回

从短信原语串中提取出编码方式,并由此选择解码成正常格式

从短信原语串中读出发送时间,并转换成正常格式

从短信原语串中读出发信人的,并转换成正常格式

获得短信原语串

获得短信原语串长度,并将其从QString格式转换成int格式

QStringgprs_impl::ProcessMessage(QStringstrMsg,QString&,strNum)其中strMsg即为要解码的原语

ReadMessage()函数:往串口写读信息的命令,Bread置1

显示新信息到达,并获得此新信息的ID号并调用

ReadMessage(ID)

Y

strRecv中是否有CMTI

发送已经编码好的字符串strEncodeMsg

N

Y

BSend是否为1

从串口读出的数据strRecv中提取短信中心,并显示到短信中心文本框上.并置BInit为0.

Y

BInit是否为1

将读到的内容解码,见图13.

Y

Bread是否为1

ReadMsg(QStringstrRecv)

有数据

无,返回

读串口,是否有数据.

read_timeout_slot()

定时器200ms触发一次,被触发后调用read_timeout_slot()

初始化

打开串口并获得文件描述符,新建并启动定时器,并向串口写获取短信中心的命令.

设置BInit为1,并手动调用一次read_timeout_slot函数.

initAT()

构造函数,初始化标志位.

gprs_impl()

XSBASE270实验平台

打开串口

挂断成功

向串口写入ATH

点击挂断按钮

设置串口

读/写串口

关闭串口

设置波特率

保存以前串口配置

激活选项

设置数据位

设置奇偶校验

设置停止位

设置最少字符和等待时间

处理要写入的引用对象

激活 配置

N

N

N

PXA270芯片,520MHZ

触摸屏

TFT液晶屏

USB接口

下载程序用.

JTAG接口,烧录Bootloader用

以太网接口.

下载文件系统和内核用

FLASHSDRAM

电源

RS

232

串口

GPRS模块

SIM卡

电源

天线

话筒与麦克风

类似论文

中南大学网络教育本科毕业文

法律文献引用注释标准(建议稿)June11,2005目录第一章简介41 引注的定义4 2 引注的目的4 3 如何使用该标准5 4 如何使用微件&。
更新日期:2024-6-9 浏览量:14442 点赞量:4589

中南大学毕业文,中南大学网络教育本科毕业文

西安电子科技大学论文定密审批表姓名性别年龄联系编号所在单位专业方向涉密等级其他作者姓名所在单位涉密等级姓名所在单位涉密等级姓名所在。
更新日期:2024-12-15 浏览量:158034 点赞量:34559

南京大学网络教育学院毕业,学位证书领取单

山东大学网络教育学院毕业论文成绩评定办法一、评定方法: (一),毕业论文(设计)成绩分优秀,良好,中,及格,不及格五等,要求优秀的比。
更新日期:2024-4-23 浏览量:60309 点赞量:14603

南京大学网络教育学院毕业

华南师范大学网络教育学院统考公共基础课免考申请表基本信息姓名性别民族就读学习中心学号专业件联系申请免考科目□大学英语A□大学英语B□。
更新日期:2024-2-2 浏览量:8214 点赞量:3192