在开发上位机的过程中,我深入学习了Qt的串口通信,遇到了不少坑,也积累了一些经验。希望这篇文章能帮助正在学习Qt串口通信的你少走弯路,也方便自己以后快速回顾。

本文章从0基础讲述Qt如何连接端口号互发送和互接受信息,在讲述数据帧

环境Qt5、虚拟串口驱动、串口调试助手(文章结尾会给出链接)

一、串口通讯

主要参数:波特率、校验位、数据位、停止位、控制流

主要操作:串口的打开和关闭,刷新串口设备、接收数据

二、实现串口通信

1、在头文件中引入串口通信的QtSerialPort类的两个头文件

// 引入串口通信的头文件
#include <QtSerialPort/QSerialPort>  //提供访问串口的功能
#include <QtSerialPort/QSerialPortInfo> //提供系统中的存在的串口信息

2、在工程文件中.pro添加以下代码

QT += serialport

3、在头文件中定义全局的串口对象

QSerialPort *serialPort;

做完前两个步骤,我们即将开始实现一个串口通信

4、创建串口对象和连接信号槽

 // 创建串口对象
    serialPort = new QSerialPort(this);

    // 连接信号槽:当串口有数据达到时,自动调用serialPortReadyRead_stol()
    connect(serialPort, SIGNAL(readyRead()),
            this, SLOT(serialPortReadyRead_Slot()));

5、通过一个按键实现串口的开和关

1、关联打开串口的点击事件

2、在打开按键中实现

void Widget::on_openBt_clicked()
{
    if(open_flag == false)  // 串口未打开,执行打开操作
    {
        // 检查是否选择了串口
        if(ui->serialBox->currentText() == "无可用串口" || ui->serialBox->count() == 0)
        {
            QMessageBox::warning(this, "提示", "没有可用的串口!");
            return;
        }

        QSerialPort::BaudRate baudBite = QSerialPort::Baud115200;//波特率115200
        QSerialPort::DataBits dataBite = QSerialPort::Data8;     //数据位8位
        QSerialPort::StopBits stopBite = QSerialPort::OneStop;   //停止位1位
        QSerialPort::Parity checkBite = QSerialPort::NoParity;   //无校验

        serialPort->setPortName(ui->serialBox->currentText());  //设置串口号
        serialPort->setBaudRate(baudBite);                      //设置波特率
        serialPort->setDataBits(dataBite);                      //设置数据位
        serialPort->setStopBits(stopBite);                      //设置停止位
        serialPort->setParity(checkBite);                       //设置校验位

        qDebug() << "尝试打开串口:" << ui->serialBox->currentText();
        //尝试打开窗口
        if(serialPort->open(QIODevice::ReadWrite)){//以读写方式打开
            open_flag = true;                       // 标记已打开
            ui->openBt->setText("关闭串口");            //改变按钮文字
            QMessageBox::information(this, "提示", "串口打开成功");
            qDebug() << "串口打开成功";

            // 串口打开后再发送数据
            on_Send_clicked();

        }
        else {
            QMessageBox::critical(this, "提示", "串口打开失败");
            qDebug() << "串口打开失败,错误:" << serialPort->errorString();
        }
    }
    else  // 串口已打开,执行关闭操作
    {
        serialPort->clear(); //清空缓冲区
        serialPort->close();//关闭串口
        open_flag = false;//标记已关闭
        ui->openBt->setText("打开串口");//改变按钮文字
        QMessageBox::information(this, "提示", "串口关闭成功");
        qDebug() << "串口已关闭";
    }
}

 3、刷新串口

如果在打开软件后才插上串口设备的话,下拉列表不会显示,需要重新搜索串口

点击刷新串口按钮,刷新串口号,并显示出来

void Widget::on_refreshBt_clicked()
{
    qDebug() << "刷新串口";
    ui->serialBox->clear(); //清空下拉框

    // 获取当前电脑上所有可用的串口
    this->avaiPortsList = QSerialPortInfo::availablePorts();

    if(avaiPortsList.isEmpty())// 如果没有串口
    {
        ui->serialBox->addItem("无可用串口");
        qDebug() << "没有发现串口";
        return;
    }

    // 遍历所有串口,添加到下拉框中
    for(int i = 0; i < avaiPortsList.length(); i++)
    {
        ui->serialBox->addItem(avaiPortsList[i].portName());
        qDebug() << "发现串口:" << avaiPortsList[i].portName();
    }
}

6.串口发送数据

 将输入框内容发送:

void Widget::on_Send_clicked()
{
    // 从界面输入框获取卡号
    QString data = QString("W:%1").arg(ui->t5cardEdit->text());
    //将字符串转换出UTF8
    QByteArray dataArray = data.toUtf8(); // 将字符串转换成字节数组
    //通过串口发送出去
    serialPort->write(dataArray); // 发送数据到串口
    qDebug() << "发送命令成功!";
}

7.串口接收数据

串口接收槽函数

void Widget::serialPortReadyRead_Slot()
{
    QByteArray data = serialPort->readAll();

    // 尝试UTF-8解码
    QString utf8Text = QString::fromUtf8(data);
    qDebug() << "UTF-8解码:" << utf8Text;

    // 如果UTF-8乱码,尝试GBK
    if(utf8Text.contains("�")) {
        QTextCodec *codec = QTextCodec::codecForName("GBK");
        QString gbkText = codec->toUnicode(data);
        qDebug() << "GBK解码:" << gbkText;
    }
}

测试:

然后我们开始测试,使用软件,连接我们的端口号,COM6和COM7

运行我们的Qt串口调试和打开另一个虚拟窗口调试,我们尝试能不能连接,去实现互发互收

这是我们的Qt串口界面:

这是另一个虚拟窗口界面:

我们已经把虚拟界面COM7打开了,Qt打开串口COM6,尝试能不能连接成功

此时弹窗,我们已经打开成功了!

那么我们开始输入一些信息,实现互相接收、发送

这是我们的虚拟串口,发送的Hello World!我们可以发现,这个虚拟串口它是以GBK编码发送的,但是我们通过虚拟串口发送,可以验证出,我们的发送和接收没有问题,我们在试试Qt去发送

接下来,我们就发送成功啦!

看到这里,恭喜你学会了上位机的串口通信!

虚拟串口驱动、串口调试助手来链接:

链接: https://pan.baidu.com/s/1d7jVdu5O3cIb-5GPjdhzew?pwd=px58 提取码: px58 复制这段内容后打开百度网盘手机App,操作更方便哦

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐