最近自己学习了QT的相关知识和操作,但是却没有做过太多的QT项目,之前大多数都是通过MFC去实现一些功能项目,若用QT去实现同样的东西,其编程方法原理都是不会变的,加上觉得自己的指纹系统项目有点单一,所以准备基于QT5做一个串口编写的上位机,实现“软硬结合”。
实现串口功能,需要我们主要处理好串口选择,波特率大小,停止位,校验位和串口的开闭操作。同时在接收和发送消息时我们可以将数据转换成自己想要的类型。
下面是实现的代码:
mainwindow.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
namespace Ui {
class MainWindow;
}
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();
private:
Ui::MainWindow *ui;
QSerialPort *serial;
private slots:
void ClearButton_onclick(); //清空接收按钮槽函数
void SendButton_onclick(); //发送数据按钮槽函数
void OpenButton_onclick(); //打开文件按钮槽函数
void Read_Data(); //读取数据槽函数
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
//查找可用的串口
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
{
QSerialPort myserial ; //串口类对象
myserial.setPort(info);
if(myserial.open(QIODevice::ReadWrite))
{
ui->portcomboBox->addItem(myserial.portName()); //添加串口号名字
myserial.close();
}
}
//设置波特率下拉菜单默认显示第六项
ui->baoudcomboBox->setCurrentIndex(5);
//关闭发送串口按钮的使能
ui->SendDataButton->setEnabled(false);
//QDebug()<<tr("界面设定成功!");
QObject::connect(ui->ClearButton,SIGNAL(clicked()),this,SLOT(ClearButton_onclick()));
QObject::connect(ui->OpenButton,SIGNAL(clicked()),this,SLOT(OpenButton_onclick()));
QObject::connect(ui->SendDataButton,SIGNAL(clicked()),this,SLOT(SendButton_onclick()));
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::ClearButton_onclick() //清除接收功能函数
{
ui->textEdit->clear();
}
void MainWindow::SendButton_onclick() //发送数据功能函数
{
serial->write(ui->textEdit_2->toPlainText().toLatin1()) ; //按十六进制编码接入文本
}
void MainWindow::OpenButton_onclick() //打开串口功能函数
{
if(ui->OpenButton->text()==tr("打开串口"))
{
serial = new QSerialPort;
serial->setPortName(ui->portcomboBox->currentText()); //设置串口名
serial->open(QIODevice::ReadWrite); //打开串口
serial->setBaudRate(ui->baoudcomboBox->currentText().toInt()); //设置波特率
switch(ui->datacomboBox->currentIndex()) //设置数据位数
{
case 8: serial->setDataBits(QSerialPort::Data8); break;
default: break;
}
switch(ui->checkcomboBox->currentIndex()) //设置奇偶校验
{
case 0: serial->setParity(QSerialPort::NoParity); break;
default: break;
}
//设置停止位
switch(ui->stopcomboBox->currentIndex())
{
case 1: serial->setStopBits(QSerialPort::OneStop); break;
case 2: serial->setStopBits(QSerialPort::TwoStop); break;
default: break;
}
//设置流控制
serial->setFlowControl(QSerialPort::NoFlowControl);
//关闭设置菜单使能
ui->portcomboBox->setEnabled(false);
ui->baoudcomboBox->setEnabled(false);
ui->datacomboBox->setEnabled(false);
ui->checkcomboBox->setEnabled(false);
ui->stopcomboBox->setEnabled(false);
ui->OpenButton->setText(tr("关闭串口"));
ui->SendDataButton->setEnabled(true);
//连接信号槽
QObject::connect(serial, &QSerialPort::readyRead, this, &MainWindow::Read_Data);
}
else
{
//关闭串口
serial->clear();
serial->close();
serial->deleteLater();
//恢复设置使能
ui->portcomboBox->setEnabled(true);
ui->baoudcomboBox->setEnabled(true);
ui->datacomboBox->setEnabled(true);
ui->checkcomboBox->setEnabled(true);
ui->stopcomboBox->setEnabled(true);
ui->OpenButton->setText(tr("打开串口"));
ui->SendDataButton->setEnabled(false);
}
}
void MainWindow::Read_Data() //读取数据功能函数
{
QByteArray buf ;
buf = serial->readAll() ;
if(!buf.isEmpty())
{
QString str = ui->textEdit->toPlainText() ;
str+=tr(buf) ;
QByteArray str2 = QByteArray::fromHex (str.toLatin1().data());
QString strDis;
QString str3 = str2.toHex().data(); //以十六进制显示
str3 = str3.toUpper (); //转换为大写
for(int i = 0;i<str3.length ();i+=2) //填加空格
{
QString st = str3.mid (i,2);
strDis += st;
strDis += " ";
}
//ui->textEdit->clear();
ui->textEdit->append(strDis);
}
buf.clear();
}
main函数则不需要修改,创建好默认代码即可。同时务必记得在.pro文件中添加
QT += serialport
运行后的结果为: