在.pro文件添加 serialport
QT += core gui serialport
dialog.h
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QSerialPort>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
bool mIsOpen = false; // 判断串口是否连接成功
bool getSerialPortConfig(); // 打开串口函数
private slots:
void on_buttonOpenClear_clicked();
void on_buttonSend_clicked();
// 读取文件槽函数
void on_SerialPort_readyRead();
private:
Ui::Dialog *ui;
QSerialPort mSerialPort; // 串口变量
};
#endif // DIALOG_H
dialog.cpp
#include "dialog.h"
#include "ui_dialog.h"
#include <QDebug>
#include <QSerialPortInfo>
#include <QSerialPort>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
this->setWindowTitle("串口调试");
// 智能识别当前系统的有效串口号
QList<QSerialPortInfo> serialPortInfo = QSerialPortInfo::availablePorts();
int count = serialPortInfo.count();
for(int i = 0; i<count; i++)
{
// serialPortInfo.at(i).portName() 获取端口号
// serialPortInfo.at(i).description() 获取端口号描述
QString comStr = QString("%1 %2").arg(serialPortInfo.at(i).portName())
.arg(serialPortInfo.at(i).description());
ui->comPortName->addItem(comStr);
}
// 波特率
ui->comBaudRate->addItem("110");
ui->comBaudRate->addItem("300");
ui->comBaudRate->addItem("600");
ui->comBaudRate->addItem("1200");
ui->comBaudRate->addItem("2400");
ui->comBaudRate->addItem("4800");
ui->comBaudRate->addItem("9600");
ui->comBaudRate->addItem("14400");
ui->comBaudRate->addItem("19200");
ui->comBaudRate->addItem("115200");
// 校验位
ui->comParity->addItem("NONE");
ui->comParity->addItem("ODD");
ui->comParity->addItem("EVEN");
ui->comParity->addItem("MARK");
ui->comParity->addItem("SPACE");
// 数据位
ui->comDataBits->addItem("5");
ui->comDataBits->addItem("6");
ui->comDataBits->addItem("7");
ui->comDataBits->addItem("8");
// 停止位
ui->comStopBits->addItem("1");
ui->comStopBits->addItem("1.5");
ui->comStopBits->addItem("2");
ui->buttonSend->setEnabled(false);
// connect(&mSerialPort, SIGNAL(readyRead()), this, SLOT(on_SerialPort_readyRead()));
// 读取数据
connect(&mSerialPort, &QSerialPort::readyRead, this, &Dialog::on_SerialPort_readyRead);
}
// 打开串口函数
bool Dialog::getSerialPortConfig()
{
// 获取选择框的当前值
QString name = ui->comPortName->currentText().split(" ")[0];
QString rate = ui->comBaudRate->currentText();
QString parity = ui->comParity->currentText();
QString dataBits = ui->comDataBits->currentText();
QString stopBits = ui->comStopBits->currentText();
// 设置端口号
mSerialPort.setPortName(name);
// 设置波特率
if(rate == "9600") {
mSerialPort.setBaudRate(QSerialPort::Baud9600);
}else if(rate == "19200"){
mSerialPort.setBaudRate(QSerialPort::Baud19200);
}else if(rate == "115200"){
mSerialPort.setBaudRate(QSerialPort::Baud115200);
}
// 设置校验位
if(parity == "NONE") {
mSerialPort.setParity(QSerialPort::NoParity);
}else if(parity == "ODD"){
mSerialPort.setParity(QSerialPort::OddParity);
}else if(parity == "EVEN"){
mSerialPort.setParity(QSerialPort::EvenParity);
}else if(parity == "MARK"){
mSerialPort.setParity(QSerialPort::MarkParity);
}else if(parity == "SPACE"){
mSerialPort.setParity(QSerialPort::SpaceParity);
}
// 设置数据位
if(dataBits == "5") {
mSerialPort.setDataBits(QSerialPort::Data5);
}else if(dataBits == "6"){
mSerialPort.setDataBits(QSerialPort::Data6);
}else if(dataBits == "7"){
mSerialPort.setDataBits(QSerialPort::Data7);
}else {
mSerialPort.setDataBits(QSerialPort::Data8);
}
// 设置停止位
if(stopBits == "1.5"){
mSerialPort.setStopBits(QSerialPort::OneAndHalfStop);
}else if(dataBits == "2"){
mSerialPort.setStopBits(QSerialPort::TwoStop);
}else {
mSerialPort.setStopBits(QSerialPort::OneStop);
}
// 打开 以读写方式打开
bool isOpen = mSerialPort.open(QSerialPort::ReadWrite);
if(isOpen == true)
{
qDebug() << "成功打开窗口" << name;
}
// 返回bool值
return isOpen;
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_buttonOpenClear_clicked()
{
if(true == mIsOpen)
{
mIsOpen = false;
// 关闭串口
mSerialPort.close();
ui->buttonOpenClear->setText("打开");
// 开启按钮
ui->comPortName->setEnabled(true);
ui->comBaudRate->setEnabled(true);
ui->comParity->setEnabled(true);
ui->comDataBits->setEnabled(true);
ui->comStopBits->setEnabled(true);
// 关闭发送按钮
ui->buttonSend->setEnabled(false);
}else {
if(true == getSerialPortConfig())
{
mIsOpen = true;
// 关闭按钮
ui->buttonOpenClear->setText("关闭");
ui->comPortName->setEnabled(false);
ui->comBaudRate->setEnabled(false);
ui->comParity->setEnabled(false);
ui->comDataBits->setEnabled(false);
ui->comStopBits->setEnabled(false);
// 开启发送按钮
ui->buttonSend->setEnabled(true);
}
}
}
// 发送数据槽函数
void Dialog::on_buttonSend_clicked()
{
if(true == mIsOpen)
{
QString str = ui->textEditWrite->toPlainText();
// 发送数据
mSerialPort.write(str.toUtf8().data());
}
}
// 接收数据槽函数
void Dialog::on_SerialPort_readyRead()
{
// 取出所有的数据
QByteArray recvData = mSerialPort.readAll();
// 转码,支持中文
QString str = QString::fromLocal8Bit( recvData );
qDebug() << str;
// 将数据写到文本框中
ui->textEditRead->append(str);
}