通过QT对serialport库的应用,实现串口助手的功能,包括串口、波特率、数据位、校验方式、停止位的选择,还有数据的接收与发送。最后移植到开发板上运行。
界面效果如下图:
myserial.h
#ifndef MYSERIAL_H
#define MYSERIAL_H
#include <QWidget>
#include <QSerialPortInfo>
#include <QSerialPort>
QT_BEGIN_NAMESPACE
namespace Ui {
class MySerial; }
QT_END_NAMESPACE
class MySerial : public QWidget
{
Q_OBJECT
public:
MySerial(QWidget *parent = nullptr);
~MySerial();
private slots:
void on_pushButton_openclose_clicked();
//接收串口数据槽函数
void readData();
void on_pushButton_send_clicked();
private:
Ui::MySerial *ui;
//串口类
QSerialPort *ser;
};
#endif // MYSERIAL_H
myserial.cpp
#include "myserial.h"
#include "ui_myserial.h"
#include <QDebug>
MySerial::MySerial(QWidget *parent)
: QWidget(parent)
, ui(new Ui::MySerial)
{
ui->setupUi(this);
//获取系统所有可用的串口
foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts()){
qDebug()<<info.portName()<<info.description();
//ui->comboBox_serialport->addItem(info.portName());
QSerialPort serial(info);
//测试串口是否可用
if(serial.open(QIODevice::ReadWrite)){
//空闲
//将串口名加入选项列表
ui->comboBox_serialport->addItem(serial.portName());
//关闭串口
serial.close();
}
else{
//被占用
ui->comboBox_serialport->addItem(serial.portName()+"(被占用)");
}
}
ui->pushButton_send->setEnabled(false);
}
MySerial::~MySerial()
{
delete ui;
}
//打开/关闭串口
void MySerial::on_pushButton_openclose_clicked()
{
if(ui->pushButton_openclose->text()=="打 开 串 口"){
//打开
ser = new QSerialPort(ui->comboBox_serialport->currentText(),this);
//打开串口
if(!ser->open(QIODevice::ReadWrite)){
qDebug()<<"打开失败";
ser->deleteLater();
return;
}
//设置波特率
switch (ui->comboBox_baudrate->currentIndex()) {
case 0:
ser->setBaudRate(QSerialPort::Baud2400);
break;
case 1:
ser->setBaudRate(QSerialPort::Baud4800);
break;
case 2:
ser->setBaudRate(QSerialPort::Baud9600);
break;
case 3:
ser->setBaudRate(QSerialPort::Baud38400);
break;
case 4:
ser->setBaudRate(QSerialPort::Baud115200);
break;
}
//设置数据位位数
switch (ui->comboBox_databits->currentIndex()) {
case 0:
ser->setDataBits(QSerialPort::Data5);
break;
case 1:
ser->setDataBits(QSerialPort::Data6);
break;
case 2:
ser->setDataBits(QSerialPort::Data7);
break;
case 3:
ser->setDataBits(QSerialPort::Data8);
break;
}
//设置校验位
switch (ui->comboBox_parity->currentIndex()) {
case 0:
ser->setParity(QSerialPort::NoParity);
break;
case 1:
ser->setParity(QSerialPort::OddParity);
break;
case 2:
ser->setParity(QSerialPort::EvenParity);
break;
}
//设置停止位
switch (ui->comboBox_parity->currentIndex()) {
case 0:
ser->setStopBits(QSerialPort::OneStop);
break;
case 1:
ser->setStopBits(QSerialPort::TwoStop);
break;
}
//关闭流控
ser->setFlowControl(QSerialPort::NoFlowControl);
//关闭选项菜单
ui->comboBox_parity->setEnabled(false);
ui->comboBox_baudrate->setEnabled(false);
ui->comboBox_databits->setEnabled(false);
ui->comboBox_stopbits->setEnabled(false);
ui->comboBox_serialport->setEnabled(false);
ui->pushButton_send->setEnabled(true);
//修改按钮显示
ui->pushButton_openclose->setText("关 闭 串 口");
//连接信号和槽
QObject::connect(ser,&QSerialPort::readyRead,this,&MySerial::readData);
}
else{
//关闭
ser->clear();
ser->close();
ser->deleteLater();
ui->comboBox_parity->setEnabled(true);
ui->comboBox_baudrate->setEnabled(true);
ui->comboBox_databits->setEnabled(true);
ui->comboBox_stopbits->setEnabled(true);
ui->comboBox_serialport->setEnabled(true);
ui->pushButton_send->setEnabled(false);
ui->pushButton_openclose->setText("打 开 串 口");
}
}
//接收数据
void MySerial::readData()
{
//接收所有数据
QByteArray data = ser->readAll();
if(!data.isEmpty()){
ui->textBrowser->append(QString(data));
}
//data.clear();
}
//发送数据
void MySerial::on_pushButton_send_clicked()
{
//获取要发送的数据
QByteArray data = ui->textEdit->toPlainText().toUtf8();
ser->write(data);
}
main.cpp
#include "myserial.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MySerial w;
w.show();
return a.exec();
}
完整工程代码:https://download.csdn.net/download/weixin_43793181/13502395