您的位置:首页 > 编程语言 > Qt开发

Qt项目实战1:简单的串口工具

2016-12-07 17:22 441 查看
上一篇内容Qt学习笔记1:创建一个QT的空项目介绍了初始Qt,不依赖Qt提供的模板框架,自己创建一个空的Qt项目。

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

页面布局

项目需求

实现串口打开/关闭;

实现串口配置参数设置;

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

实现串口数据发送。

创建一个空的Qt项目

可以参考:Qt学习笔记1:创建一个QT的空项目。这里不再详述。

本项目在设计时,以熟悉Qt使用为目的,串口工具的功能力求简洁实用。在后续的学习和开发中,可以逐步完善。

Qt页面部件设计

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



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

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

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

初始化设置布局代码:

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

setLayout(layout);


串口参数配置

获取串口参数信息

Qt库提供了串口操作相关的类

QSerialPortInfo : 串口信息类

QSerialPort : 串口相关操作类

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

foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
{
qDebug() << "Name        : " << info.portName();
qDebug() << "Description : " << info.description();
qDebug() << "Manufacturer: " << info.manufacturer();

// Example use QSerialPort
QSerialPort serial;
serial.setPort(info);
if (serial.open(QIODevice::ReadWrite))
{
qDebug() << "Name        : add " << info.portName();
com->addItem(info.portName());
serial.close();
}
}


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

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

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

串口参数配置

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

QGroupBox *groupBox = new QGroupBox();
QFormLayout *layout = new QFormLayout();
com = new QComboBox();
baudRate = new QComboBox();
dataBit = new QComboBox();
parity = new QComboBox();
stopBit = new QComboBox();

QStringList baudList;
QStringList parityList;
QStringList dataBitsList;
QStringList stopBitsList;

/* baud rate */
baudList<<"1200"<<"1800"<<"2400"<<"4800"<<"9600"
<<"14400"<<"19200"<<"38400"<<"56000"<<"57600"
<<"76800"<<"115200"<<"128000"<<"256000";
baudRate->addItems(baudList);
baudRate->setCurrentIndex(11);

/* parity */
parityList<<"无"<<"奇"<<"偶";
parity->addItems(parityList);
parity->setCurrentIndex(0);

/* data bits */
dataBitsList<<"5"<<"6"<<"7"<<"8";
dataBit->addItems(dataBitsList);
dataBit->setCurrentIndex(3);

/* stop bits */
stopBitsList<<"1"<<"1.5"<<"2";
stopBit->addItems(stopBitsList);
stopBit->setCurrentIndex(0);

/* vertical layout */
layout->setAlignment(Qt::AlignCenter);
layout->addRow(new QLabel(tr("串口号")), com);
layout->addRow(new QLabel(tr("波特率")), baudRate);
layout->addRow(new QLabel(tr("校验位")), parity);
layout->addRow(new QLabel(tr("数据位")), dataBit);
layout->addRow(new QLabel(tr("停止位")), stopBit);

/* group box */
groupBox->setTitle(tr("参数设置"));
groupBox->setLayout(layout);


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

串口相关操作

打开/关闭串口

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

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

串口打开槽函数:

void Widget::openBtnClicked(void)
{
qDebug() << "Open serial port";
serial = new QSerialPort();
serial->setPortName(com->currentText());
if (serial->open(QIODevice::ReadWrite)) {
openBtn->setEnabled(false);
closeBtn->setEnabled(true);
sendBtn->setEnabled(true);
}

serial->setBaudRate(baudRate->currentText().toInt());
serial->setDataBits((QSerialPort::DataBits)dataBit->currentText().toInt());
serial->setStopBits((QSerialPort::StopBits)stopBit->currentIndex());
serial->setParity((QSerialPort::Parity)parity->currentIndex());
serial->setFlowControl(QSerialPort::NoFlowControl);

timer = new QTimer();
connect(timer, SIGNAL(timeout()), this, SLOT(upgradeRecvData()));
timer->start(200);
}


串口关闭槽函数:

void Widget::closeBtnClicked(void)
{
qDebug() << "Close serial port";
if (timer != NULL) {
qDebug() << "timer";
timer->stop();
}

if (serial != NULL) {
qDebug() << "serial";
serial->close();
delete serial;
serial = NULL;
}

openBtn->setEnabled(true);
closeBtn->setEnabled(false);
sendBtn->setEnabled(false);
}


串口数据接收/发送

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

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

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

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

void Widget::upgradeRecvData(void)
{
recvData = serial->readAll();
if (recvData != NULL) {
showTextEdit->append(recvData);
}

recvData.clear();
}


数据发送的槽函数:

void Widget::sendBtnClicked(void)
{
QByteArray buf = inputLineEdit->text().toLocal8Bit();
serial->write(buf);
serial->write("\n");
inputLineEdit->clear();
}


源码下载链接:Qt串口工具
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  qt 串口工具 Qt项目