基于QT的串口通信程序设计

2020-01-18 05:51郑忠楷蒋学程罗志灶
电子技术与软件工程 2019年24期
关键词:波特率窗体控件

文/郑忠楷 蒋学程 罗志灶

Qt是一个跨平台的C++图形用户界面应用程序框架。它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能。Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程.由挪威TrollTech公司出品,开放源代码,完全面向对象,模块化程度高,可重用性好,容易扩展,允许真正的组件编程,提供了信号/槽机制,替代回调函数,使组件间信号信号传递更安全、简单,应用非常广泛。QT还提供了多个C++类;Qt对各个模块进行了良好的封装,使各模块可重用性较好;优良的跨平台特性,使用Qt类编写的程序可以实现“一次编码,到处编译”,极大的降低了跨平台开发的难度;支持Windows,Linux,Solaris,Su-nOS,FreeBSD,BSD/OS,SCO,AIX,OS390,QNX 等操作系统,面向对象很容易扩展。Qt 提供了一种称为signals/slots 的安全类型来替代callback,具有良好的封装机制,可重用性较好。同时包含近700API类库,允许真正的组件编程,是一种开源软件,使用起来简便且高效,具有良好的可移植性,目前主流的具有移植性的GUIAPI开发包有miniGUI,Qt,OpenGUI。但是在自动化应用程序开发时,QT忘记提供给应用程序开发者一个很重要的工具—串口类,毕竟大多数单片机还是使用串口和上位机软件完成通信的。在MFC/BorlandC的可视化程序开发工具里有都提供一个标准串口的控件,使我们十分快捷方便的开发出串口应用程序。因此我们有必要讨论一下如何在QT Creator下进行串口应用程序的开发。

图1

1 串行通信简介

在数字信号传输中只有 “1”和“0”,从电平上而言也就是只有 “高电平”、“低电平”;这些“高电平”、“低电平”如果一块儿同时在多根导线上传输,同时组成1组二进制数,那就是我们所说的并行传输;并行传输具有同时多个位的特点,但是在远距离通信、无线通信上;由于物理条件的限制,我们目前还是大量采用串行传输;也就是把“1”和“0”逐个排列组成一串有序的序列进行传输。因为,从上面所说的可以看出,并行传输需要的线材多,不能无线通信,而且关键的一点是 — 多根线材及各自的分布参数决定了它们的每位延时特性不能完全一致,这在高速数据传输时是不能绕开的一个大缺点。因此实际应用中出现了串行通信方式。

图2:窗口设计结构

图3

1.1 同步串行

采用串行通信时,每一位何时采样--何时确定它是“1”和“0”就很关键;如果我们在传输“1”和“0”的同时传输一个时钟信号,标明它的时间,这样的串行传输我们就把它叫做同步传输,常见的有 SPI、I2C等协议。

图1为同步串口时序——利用同时传输的时钟(下降沿、粗点划线时刻)确定每位何时采样——何时确定它是“1”和“0”。

1.2 异步串行

我们也可以预先约定好——每隔固定的时间间隔传输不同的位,利用一个序列的“1”和“0”他们各自所在的时间位置自身来确定它的时间点,这样的串行传输我们就把它叫做异步传输,如RS232/RS485协议,那这样为了我们在接收端能很好的与发送端时间一致,我们就要约定一个固定的时间间隔——这就叫做波特率——每秒传送了多少个位,它的单位是bps(每秒发送多少位)。 相比于同步串行通信,异步串行通信不需要传输同步时钟,又具有较好的抗干扰能力,这在通信端口有限或者远距离传输时能够 较好的节省资源。异步串行通信中非常重要的一点就是波特率的约定,因为异步通信没有单独用于传输时钟信号的连接线,收发端对于每位“1”和“0”占用的时间要有着十分明确的规定—波特率。同时,在PC上通用异步串行口有着专门的一个地址“串口号”—用来区分多个UART口,常见的有 “UART0”~ “UART15”。具体每台计算机的“串口号”分配我们可以从“桌面”-“我的电脑”-“右键”-“属性”-“设备管理器”-“端口(COM)”中看到。

2 QT下对异步串行口的编程

2.1 文件准备

因为在QT Creator中不像在MFC/BorlandC的可视化程序开发工具中有现成的API控件可以供异步串口使用,所以我们需要自行准备额外的一些辅助文件,这些文件可以从https://sourceforge.net/projects/qextserialport/files/下载 ;在windoews平台下需要以下六个文件:qextserialbase.cpp、qextserialbase.h、qextserialport.cpp、qextserialport.h、win_qextserialport.cpp、win_qextserialport.h。下载好文件后把它们统一拷贝到QT即将建立工程的文件夹--即“当前文件夹”下。

2.2 窗体设计

打开QT Creator选择新建一个工程,具体可以根据用户需要选择是“窗体应用程序”还是“控制台应用程序”。目前我们大多数情况下选择开发“窗体应用程序”便于用户操作。在左侧“项目”的“源文件”和“头文件”中对应添加刚才下载的六个文件,然后再在界面文件“.ui”上添加一个“spinBox”控件 和3个“PushButton”控件 ,分别用于选择等下将要控制的“串口号”和“打开”、“ 关闭”串口;以及发送数据。 接着再在窗体上添加“textBrowser”、“ textEdit”两个控件用于显示接收到的串口信息和编辑准备发送的串口信息。如图2所示。

2.3 程序编写

随后我们就可以在主文件 “mainwindow.h”中添加#include "win_qextserialport.h",添加槽函数声明 void readMyCom();在主文件中“mainwindow.cpp” 添加对象声明Win_QextSerialPort *myCom; struct PortSettings myComSetting = {BAUD9600,DATA_8,PAR_NONE,STOP_1,FLOW_OFF,500};修改“打开”按钮控件的槽函数了,在其中编写

//信号和槽函数关联,当串口缓冲区有数据时,进行读串口操作(如图3)。

这样成功打开串口后QT程序会给出一个对话框让用户确认打开了“串口7”。

我们可以通过修改myComSetting中的参数来修改诸如“波特率”、“数据位”、“校验位”、“停止位”、“硬件流控制”、“延时”等等具体的串口参数,以便调整有关串口的其他的应用程序开发;例如BAUD9600表示波特率设定为9600,DATA_8表示数据位为8位,PAR_NONE表示没有采用寄偶校验位,FLOW_OFF表示关闭硬件流控制,500表示延时500ms。同时, 修改主文件“mainwindow.cpp”中”发送”按钮的槽函数如下:

myCom->write(ui->textEdit->text().toAscii()); //把文本编辑器内容发送到串口

增加主文件“mainwindow.cpp”中一个接收串口消息槽函数如下:

这样就可以在接收端显示接收到的文本信息了。

图4

图5

3 上机实验

右键点击“我的电脑”-“属性”-“设备管理器”可以看到如图4所示界面。

从中我们可以得知计算机上被我们使用“USB-串口”设备的方式,即通过采用PL2303芯片组的方式添加了2个串口,串口号分别是“COM4”和“COM6”。我们将“COM4”和“COM6”设备的“TX”线和“RX”线分别互相连接,再在2个应用程序中分别打开“COM4”和“COM6”,然后在一个程序的发送端文本编辑栏输入想要发送的文本,点击“发送”按钮,另外一个程序的接收端就得到了以下的结果;说明程序的串口收发已经实现。我们还可以通过内部赋值的方式给发送端送出其他的数据,用此方法完成“计算机”-“串口”-“单片机”的上位机和下位机通信。如图5所示。

4 小结

本次实验编程过程简单,实现方便,粗略实现了PC机的串口编程通信,完成了串口的“串口号选择”、“串口基本参数的设置”、“串口数据的收发”等基本功能,在此基础之上可以修改适应用户的不同需求,从而实现“计算机”-“串口”-“单片机”的一些常用通信。适合一些“上位机”-“下位机”架构的自动化仪器仪表设备推广应用。

猜你喜欢
波特率窗体控件
试谈Access 2007数据库在林业档案管理中的应用
基于FPGA的异步串行通信波特率容错设计
ASP.NET服务器端验证控件的使用
巧设WPS窗体控件让表格填写更规范
C*Core芯片SCI串口波特率容限优化
计算机多设备接口波特率不匹配的研究
WinCE.net下图形用户界面的开发
Spreadsheet控件在Delphi数据库系统中的编程与应用