Qt中提供QSerialPort类实现串口通信。
示例代码:
//serialportdemo.h
#include <QMainWindow>
#include <QDebug>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
QT_BEGIN_NAMESPACE
namespace Ui { class SerialPortDemo; }
QT_END_NAMESPACE
class SerialPortDemo : public QMainWindow
{
Q_OBJECT
public:
SerialPortDemo(QWidget *parent = nullptr);
~SerialPortDemo();
private slots:
void readData();
void on_openSerialBtn_clicked();
void on_sendBtn_clicked();
private:
Ui::SerialPortDemo *ui;
QSerialPort *serial;
bool SerialIsOpen = false;
};
//serialportdemo.cpp
#include "serialportdemo.h"
#include "ui_serialportdemo.h"
SerialPortDemo::SerialPortDemo(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::SerialPortDemo)
{
ui->setupUi(this);
foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()){
QSerialPort serial;
serial.setPort(info);
if(serial.open(QIODevice::ReadWrite)){
ui->portBox->addItem(serial.portName());
serial.close();
}
}
ui->baudBox->setCurrentIndex(0);
}
SerialPortDemo::~SerialPortDemo()
{
delete ui;
}
void SerialPortDemo::on_openSerialBtn_clicked()
{
if(!SerialIsOpen){
serial = new QSerialPort;
serial->setPortName(ui->portBox->currentText());
serial->open(QIODevice::ReadWrite);
serial->setBaudRate(QSerialPort::Baud115200);
switch (ui->dataBox->currentIndex()) {
case 0:
serial->setDataBits(QSerialPort::Data8);
break;
default:
break;
}
switch (ui->checkBox->currentIndex()) {
case 0:
serial->setParity(QSerialPort::NoParity);
break;
default:
break;
}
switch (ui->stopBox->currentIndex()) {
case 0:
serial->setStopBits(QSerialPort::OneStop);
break;
case 1:
serial->setStopBits(QSerialPort::TwoStop);
break;
default:
break;
}
serial->setFlowControl(QSerialPort::NoFlowControl);
SerialIsOpen = true;
ui->portBox->setEnabled(false);
ui->dataBox->setEnabled(false);
ui->checkBox->setEnabled(false);
ui->stopBox->setEnabled(false);
ui->baudBox->setEnabled(false);
ui->openSerialBtn->setText("Close");
QObject::connect(serial, &QSerialPort::readyRead, this, &SerialPortDemo::readData);
}else{
serial->clear();
serial->close();
serial->deleteLater();
SerialIsOpen = false;
ui->portBox->setEnabled(true);
ui->dataBox->setEnabled(true);
ui->checkBox->setEnabled(true);
ui->stopBox->setEnabled(true);
ui->baudBox->setEnabled(true);
ui->openSerialBtn->setText("Open");
}
}
void SerialPortDemo::on_sendBtn_clicked()
{
serial->write(ui->txtWrite->toPlainText().toLatin1());
}
void SerialPortDemo::readData(){
QByteArray buf;
buf = serial->readAll();
if(!buf.isEmpty()){
QString str = buf;
ui->txtRead->append(str);
}
buf.clear();
}
UI界面: