基于QT设计的串口通信系统实验报告.docx
《基于QT设计的串口通信系统实验报告.docx》由会员分享,可在线阅读,更多相关《基于QT设计的串口通信系统实验报告.docx(30页珍藏版)》请在冰豆网上搜索。
基于QT设计的串口通信系统实验报告
串口通信系统
姓名:
马亮
学院:
电气与信息工程学院
专业班级:
物联网工程2015-01班
学号:
2015444139
指导老师:
易军
成绩:
重庆科技学院
二零一八年六月
大作业规则及要求
规则1:
同学们做一个题目,可以自拟题目,但必须经过任课老师同意,中途不得更改题目。
规则2:
任课老师将列出每个题目的具体功能及分值,完成后获得对应分数,发现代码抄袭或者现场答辩无法解释,记0分。
规则3:
鼓励增加新功能,并给予适当加分。
规则4:
大作业报告除遵守模板格式外,应按照需求分析、系统设计、详细设计、系统测试四个部分组织,其中需求分析应将本项目的功能需求、性能指标、界面、安全等因素考虑在内;系统设计应多画流程图说明设计意图;详细设计应包括关键代码或接口定义,数据表定义等;系统测试应包括功能实现情况(截图)、各性能指标完成情况(表格)。
规则5:
所有题目应以TQ2440为平台进行开发应用,否则答辩成绩扣30分。
摘要
嵌入式linux是将日益流行的Linux操作系统进行裁剪修改,使之能在嵌入式计算机系统上运行的一种操作系统。
嵌入式linux既继承了Internet上无限的开放源代码资源,又具有嵌入式操作系统的特性。
随着Internet的发展和后PC时代的到来,嵌入式系统以其可靠性强、体积小、专用性、成本低等特性得到日益广泛的应用。
目前嵌入式系统技术已经成了最热门的技术之一。
嵌入式Linux是嵌入式操作系统的一个新成员,其最大的特点是源代码公开并且遵循GPL协议,近几年来已成为研究热点.目前正在开发的嵌入式系统中,有近50%的项目选择Linux作为嵌入式操作系统。
新一代嵌入式计算系统的功能集成和应用模式使之迅速向网络化嵌入计算的方向发展,标准和统一的TCP/IP通信协议是独立于任何厂家的硬件的,因此嵌入式环境下的适时网络通信成为嵌入计算技术研究的重点和热点。
本文通过给予TQ2440的嵌入式串口通信的实现,按照嵌入式系统的软、硬件结构组成,较为详细地介绍了串口通信的硬件电路和软件实现方法。
关键词:
嵌入式Linux操作系统串口通信TQ2440
前言
串口通信是简单嵌入式系统的一个应用,串口通信是指外设和计算机间,通过数据信号线、地线、控制线等,按位进行传输数据的一种通信方式。
这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。
嵌入式系统是以应用为中心,以计算机技术为基础,软硬件可定制,适用于不同应用场合,对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统.它一般由嵌入式微处理器,外围硬件设备,嵌入式操作系统,用户应用程序四个部分组成。
用于实现对其他设备的控制,监视或管理等功能。
嵌入式系统已经广泛应用与科学研究、工业制造、军事技术等领域,人们常用的手机,智能家电,GPS等均是嵌入式系统的典型代表.
1嵌入式串口通信概述
所谓串口通信,是指外设和计算机间使用一根数据信号线(另外需要地线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。
串口传输是二进制代码序列在一条信道上以位为单位,按时间顺序且按位传输的通信方式。
串行传输时,发送端按位发送,接收端按位接受,同时还要对所传输的位加以确认,所以收发双方要采用同步措施,否则接收端将不能正确区分出所传输的数据。
串口通信不但能实现计算机与嵌入式开发板之间的数据传输,而且还能实现计算机对嵌入式开发板的控制。
若采用普通单片机,对外部设备的访问就需要利用复杂的汇编语言或者使用C51自己编写设备的初始化以及读写访问程序,这样的过程不仅复杂,而且不太利于大规模的开发与设计。
ARM与普通单片机相比,具有开发简单、灵活,而且性能稳定、功能易于扩展等一系列的优势,因而在各个领域的嵌入式系统中得到广泛的应用。
将Linux移植到ARM嵌入式处理器后,可以利用操作系统中提供的系统调用把串口及其他外设当成普通文件进行操作,读写方便,在进行相对应的开发时可以提高系统编程效率,而且还可以简化调试的复杂程度.
1.1嵌入式串口通信的原理
串行端口的本质功能是作为CPU和串行设备间的编码转换器.当数从CPU经过串行端口发送出去时,字节数据转换为串行的位.在接收数据时,串行的位被转换为字节数据。
串口是系统资源的一部分,应用程序要使用串口进行通信,必须在使用之前向操作系统提出申请打开串口,通信完成后必须释放资源,即关闭串口.
1.2嵌入式串口通信的开发工具
此次开发采用的硬件平台是以TQ2440为平台,ARM2410S嵌入式开发板作为被查询服务端,PC机为客户端和C语言来实现本次系统的开发。
客户端在Linux下开发,系统基于客户/服务器结构来实现客户端和服务端之间通过串口通信。
1。
2。
1TQ2440硬件平台简介
TQ2440是由广州天嵌计算机科技有限公司打造的一款开发板,如下图1.1所示。
其以稳定的性能,过硬的质量,丰富的扩展接口,优质的售后服务和技术支持,赢得众多企业的青睐和支持。
开创众多第一,引领嵌入式潮流。
图1.1
移植最新的Linux2.6。
30系统到TQ2440开发板,并配有相关移植教程。
将Nandflash升级为256MB(核心板Nandflash支持升级到1GB,SDRAM可扩展到128MB)。
推广开源的厂家,除了提供平台性软件,还免费提供厂家移植教程,并可在网上下载,非TQ2440的用户一样受益。
不断更新软件,提供Wince5.0/6.0原生BSP包,wince开发教程,QT开发教程等厂家一手的移植教程(并在不断更新)。
TQ2440硬件特性如下表所示。
TQ2440开发板底板
硬件特性
说明
串口
板载五线异步串行口(UART0),可外接串口扩展板引出另两个串口(UART1和UART2);WINCE和Linux均有三串口驱动。
网络接口
板载100MDM9000网卡,带联接和传输指示灯;
USB接口
USBHOST接口;USBDevice接口.
存储接口
一个SD卡接口,支持32GSD卡.
音频接口
采用芯片UDA1341,立体声音频输出,可录音。
LCD接口
集成了4线电阻式触摸屏接口;支持800×600、640×480、240×320、320×240等不同分辨率的TFTLCD,(目前实测最大的屏10。
4寸屏,800×600的分辨率),可接VGA转接板
Camera
130W像素摄像头(标配驱动),可支持AV信号视频输入或更高像素的摄像头
时钟源
内部实时时钟(带有后备锂电池)
调试Jtag
JTAG接口,支持ADS1.2,keil等软件的单步调试功能
复位电路
采用专业复位芯片811进行复位,稳定可靠
电源接口
高电流带载的5V电源供电,带电源开关指示灯
AD功能
可调电阻接到ADC引脚上用来验证模数转换
IIC功能
提供AT24C02的EEPROM验证IIC功能
蜂鸣器
测试PWM功能的蜂鸣器
用户按键
4个用户按键,使用外部中断
用户LED灯
4个用户LED灯,使用GPIO口控制
底板尺寸
105mm×128mm
1。
2。
2ARM简介
ARM(AdvancedRISCMachines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。
ARM是微处理器行业的一家知名企业,设计了大量高性能、廉价、耗能低的RISC处理器、相关技术及软件.技术具有性能高、成本低和能耗省的特点。
适用于多种领域,比如嵌入控制、消费/教育类多媒体、DSP和移动式应用等。
ARM将其技术授权给世界上许多著名的半导体、软件和OEM厂商,每个厂商得到的都是一套独一无二的ARM相关技术及服务。
利用这种合伙关系,ARM很快成为许多全球性RISC标准的缔造者。
1991年ARM公司成立于英国剑桥,主要出售芯片设计技术的授权.采用ARM技术知识产权(IP)核微处理器,即我们通常所说的ARM微处理器,已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场,基于ARM技术的微处理器应用约占据了32位RISC微处理器75%以上的市场份额,ARM技术正在逐步渗入到我们生活的各个领域。
ARM公司是专门从事基于RISC技术芯片设计开发的公司,作为知识产权供应商,本身不直接从事芯片生产,靠转让设计许可由合作公司生产各具特色的芯片,世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核,根据各自不同的应用领域,加入适当的外围电路,从而形成自己的ARM微处理器芯片.目前,全世界有几十家大的半导体公司都使用ARM公司的授权,因此既使得ARM技术获得更多的第三方工具、制造、软件的支持,又使整个系统成本降低,使产品更容易进入市场被消费者所接受,更具有竞争力。
ARM 微处理器一般具有如下特点:
(1)体积小、低功耗、低成本、高性能;
(2)支持 Thumb(16 位)/ARM(32 位)双指令集,能很好的兼容8/16 位器件;
(3)大量使用寄存器,指令执行速度更快;
(4)大多数数据操作都在寄存器中完成;
(5)寻址方式灵活简单,执行效率高;
(6)指令长度固定。
1。
2.3Linux系统简介
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
它能运行主要的UNIX工具软件、应用程序和网络协议。
它支持32位和64位硬件。
Linux继承了Unix以网络为核心的设计思想,它的基本思想有两点:
第一,一切都是文件;第二,每个软件都有确定的用途.其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核而言,都被视为拥有各自特性或类型的文件。
至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近,所以说它是一个性能稳定的多用户网络操作系统。
Linux操作系统诞生于1991年10月5日。
Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。
Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。
Linux一般有四个主要部分:
内核、Shell、文件结构和实用工具。
内核是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序。
它从用户那里接受命令并把命令送给内核去执行。
(2)LinuxShell
Shell 是系统的用户界面,提供了用户与内核进行交互操作的一种接口.它接收用户输入的命令并把它送入内核去执行。
实际上Shell 是一个命令解释器,它解释由用户输入的命令并且把它们送到内核.不仅如此,Shell 有自己的编程语言用于对命令的编辑,它允许用户编写由shell 命令组成的程序。
(3)Linux文件结构
文件结构是文件存放在磁盘等存储设备上的组织方法.主要体现在对文件和目录的组织上。
目录提供了管理文件的一个方便而有效的途径.我们能够从一个目录切换到另一个目录,而且可以设置目录和文件的权限,设置文件的共享程度。
使用Linux,用户可以设置目录和文件的权限,以便允许或拒绝其他人对其进行访问。
(4)Linux实用工具
标准的Linux系统都有一套叫做实用工具的程序,它们是专门的程序,例如编辑器、执行标准的计算操作等。
用户也可以产生自己的工具。
严格来讲,Linux这个词本身只表示Linux内核,但实际上人们已经习惯了用Linux来形容整个基于Linux内核,并且使用GNU工程各种工具和数据库的操作系统。
Linux的主要特性有以下几点:
(1)完全免费
Linux是一款免费的操作系统,用户可以通过网络或其他途径免费获得,并可以任意修改其源代码.这是其他的操作系统所做不到的。
正是由于这一点,来自全世界的无数程序员参与了Linux的修改、编写工作,程序员可以根据自己的兴趣和灵感对其进行改变,这让Linux吸收了无数程序员的精华,不断壮大.
(2)完全兼容POSIX1.0标准
这使得可以在Linux下通过相应的模拟器运行常见的DOS、Windows的程序。
这为用户从Windows转到Linux奠定了基础。
许多用户在考虑使用Linux时,就想到以前在Windows下常见的程序是否能正常运行,这一点就消除了他们的疑虑。
(3)多用户、多任务
Linux支持多用户,各个用户对于自己的文件设备有自己特殊的权利,保证了各用户之间互不影响。
多任务则是现在电脑最主要的一个特点,Linux可以使多个程序同时并独立地运行。
(4)良好的界面
Linux同时具有字符界面和图形界面.在字符界面用户可以通过键盘输入相应的指令来进行操作。
它同时也提供了类似Windows图形界面的X—Window系统,用户可以使用鼠标对其进行操作。
在X-Window环境中就和在Windows中相似,可以说是一个Linux版的Windows。
(5)支持多种平台
Linux可以运行在多种硬件平台上,如具有x86、680x0、SPARC、Alpha等处理器的平台。
此外Linux还是一种嵌入式操作系统,可以运行在掌上电脑、机顶盒或游戏机上.2001年1月份发布的Linux2.4版内核已经能够完全支持Intel64位芯片架构。
同时Linux也支持多处理器技术。
多个处理器同时工作,使系统性能大大提高。
1.3嵌入式串口通信的基本任务
通信接口的基本任务是:
(1)实现数据格式化:
因为来自CPU的是普通的并行数据,所以,接口电路应具有实现不同串行通信方式下的数据格式化的任务.在异步通信方式下,接口自动生成起止式的帧数据格式。
在面向字符的同步方式下,接口要在待传送的数据块前加上同步字符。
(2)进行串-并转换:
串行传送,数据是一位一位串行传送的,而计算机处理数据是并行数据。
所以当数据由计算机送至数据发送器时,首先把串行数据转换为并行数才能送入计算机处理。
因此串并转换是串行接口电路的重要任务。
(3)控制数据传输速率:
串行通信接口电路应具有对数据传输速率—-波特率进行选择和控制的能力。
(4)进行错误检测:
在发送时接口电路对传送的字符数据自动生成奇偶校验位或其他校验码.在接收时,接口电路检查字符的奇偶校验或其他校验码,确定是否发生传送错误。
(5)进行TTL与EIA电平转换:
CPU和终端均采用TTL电平及正逻辑,它们与EIA采用的电平及负逻辑不兼容,需在接口电路中进行转换。
(6)提供EIA-RS-232C接口标准所要求的信号线:
远距离通信采用MODEM时,需要9根信号线;近距离零MODEM方式,只需要3根信号线。
这些信号线由接口电路提供,以便与MODEM或终端进行联络与控制。
1。
4嵌入式串口通信协议及实现
串行端口的本质功能是作为CPU和串行设备间的编码转换器,一般微机内都配有通信适配器,使计算机能够与其他具有RS—232C串口的计算机或设备进行通信。
本系统主要目的是实现宿主机与目标机之间的近距离串行通信,采用的宿主机是PC机,而目标机是RAM架构的开发板。
本系统中目标机的开发板是ARM2410S,串口线采用常用的RS—232C型接口模式,能实现计算机与开发板间的数据传输与控制.嵌入式串口通信采用EIARS-232C标准。
2需求分析
2.1功能需求
本系统基于客户/服务器结构,ARM2410S嵌入式开发板作为被查询服务端,PC机为客户端。
客户端在Linux下开发,客户端和服务端之间通过串口进行通信,可查询相应的内容。
2.2性能指标
(1)串口通信协议:
PC与开发板通信报文基本格式如下:
其中:
头(header):
4个字节的0xff。
长度(len):
2个字节的信息长度,从信息类型开始,到信息内容结束,采用网络字节顺序
长度校验和(lcs):
1个字节的长度校验和。
len0+len1+lcs=0。
信息类型(type):
1个字节,0x02。
信息内容(data):
n字节的信息内容。
信息校验和(dcs):
1个字节的信息内容校验和.type+data0+data1+…+data(n—1)+dcs=0。
信息类型分配如下表所示:
0x00——查询
0x01--诊断(保留)
0x02——下载参数(保留)
PC发送给开发板的基本格式如下:
开发板反馈给PC的基本格式如下:
系统必须支持的查询命令如下表所示:
说明
命令字
响应字
说明
开发板ID设置
0x00
0x01
开发板唯一编号
开发板MAC地址设置
0x02
0x03
本机MAC地址
本机IP、掩码设置、网关IP设置
0x04
0x05
本机IP、掩码、网关设置
开发板密码设置
0x06
0x07
登录密码
网络连接方式设置
0x08
0x09
只允许下载局域网0x4c('L’)、或者GRPS0x47('G')两种方式
蜂鸣器开关设置
0x0a
0x0b
打开0x4e(’N')或者关闭0x46(’F')两种方式
LCD对比度设置
0x0c
0x0d
合法值在0x00~0x3f之间(供参考)
开发板CPU配置
0x0e
0x0f
芯片型号
(2)QT查询界面:
界面包括分类显示区域(含保留类型),每种查询表项可选择或者输入,其返回结果能正确显示到文本框。
(3)串口驱动程序实现。
3系统设计
3。
1系统功能设计
系统功能如下图3。
1所示.
图3。
1系统功能图
3.2通信流程设计
利用串口进行通信的流程图如下3。
2所示.
图3.2串口通信流程图
4详细设计
4。
1设置串口属性
1、保持原先串口设置
为了安全起见和以后调试程序方便,可以先保存原先串口的配置,在这里可以使用函数tcgetattr(fd,&old_cfg)。
该函数得到fd指向的终端的配置参数,并将它们保存于termios结构变量old_cfg中.该函数还可以测试配置是否正确、该串口是否可用等.若调用成功,函数返回值为0,若调用失败,函数返回值为-1,其使用如下所示:
if(tcgetattr(fd,&old_cfg)!
=0)
{
perror("tcgetattr”);return—1;
}
2、激活选项
CLOCAL和CREAD分别用于本地连接和接受使能,因此,首先要通过位掩码的方式激活这两个选项。
newtio.c_cflag|=CLOCAL|CREAD;
调用cfmakeraw()函数可以将终端设置为原始模式,在后面的实例中,采用原始模式进行串口数据通信。
cfmakeraw(&new_cfg);
3.设置波特率
设置波特率有专门的函数,用户不能直接通过位掩码来操作.设置波特率的主要函数有:
cfsetispeed()和cfsetospeed()。
这两个函数的使用很简单,如下所示:
cfsetispeed(&new_cfg,B115200);
cfsetospeed(&new_cfg,B115200);
一般地,用户需将终端的输入和输出波特率设置成一样的.这几个函数在成功时
返回0,失败时返回—1。
4.设置字符大小
特率不同,设置字符大小并没有现成可用的函数,需要用位掩码。
一般首先去除数据位中的位掩码,再重新按要求设置。
如下所示:
new_cfg.c_cflag&=~CSIZE;/*用数据位掩码清空数据位设置*/
new_cfg.c_cflag|=CS8;
5.设置奇偶校验位
校验位需要用到termios中的两个成员:
c_cflag和c_iflag。
首先要激活c_cflag中的校验位使能标志PARENB和是否要进行偶校验,同时还要激活c_iflag中的对于输入数据的奇偶校验使能(INPCK)。
无校验位,代码如下:
new_cfg。
c_cflag&=~PARENB;
校验时,代码如下所示:
new_cfg.c_cflag|=(PARODD|PARENB);
new_cfg.c_iflag|=INPCK;
而使能偶校验时,代码如下所示:
new_cfg.c_cflag|=PARENB;
new_cfg.c_cflag&=~PARODD;/*清除偶校验标志,则配置为奇校验*/
new_cfg.c_iflag|=INPCK;
6.设置停止位
设置停止位是通过激活c_cflag中的CSTOPB而实现的。
若停止位为一个,则清除CSTOPB,若停止位为两个,则激活CSTOPB.以下分别是停止位为一个和两个比特时的代码:
new_cfg。
c_cflag&=~CSTOPB;/*将停止位设置为一个比特*/
new_cfg。
c_cflag|=CSTOPB;/*将停止位设置为两个比特*/
7.设置最少字符和等待时间
在一般的情况下,可以设置设置为阻塞等待,直read到数据才返回
termios_new。
c_cc[VTIME]=0;
termios_new。
c_cc[VMIN]=4;
8.清除串口缓冲
由于串口在重新设置之后,需要对当前的串口设备进行适当的处理,这时就可调用在h>中声明的tcdrain()、tcflow()、tcflush()等函数来处理目前串口缓冲中的数据,它们的格式如下所示。
inttcdrain(intfd);/*使程序阻塞,直到输出缓冲区的数据全部发送完毕*/
inttcflow(intfd,intaction);/*用于暂停或重新开始输出*/
inttcflush(intfd,intqueue_selector);/*用于清空输入/输出缓冲区*/
本实例中使用tcflush()函数,对于在缓冲区中的尚未传输的数据,或者收到的,但是尚未读取的数据,其处理方法取决于queue_selector的值,它可能的取值有以下几种.
TCIFLUSH:
对接收到而未被读取的数据进行清空处理。
TCOFLUSH:
对尚未传送成功的输出数据进行清空处理。
TCIOFLUSH:
包括前两种功能,即对尚未处理的输入输出数据进行清空处理.
如在本例中所采用的是第一种方法:
tcflush(fd,TCIFLUSH);
9、激活配置
在完成全部串口配置之后,要激活刚才的配置并使配置生效.这里用到的函数是tcsetattr(),
它的函数原型是:
tcsetattr(intfd,intoptional_actions,conststructtermios*termios_p);
其中参数termios_p是termios类型的新配置变量.
参数optional_actions可能的取值有以下3种:
TCSANOW:
配置的修改立即生效。
TCSADRAIN:
配置的修改在所有写入fd的输出都传输完毕之后生效.
TCSAFLUSH:
所有已接受但未读入的输入都将在修改生效之前被丢弃。
该函数若调用成功则返回0,若失败则返回—1,代码如下所示:
if((tcsetattr(fd,TCSANOW,&new_cfg))!
=0)
{
perror("tcsetat