QT学习笔记2:简单的串口工具

上一篇内容介绍了初始Qt,不依赖Qt提供的模板框架,自己创建一个空的Qt项目。

本篇中,通过实际的小例子来熟悉一下Qt的使用 —— 串口工具。

1. 页面布局

(1)首先创建一个空的Qt项目

  可以参考:http://www.cnblogs.com/hancq/p/5741932.html。这里不再详述。

(2)项目需求

  —— 实现串口打开/关闭;

  —— 实现串口配置参数设置;

  —— 实现串口数据接收、显示;

  —— 实现串口数据发送。

  本项目在设计时,以熟悉Qt使用为目的,串口工具的功能力求简洁实用。

  在后续的学习和开发中,可以逐步完善。

(3)Qt页面部件设计

  完成效果图如下所示,可以根据个人喜好做相应调整。

  总体采用格点布局,将整个页面分为左右两部分。

  左半边,又分为上(打开、关闭按钮)、中(参数配置)、下(其它扩展操作部件)。

  右半边,又分为上(显示文本框)、中(发送数据输入文本框)、下(发送按钮)。

  初始化设置布局代码:

1     QGridLayout *layout = new QGridLayout();
2     layout->addLayout(openAndCloseBtn(), 0, 0, 1, 1);
3     layout->addWidget(serialPortParamSettings(), 1, 0, 1, 1);
4     layout->addLayout(extraConfig(), 2, 0);
5     layout->addWidget(showTextEdit, 0, 1, 3, 6);
6     layout->addWidget(inputLineEdit, 7, 1, 1, 6);
7     layout->addWidget(sendBtn, 9, 6, 1, 1);
8
9     setLayout(layout);

2. 串口参数配置

(1)获取串口参数信息

  Qt库提供了串口操作相关的类 QSerialPortInfo : 串口信息类

                  QSerialPort : 串口相关操作类

  通过foreach语句,向系统查询串口信息:

 1     foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
 2     {
 3         qDebug() << "Name        : " << info.portName();
 4         qDebug() << "Description : " << info.description();
 5         qDebug() << "Manufacturer: " << info.manufacturer();
 6
 7         // Example use QSerialPort
 8         QSerialPort serial;
 9         serial.setPort(info);
10         if (serial.open(QIODevice::ReadWrite))
11         {
12             qDebug() << "Name        : add " << info.portName();
13             com->addItem(info.portName());
14             serial.close();
15         }
16     }

  获取到系统资源后,尝试打开串口,若串口打开成功,将串口号添加到参数配置部件中,然后关闭串口。

  通过此操作,可以查询到当前系统所有可用的串口号。

  此操作在初始化时获取一次,为了方便动态调整串口信息,增加一个刷新串口号的按钮,手动获取。

(2)串口参数配置

  串口参数包括串口号(自动获取)、波特率、数据位、校验位、停止位。

 1     QGroupBox *groupBox = new QGroupBox();
 2     QFormLayout *layout = new QFormLayout();
 3     com = new QComboBox();
 4     baudRate = new QComboBox();
 5     dataBit = new QComboBox();
 6     parity = new QComboBox();
 7     stopBit = new QComboBox();
 8
 9     QStringList baudList;
10     QStringList parityList;
11     QStringList dataBitsList;
12     QStringList stopBitsList;
13
14     /* baud rate */
15     baudList<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"
16           <<"14400"<<"19200"<<"38400"<<"56000"<<"57600"
17          <<"76800"<<"115200"<<"128000"<<"256000";
18     baudRate->addItems(baudList);
19     baudRate->setCurrentIndex(11);
20
21     /* parity */
22     parityList<<"无"<<"奇"<<"偶";
23     parity->addItems(parityList);
24     parity->setCurrentIndex(0);
25
26     /* data bits */
27     dataBitsList<<"5"<<"6"<<"7"<<"8";
28     dataBit->addItems(dataBitsList);
29     dataBit->setCurrentIndex(3);
30
31     /* stop bits */
32     stopBitsList<<"1"<<"1.5"<<"2";
33     stopBit->addItems(stopBitsList);
34     stopBit->setCurrentIndex(0);
35
36     /* vertical layout */
37     layout->setAlignment(Qt::AlignCenter);
38     layout->addRow(new QLabel(tr("串口号")), com);
39     layout->addRow(new QLabel(tr("波特率")), baudRate);
40     layout->addRow(new QLabel(tr("校验位")), parity);
41     layout->addRow(new QLabel(tr("数据位")), dataBit);
42     layout->addRow(new QLabel(tr("停止位")), stopBit);
43
44     /* group box */
45     groupBox->setTitle(tr("参数设置"));
46     groupBox->setLayout(layout);

  此处使用groupBox部件,使用表单布局,将串口的参数加入到设置中去。效果如界面所示。

3. 串口相关操作

(1)打开/关闭串口

  串口操作包括串口打开、关闭和串口参数设置。

  在串口打开成功后,启动一个定时器,定时读取串口接收到的数据。

  串口打开槽函数:

 1 void Widget::openBtnClicked(void)
 2 {
 3     qDebug() << "Open serial port";
 4     serial = new QSerialPort();
 5     serial->setPortName(com->currentText());
 6     if (serial->open(QIODevice::ReadWrite)) {
 7         openBtn->setEnabled(false);
 8         closeBtn->setEnabled(true);
 9         sendBtn->setEnabled(true);
10     }
11
12     serial->setBaudRate(baudRate->currentText().toInt());
13     serial->setDataBits((QSerialPort::DataBits)dataBit->currentText().toInt());
14     serial->setStopBits((QSerialPort::StopBits)stopBit->currentIndex());
15     serial->setParity((QSerialPort::Parity)parity->currentIndex());
16     serial->setFlowControl(QSerialPort::NoFlowControl);
17
18     timer = new QTimer();
19     connect(timer, SIGNAL(timeout()), this, SLOT(upgradeRecvData()));
20     timer->start(200);
21 }

  串口关闭槽函数:

 1 void Widget::closeBtnClicked(void)
 2 {
 3     qDebug() << "Close serial port";
 4     if (timer != NULL) {
 5         qDebug() << "timer";
 6         timer->stop();
 7     }
 8
 9     if (serial != NULL) {
10         qDebug() << "serial";
11         serial->close();
12         delete serial;
13         serial = NULL;
14     }
15
16     openBtn->setEnabled(true);
17     closeBtn->setEnabled(false);
18     sendBtn->setEnabled(false);
19 }

(2)串口数据接收/发送

  定时器时间到,读取串口接收懂啊的数据,显示在文本框中。

  此处简易的串口工具,没有设置显示的最大缓冲区、保存日志等操作,可自行完善。

  在串口发送数据后,自动增加一个换行,方便命令输入的使用。

  数据接收和显示的槽函数:

1 void Widget::upgradeRecvData(void)
2 {
3     recvData = serial->readAll();
4     if (recvData != NULL) {
5         showTextEdit->append(recvData);
6     }
7
8     recvData.clear();
9 }

  数据发送的槽函数:

1 void Widget::sendBtnClicked(void)
2 {
3     QByteArray buf = inputLineEdit->text().toLocal8Bit();
4     serial->write(buf);
5     serial->write("\n");
6     inputLineEdit->clear();
7 }

源码下载:

  链接:http://pan.baidu.com/s/1eSbSrU6 密码:zmhl

时间: 2024-08-01 18:22:10

QT学习笔记2:简单的串口工具的相关文章

Qt学习笔记-设计简易的截图工具软件

现在利用Qt来实现一个截图软件. 首先,设计一个界面出来. 最上面有一个label用来显示图片. 然后使用QPixmap中的静态函数grabWindow来获取图片.这里需要一个winID.可以使用 QApplication::desktop()->winId() 来获取. 同时包含了保存图片的功能.默认保存在应用程序所在目录. 代码已上传到github https://github.com/qq2216691777/shotscreen

加壳学习笔记(三)-简单的脱壳思路&amp;调试思路

首先一些windows的常用API: GetWindowTextA:以ASCII的形式的输入框 GetWindowTextW:以Unicaode宽字符的输入框 GetDlgItemTextA:以ASCII的形式的输入框 GetDlgItemTextW:以Unicaode宽字符的输入框 这些函数在使用的时候会有些参数提前入栈,如这函数要求的参数是字符串数目.还有大小写啦之类的东西,这些东西是要在调用该函数之前入栈,也就是依次push,就是说一般前面几个push接着一个call,那前面的push可能

【Qt学习笔记】13.拖放技术:Drag & Drop

1.接受拖放 Drag & Drop 是一个界面操作,用于在两个窗口间传递数据. Drag Source: 拖放源窗口 Drag Target: 拖放目标窗口 拖放操作: 1.在源窗口:选中目标,按下鼠标,移动,拖至目标窗口(Drag) 2.在目标窗口:取消鼠标,到指定位置,松开鼠标(Drop) (按下ESC取消操作) MIME: MIME(Multipurpose Internet Mail Extensions)被传递的数据以MIME格式传送,它是多组type-data数据:(type0,

qt学习笔记(五) QGraphicsPixmapItem与QGraphicsScene的编程实例 图标拖动渐变效果

应大家的要求,还是把完整的project文件贴出来,大家省点事:http://www.kuaipan.cn/file/id_48923272389086450.htm 先看看执行效果,我用的群创7寸屏,主机是mini2440,分辨率是800*480,程序写比較粗糙,但对刚開始学习的人还是有一点启示,大家一起进步. qt中提供了QGphicsView,QGraphicsScene,QGraphicsItem,QGraphicsPixmapItem是QGraphicsItem的子类 分辨创建它们的实

Sharepoint2013商务智能学习笔记之简单概述(一)

SharePoint 2013 中的商业智能 (BI) 提供集 Microsoft Office 应用程序和其他 Microsoft 技术于一体的全面的 BI 工具.这些 BI 工具有:Excel 2013.SharePoint 2013 中的 Excel Services.SharePoint Server 2013 中的 PerformancePoint Services.SharePoint 中的 Visio Services.SharePoint 2013 和 Microsoft SQL

node.js在windows下的学习笔记(2)---简单熟悉一些命令

1.打开如下的安装 2.输入node -v,显示node的版本号 3.输入node --help.显示帮助命令 4.自己用一个文本编辑器编写一下代码,保存为text.js,然后在控制台输入node.exe  text.js的路径(直接把这个js文件拖到控制台自动显示路径),按下回车键 var http = require("http"); http.createServer(function(request, response) { response.writeHead(200, {&

Node.js学习笔记(3) - 简单的curd

这个算是不算完结的完结吧,前段时间也是看了好久的Node相关的东西,总想着去整理一下,可是当时也没有时间: 现在看来在整理的话,就有些混乱,自己也懒了,就没在整理,只是简单的记录一下 一.demo的简单介绍 这次demo,只涉及到简单的curd操作,用到的数据库是mongo,所以要安装mongo数据库,数据库连接驱动是mongoose: 当然关于mongo的驱动有很多,比如mongous mongoskin等:(详见http://cnodejs.org/topic/4f4ca8e0940ce2e

STM32学习笔记(四)——串口控制LED(中断方式)

目录: 一.时钟使能,包括GPIO的时钟和串口的时钟使能 二.设置引脚复用映射 三.GPIO的初始化配置,注意要设置为复用模式 四.串口参数初始化配置 五.中断分组和中断优先级配置 六.设置串口中断类型并使能串口中断 七.编写中断服务函数函数名格式为函数名格式为 USARTxIRQHandler(x 对应串口号). 八.主函数的实现. 一.时钟使能,包括GPIO的时钟和串口的时钟使能 RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE); //

QT学习笔记—1

1.模态和非模态的区别:非模态可以同时操作两个窗口,模态的只能在顶层窗口关闭之后才能使用其他窗口 //同时显示出widget和dialog窗口,非模态     QDialog *dialog = new QDialog(this);     dialog->show(); //同时显示出widget和dialog窗口,模态     QDialog *dialog = new QDialog(this);     dialog->setModal(true);     dialog->sh

Qt学习笔记-Widget布局管理

Qt学习笔记4-Widget布局管理 以<C++ GUI Programming with Qt 4, Second Edition>为参考 实例:查找对话框 包含三个文件,finddialog.h,finddialog.cpp及main.cpp. //finddialog.h代码 #ifndef FINDDIALOG_H#define FINDDIALOG_H #include <QDialog> class QCheckBox;class QLabel;class QLineE