2.2-使用Qt开发串口小助手的开发步骤

一、界面设计

在做软件之前使用“软件界面设计工具”先设计并绘制出软件界面,方便在写代码之前确认“功能需求”以及“交互流程”。
这里使用的软件是:“Axure RP”
在这里插入图片描述

二、新建工程与绘制界面

  1. 创建工程
    使用Qt Creater 新建一个“Qt Widgets Application”。填好工程名字后,然后点击下一步,直到类信息页面选择Base class为:“QDialog”并修改类名字为“SerialDialog”,然后一直下一步,直到进入代码编辑页面就完成了工程创建。类信息页面如下图所示:
    在这里插入图片描述
    工程创建完如下所示:
    在这里插入图片描述
  2. 绘制界面
    双击工程文件中的“serialdialog.ui”文件,在弹出的界面绘制页面绘制章节一种所设计的界面,结果如下图所示:(注意红色修改部分)
    在这里插入图片描述

三、用到的库函数说明

在工程文件中加下面代码来导入串口开发库:
QT += serialport

开发串口主要用到的qt串口类为:

  • QSerialPortInfo :用于描述串口设备详情的类,其有静态函数“availablePorts()”可以枚举可用的串口设备
    官方文档:https://doc.qt.io/qt-5/qserialportinfo.html

  • QSerialPort :用于打开串口,设置串口参数,以及发送和接收数据
    官方文档:https://doc.qt.io/qt-5/qserialport.html#atEnd
    setPort(const QSerialPortInfo &serialPortInfo)//设置端口
    setBaudRate(qint32 baudRate)//设置波特率
    setDataBits(QSerialPort::DataBits dataBits)//设置数据位
    setParity(QSerialPort::Parity parity)//设置校验位
    setStopBits(QSerialPort::StopBits stopBits)//设置停止位
    open(QIODevice::OpenMode mode) //打开串口
    close() //关闭串口
    //读串口数据:
    qint64 read(char *data, qint64 maxlen);
    QByteArray read(qint64 maxlen);
    //写串口数据
    qint64 write(const char *data, qint64 len);
    qint64 write(const QByteArray &data)
    Qt信号:QSerialPort::readyRead() //收到下位机发来的数据会触发此信号

四、核心编写逻辑代码

直接在工程中的“SerialDialog”类里面定义QSerialPort的对象并设置参数即可实现“串口通信功能”,但是为了避免把“处理串口的逻辑代码”和“SerialDialog这个UI代码”混合在一起。即做解除耦合处理。因此这里单独做一个类把有关串口逻辑处理功能做个封装。这里仅列出核心逻辑代码。完整源代码从第四段获取。
对串口功能函数的封装类:

class MySerialPort : public QObject
{
    Q_OBJECT
public:
    MySerialPort();
    ~MySerialPort();

   public:
       static QList<QSerialPortInfo> GetAvailablePorts();//获取系统中可用串口设备列表
       bool Open();//打开串口
       void Close();//关闭串口
       bool IsOpen();//串口是否被打开
       qint64 SendData(const QByteArray &data);//发送串口数据

       void SetPort(const QSerialPortInfo &serialPortInfo);//设置端口(串口号)
       bool SetBaudRate(qint32 baudRate);//设置波特率
       bool SetDataBits(QSerialPort::DataBits dataBits);//设置数据位
       bool SetParity(QSerialPort::Parity parity);//设置奇偶校验位
       bool SetStopBits(QSerialPort::StopBits stopBits);//设置停止位

signals:
       void ReceivedData(const QByteArray &data);//收到串口数据的信号
private slots:
       void ReadyRead();
private:
       QSerialPort *serial_port_p;
};


设置参数并打开串口:

void SerialDialog::on_pushButtonSerialOpen_clicked()
{
    if(my_serial_port_p->IsOpen()) {
        my_serial_port_p->Close();
        ui->pushButtonSerialOpen->setText(QApplication::translate("SerialDialog", "打开串口"));
    } else {
        my_serial_port_p->SetPort(port_info_list_[ui->comboBoxSerialPort->currentIndex()]);
        SetSerialSettings();
        my_serial_port_p->Open();
        ui->pushButtonSerialOpen->setText(QApplication::translate("SerialDialog", "关闭串口"));
    }
}


发送函数:

void SerialDialog::on_pushButtonSerialSend_clicked() 
{
    QString text = ui->textEditSend->toPlainText().toLatin1();
    QByteArray data;
    data.append(text);
    my_serial_port_p->SendData(data);
    ui->textEditSend->clear();
}

接收函数:

void SerialDialog::ReceivedData(const QByteArray &data) {
    ui->textEditReceive->append(data.data());
}

五、获取源代码

点击此链接获取源代码

六、效果图

  1. 在windows系统下效果
    在这里插入图片描述
  2. 在MacOS系统下效果
    在这里插入图片描述
发布了88 篇原创文章 · 获赞 45 · 访问量 20万+

猜你喜欢

转载自blog.csdn.net/robert_cysy/article/details/104346202