基于QT设计的串口通信系统实验报告

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

串口通信系统
姓名:马亮
学院:电气与信息工程学院专业班级:物联网工程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等均是嵌入式系统的典型代表.
目录
摘要 (I)
前言............................................................... I I 目录.............................................................. I II 1 嵌入式串口通信概述 (1)
1.1嵌入式串口通信的原理 (1)
1.2嵌入式串口通信的开发工具 (1)
1.2。

1 TQ2440硬件平台简介 (2)
1.2。

2 ARM简介 (3)
1.2.3 Linux系统简介 (4)
1。

3嵌入式串口通信的基本任务 (6)
1。

4嵌入式串口通信协议及实现 (7)
2 需求分析 (8)
2。

1功能需求 (8)
2.2性能指标 (8)
3 系统设计 (10)
3.1系统功能设计 (10)
3。

2通信流程设计 (10)
4 详细设计 (12)
4.1设置串口属性 (12)
4。

2客户端Q T设计 (15)
4。

2.1 报文格式 (15)
4.2.2部分操作函数 (15)
5 系统调试及测试 (20)
5。

1功能实现情况 (20)
5。

2各性能指标完成情况 (23)
表5-1串口通信功能完成情况表 (23)
6 总结 (24)
7 致谢 (25)
8 参考文献 (26)
1 嵌入式串口通信概述
所谓串口通信,是指外设和计算机间使用一根数据信号线(另外需要地线),数据在一根数据信号线上一位一位地进行传输,每一位数据都占据一个固定的时间长度。

串口传输是二进制代码序列在一条信道上以位为单位,按时间顺序且按位传输的通信方式。

串行传输时,发送端按位发送,接收端按位接受,同时还要对所传输的位加以确认,所以收发双方要采用同步措施,否则接收端将不能正确区分出所传输的数据。

串口通信不但能实现计算机与嵌入式开发板之间的数据传输,而且还能实现计算机对嵌入式开发板的控制。

若采用普通单片机,对外部设备的访问就需要利用复杂的汇编语言或者使用C51自己编写设备的初始化以及读写访问程序,这样的过程不仅复杂,而且不太利于大规模的开发与设计。

ARM与普通单片机相比,具有开发简单、灵活,而且性能稳定、功能易于扩展等一系列的优势,因而在各个领域的嵌入式系统中得到广泛的应用。

将Linux移植到ARM嵌入式处理器后,可以利用操作系统中提供的系统调用把串口及其他外设当成普通文件进行操作,读写方便,在进行相对应的开发时可以提高系统编程效率,而且还可以简化调试的复杂程度.
1.1嵌入式串口通信的原理
串行端口的本质功能是作为CPU和串行设备间的编码转换器.当数从CPU经过串行端口发送出去时,字节数据转换为串行的位.在接收数据时,串行的位被转换为字节数据。

串口是系统资源的一部分,应用程序要使用串口进行通信,必须在使用之前向操作系统提出申请打开串口,通信完成后必须释放资源,即关闭串口.
1.2嵌入式串口通信的开发工具
此次开发采用的硬件平台是以TQ2440为平台,ARM2410S嵌入式开发板作为被查询服务端,PC机为客户端和C语言来实现本次系统的开发。

客户端在Linux
下开发,系统基于客户/服务器结构来实现客户端和服务端之间通过串口通信。

1。

2。

1 TQ2440硬件平台简介
TQ2440是由广州天嵌计算机科技有限公司打造的一款开发板,如下图1.1所示。

其以稳定的性能,过硬的质量,丰富的扩展接口,优质的售后服务和技术支持,赢得众多企业的青睐和支持。

开创众多第一,引领嵌入式潮流。

图1.1
移植最新的Linux 2.6。

30 系统到TQ2440 开发板,并配有相关移植教程。

将Nandflash 升级为256MB(核心板Nandflash支持升级到1GB,SDRAM 可扩展到128MB)。

推广开源的厂家,除了提供平台性软件,还免费提供厂家移植教程,并可在网上下载,非TQ2440 的用户一样受益。

不断更新软件,提供Wince 5.0/6.0原生BSP 包,wince 开发教程,QT 开发教程等厂家一手的移植教程(并在不断更新)。

TQ2440硬件特性如下表所示。

TQ2440开发板底板
硬件特性说明
串口板载五线异步串行口(UART0),可外接串口扩展板引出另两个串口(UART1和UART2);WINCE和Linux均有三串口驱动。

网络接口板载100M DM9000网卡,带联接和传输指示灯;USB接口USB HOST接口;USB Device接口.
存储接口一个SD卡接口,支持32 G SD卡.
1。

2。

2 ARM简介
ARM(Advanced RISC Machines),既可以认为是一个公司的名字,也可以认为是对一类微处理器的通称,还可以认为是一种技术的名字。

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.3 Linux系统简介
Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX
和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。

它能运行主要的UNIX工具软件、应用程序和网络协议。

它支持32位和64位硬件。

Linux继承了Unix以网络为核心的设计思想,它的基本思想有两点:第一,一切都是文件;第二,每个软件都有确定的用途.其中第一条详细来讲就是系统中的所有都归结为一个文件,包括命令、硬件和软件设备、操作系统、进程等等对于操作系统内核
而言,都被视为拥有各自特性或类型的文件。

至于说Linux是基于Unix的,很大程度上也是因为这两者的基本思想十分相近,所以说它是一个性能稳定的多用户网络操作系统。

Linux操作系统诞生于1991 年10 月5 日。

Linux存在着许多不同的Linux版本,但它们都使用了Linux内核。

Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。

Linux一般有四个主要部分:内核、Shell、文件结构和实用工具。

内核是系统的心脏,是运行程序和管理像磁盘和打印机等硬件设备的核心程序。

它从用户那里接受命令并把命令送给内核去执行。

(2)Linux Shell
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月份发布的Linux 2.4版内核已经能够完全支持Intel 64位芯片架构。

同时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型接口模式,能实现计算机与开发板间的数据传输与控制.嵌入式串口通信采用EIA RS-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的基本格式如下:
命令结果
响应字
系统必须支持的查询命令如下表所示:
(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.清除串口缓冲
由于串口在重新设置之后,需要对当前的串口设备进行适当的处理,这时就可调用在<termios。

h>中声明的 tcdrain()、tcflow()、tcflush()等函数来处理目前串口缓冲中的数据,它们的格式如下所示。

int tcdrain(int fd); /* 使程序阻塞,直到输出缓冲区的数据全部发送完毕*/
int tcflow(int fd, int action) ; /* 用于暂停或重新开始输出*/ int tcflush(int fd, int queue_selector); /*用于清空输入/输出缓冲区*/
本实例中使用 tcflush()函数,对于在缓冲区中的尚未传输的数据,或者收到的,但是尚未读取的数据,其处理方法取决于 queue_selector 的值,它可能的取值有以下几种.
TCIFLUSH:对接收到而未被读取的数据进行清空处理。

TCOFLUSH:对尚未传送成功的输出数据进行清空处理。

TCIOFLUSH:包括前两种功能,即对尚未处理的输入输出数据进行清空处理.
如在本例中所采用的是第一种方法:
tcflush(fd, TCIFLUSH);
9、激活配置
在完成全部串口配置之后,要激活刚才的配置并使配置生效.这里用到的函数是tcsetattr(),
它的函数原型是:
tcsetattr(int fd, int optional_actions,const struct termios*termios_p);
其中参数 termios_p 是 termios 类型的新配置变量.
参数 optional_actions 可能的取值有以下 3 种:
TCSANOW:配置的修改立即生效。

TCSADRAIN:配置的修改在所有写入 fd 的输出都传输完毕之后生效. TCSAFLUSH:所有已接受但未读入的输入都将在修改生效之前被丢弃。

该函数若调用成功则返回 0,若失败则返回—1,代码如下所示: if ((tcsetattr(fd, TCSANOW, &new_cfg)) != 0)
{
perror("tcsetattr”);
return —1;
}
4。

2 客户端Qt设计
4。

2。

1 报文格式
PC与开发板通信报文基本格式:
struct Message{
QByteArray Header;
QByteArray Len;
QByteArray Lcs;
QByteArray Infotype;
Info Infodata;
QByteArray Dcs;
};
PC发送给开发板的基本格式:
struct Info{
QByteArray Cmmd;
QByteArray Data;
};
4.2。

2 部分操作函数
(1)绑定发送选项的radiobutton 的click信号到 Check槽函数
connect(ui-〉Id_check,SIGNAL(clicked()),this,SLOT(Check()));
connect(ui-〉Ip_check,SIGNAL(clicked()),this,SLOT(Check()));
connect(ui-〉Mac_check,SIGNAL(clicked()),this,SLOT(Check()));
connect(ui—〉Passwd_check,SIGNAL(clicked()),this,SLOT(Check()));
connect(ui-〉Net_check,SIGNAL(clicked()),this,SLOT(Check()));
connect(ui->Buzzer_check,SIGNAL(clicked()),this,SLOT(Check()));
connect(ui—>Cpu_check,SIGNAL(clicked()),this,SLOT(Check()));
connect(ui->Lcd_check,SIGNAL(clicked()),this,SLOT(Check()));
(2)将发送选项加入到buttonGroup中并绑定.
buttonGroup。

addButton(ui—〉Id_check,0);
buttonGroup.addButton(ui—>Mac_check,1);
buttonGroup。

addButton(ui-〉Ip_check,2);
buttonGroup.addButton(ui—>Passwd_check,3);
buttonGroup.addButton(ui—〉Net_check,4);
buttonGroup。

addButton(ui—〉Buzzer_check,5);
buttonGroup。

addButton(ui->Lcd_check,6);
buttonGroup。

addButton(ui-〉Cpu_check,7);
(3)在Check槽函数中,根据选择的发送选项设置,定义要发送的msg中的cmmd命令字。

void MainWindow::Check(){
data.Data。

clear();
switch(buttonGroup。

checkedId()){
case 0:
msg。

Infodata.Cmmd[0]=0x01;
qDebug()〈〈QString::fromLocal8Bit("0”);
break;
case 1:
msg。

Infodata。

Cmmd[0]=0x02;
qDebug() 〈< QString::fromLocal8Bit("1");
break;
case 2:
msg。

Infodata.Cmmd[0]=0x04;
qDebug()<< QString::fromLocal8Bit(”2”);
break;
case 3:
data。

Cmmd[0]=0x06;
qDebug()<< QString::fromLocal8Bit(”3");
break;
case 4:
data.Cmmd[0]=0x08;
qDebug()〈〈QString::fromLocal8Bit("4”);
break;
case 5:
msg。

Infodata。

Cmmd[0]=0x0a;
qDebug()<〈QString::fromLocal8Bit("5”);
break;
case 6:
data.Cmmd[0]=0x0c;
qDebug() 〈〈QString::fromLocal8Bit(”6");
break;
case 7:
msg。

Infodata.Cmmd[0]=0x0e;
qDebug() 〈〈QString::fromLocal8Bit(”7");
break;
}

(4)发送按钮按下后,填充mess字符串,通过串口发送void MainWindow::on_pushButton_send_clicked()

msg。

Header。

resize(4);
msg.Len.resize(2);
msg。

Lcs。

resize(1);
type.resize(1);
msg。

Infodata.Cmmd。

resize(1);
msg。

Dcs。

resize(1);
msg.Header[0]=0xff;
msg。

Header[1]=0xff;
msg。

Header[2]=0xff;
msg.Header[3]=0xff;
msg。

Len[0]=0xaa;
msg。

Len[1]=0xbb;
msg.Lcs[0]=0—msg.Len[0]-msg。

Len[1];
msg。

Infotype[0]=0x02;
msg。

Dcs[0]=0xff;
data.Data.append(ui->lineEdit_send-〉text()。

toLatin1());
mess。

append(msg.Header);
mess。

append(msg.Len);
mess。

append(msg。

Lcs);
mess。

append(type);
mess.append(data。

Cmmd);
mess.append(data.Data);
mess.append(msg。

Dcs);
mess.append(’\r’);
mSerialPort—>write(mess);//向串口写入数据
msg。

Infodata.Data。

clear();
mess。

clear();
}
(5)开发板端对接受的数据进行解析,并且回传数据. while(1)
{
U8 idx;
Uart_Printf("\nPlease select function :\n");
Uart_GetString(buff);
cmmd=buff[8];
if(strlen(buff)==10){
switch(cmmd){
case 0x01:
Uart_Printf("\nID:”);
Uart_Printf("%s\n”,id);
break;
case 0x02:
Uart_Printf("\nMac:");
Uart_Printf("MacAddress");
break;
case 0x0a:
Beep(2000,100);
break;
case 0x06:
Uart_Printf(”\nPassWord:”);
Uart_Printf(”%s\n”,passwd);
break;
default:
break;
}
}else{
switch(cmmd){
case 0x01:
Uart_Printf(”\nNewID:”);
strncpy(id,buff+9,strlen(buff));
id[strlen(id)-1]=0;
Uart_Printf("%s\n”,id);
break;
case 0x02:
Uart_Printf("\nMac:”);
Uart_Printf(”MacAddress");
break;
case 0x06:
Uart_Printf(”\nNewPassWord:");
strncpy(passwd,buff+9,strlen(buff));
id[strlen(passwd)—1]=0;
Uart_Printf(”%s\n”,passwd);
break;
case 0x0a:
Beep(2000, 100);
break;
default:
break;

}
}
5 系统调试及测试
5.1 功能实现情况
(1)在Qt中对界面的设计如下图5.1所示,在该界面上可选择发送的查询选项,也可输入发送数据并发送到开发板上,在显示框上可以看到开发板反馈的信息。

图5.1 初始化界面
(2)查询开发板ID,在发送选项中选择“开发板ID”,点击“发送”到开发板上,界面显示开发板ID为“ID:tq2440bord0001",如下图5.2所示。

图5。

2
(3)查询开发板ID,在发送选项中选择“开发板ID”,输入发送数据“test”,点击“发送”到开发板上,界面显示开发板ID为“NewID:test”,如下图5。

3所示.
图5.3
(4)查询开发板密码,在发送选项中选择“开发板密码”,点击“发送"到开发板上,界面显示开发板密码为“PassWord:123456”,如下图5.4所示。

图5。

4获取密码
(5)查询开发板密码,在发送选项中选择“开发板密码”,输入发送数据“passwd”,点击“发送"到开发板上,界面显示开发板ID为“NewPassWord:passwd”,如下图5。

5所示。

图5.5设置密码
(6)选择“蜂鸣器开关”,发送到开发板上时。

会听到蜂鸣器鸣叫0.1秒。

5。

2各性能指标完成情况
表5—1 串口通信功能完成情况表
6 总结
这次的嵌入式Linux应用与开发我做的是串口通信实验,易军老师给我们讲课的时候,很认真很仔细,在我们犯困注意力你集中的时候老师都会提醒我们,即使这样我也觉得自己可能在这门课程的学习上可能学得还不是很好,所以在这次的大作业上,我遇到了许多问题,感觉要完整的做出来一个实验真难.不过好在有老师和同学的帮助,老师也在很早之前就开始给我们讲了大作业题目,让我们有足够的时间消化并构思设计实验方案.
串口通信实验,就如它的名称一样,我从中所学到的最多的知识就是关于串口及相关的配置、设置属性等方面。

感觉以前都只能算是了解它,在实验中的运用才会说是主动去熟悉学习它,感觉学到了很多知识,也是非常开心的。

到最后截止答辩时,我的实验卡在很小的一个点上,老师通情达理的让我延迟一天再答辩,并且详细询问了我遇到的问题,提出了建议,并且对我给予了鼓励,当天晚上我终于实现了大作业要求的功能。

学习是一个逐渐积累的过程,到最后你会发现它是有一定规律的。

老师让我们在课堂上练习的每个知识点到最后其实在大作业中都有可能会用到,所以说大作业是一个综合考验我们本学期学习成果的一个实验,虽然会遇到很多问题,出现许多的错误,但我们的成长不就是在错误中积累的吗,从中所犯的错让我又从头再学习了一遍之前的知识,感觉很充实。

相关文档
最新文档