Qt串口通信 QSerialPort

本文详细介绍了如何在Qt中通过QSerialPort模块实现一个串口收发窗口应用程序,包括查找可用串口、配置波特率、校验位、停止位和数据位,以及发送和接收数据的功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

实现一个简单的串口收发窗口应用程序程序,有详细的操作过程

一,在.pro中添加serialport模块,并添加头文件

#include <QSerialPort>
#include <QSerialPortInfo>

二,查找所有可用串口

void Widget::on_pushButton_clicked()
{
    ui->comboBox_ser->clear();
    //通过QSerialPortInfo查找可用串口
    foreach(const QSerialPortInfo &info,QSerialPortInfo::availablePorts())
    {   //在portBox中显示可用串口
        ui->comboBox_ser->addItem(info.portName());
    }
}

三,打开串口,并配置相关信息

调试函数

// 显示信息
void Widget::showInfo(const QString &info)
{
    qDebug() << info;
    ui->textEdit_rec->append("[" + QTime::currentTime().toString() + "]  " + info);
}
//打开串口
void Widget::on_pushButton_2_clicked()
{
    //判断串口是否打开,若已经打开则返回
    if(serial.isOpen())
    {
        return;
    }
    // 设置串口名  设置自己要打开的串口
    QString COM = ui->comboBox_ser->currentText();
    serial.setPortName(COM);

    // 打开串口
    if (!serial.open(QIODevice::ReadWrite)) {
        qDebug() << "Failed to open serial port";
        return;
    }

    /*QSerialPortl类中已经实现了波特率,检验位,停止位,数据位的枚举值,可直接调用*/
    //配置波特率,根据combobox中当前选择的项设置不同的波特率 项指数从0开始
    int baudRate = ui->comboBox_btl->currentIndex();
    switch (baudRate) {
        case 0: serial.setBaudRate(QSerialPort::Baud1200); break;
        case 1: serial.setBaudRate(QSerialPort::Baud2400); break;
        case 2: serial.setBaudRate(QSerialPort::Baud4800); break;
        case 3: serial.setBaudRate(QSerialPort::Baud9600); break;
        case 4: serial.setBaudRate(QSerialPort::Baud19200); break;
        case 5: serial.setBaudRate(QSerialPort::Baud38400); break;
        case 6: serial.setBaudRate(QSerialPort::Baud57600); break;
        case 7: serial.setBaudRate(QSerialPort::Baud115200); break;
        default: break;
    }
    //配置校验位
    int Parity = ui->comboBox_jy->currentIndex();
    switch (Parity)
    {
        case 0: serial.setParity(QSerialPort::NoParity); break;
        case 1: serial.setParity(QSerialPort::EvenParity); break;
        case 2: serial.setParity(QSerialPort::OddParity); break;
        case 3: serial.setParity(QSerialPort::SpaceParity); break;
        case 4: serial.setParity(QSerialPort::MarkParity); break;
        default: break;
    }
   //配置停止位
   int stopBit = ui->comboBox_st->currentIndex();
   switch (stopBit)
   {
       case 0: serial.setStopBits(QSerialPort::OneStop);break;
       case 1: serial.setStopBits(QSerialPort::OneAndHalfStop);break;
       case 2: serial.setStopBits(QSerialPort::TwoStop);break;
       default: break;
   }
   //配置数据位
   int dataBit = ui->comboBox_sj->currentIndex();
   switch (dataBit)
   {
       case 0: serial.setDataBits(QSerialPort::Data5);break;
       case 1: serial.setDataBits(QSerialPort::Data6);break;
       case 2: serial.setDataBits(QSerialPort::Data7);break;
       case 3: serial.setDataBits(QSerialPort::Data8);break;
       default: break;
   }
   /*该信号是当串口打开时,硬件发送数据到缓冲区时触发,即收到
    * 下位机发送过来的数据就会跳到槽函数将缓冲区的数据读出来*/
   // 连接 readyRead() 信号到槽函数
   connect(&serial, &QSerialPort::readyRead, this, &Widget::readData);

   showInfo("打开串口");


}

四,发送数据到设备

//发送数据
void Widget::on_pushButton_4_clicked()
{
    //从控件上获取要发送的数据
    QString data = ui->textEdit_send->toPlainText();
    QByteArray sendData = data.toUtf8();

    /* 发送数据  使用serial.write将数据写入到缓冲区让下位机读取,serial.write有
     * 三个重载版本 ,可以接受QByteArray,char*类型的参数,以及发送数据的长度
    */

    qint64 bytesWritten = serial.write(sendData);
    if(bytesWritten!=0)
    {
        qDebug() << "Bytes written: " << bytesWritten;
        showInfo("发送的数据:"+ data);
    }
}

五,接收设备的数据

// 读取数据
void Widget::readData()
{
    // 读取数据 serial.readAll()读取缓冲区所有数据并返回读到的数据
    QByteArray receivedData = serial.readAll();
    if(receivedData.isEmpty())
    {
         qDebug() << "无数据" ;
    }
    qDebug() << "接收到的数据: " << receivedData;
    //将接收到的数据显示在控件上
    showInfo("读到的数据:"+QString::fromUtf8(receivedData));
}

六,关闭串口

//关闭串口
void Widget::on_pushButton_3_clicked()
{

    if(serial.isOpen())
    {
        // 断开 readyRead() 信号与槽函数的连接
        disconnect(&serial, &QSerialPort::readyRead, this, &Widget::readData);
        // 关闭串口
        serial.close();
        showInfo("关闭串口");
    }
}

七,通过虚拟串口测试程序通过

有需要虚拟串口的可以私信

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值