QT之串口设备信息显示与显示设备信息打不开串口的问题

这里只说这个问题,代码中我写有详细的注释,看注释即可。

至于qt怎么写串口可参考下面三篇博客:

QT串口助手制作_qt 串口助手-CSDN博客

QT初体验:手把手带你写一个自己的串口助手_qt设计串口助手的流程图-CSDN博客

【Qt串口调试助手】1.1 - Qt5编写串口调试助手,Qt串口编程_qt串口调试软件源码下载-CSDN博客

一、.pro引入qt串口模块

.pro

QT       += core gui
QT       += serialport//引入串口模块

二、.h定义

.h

#include <QSerialPort>
#include "QSerialPortInfo"


public:
    QSerialPort *serialPort;//定义串口指针

private slots:
    void on_OpenSerialPort_pushButton_clicked();//打开/关闭串口
    void on_RefreshSerialPort_pushButton_clicked();//刷新串口

三、.cpp实现

.cpp

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);
    ui_S = new Serial_Set() ;//将类指针实例化-子窗口

    /*一些开机初始值*/
    setLED(ui->LED_label, 0, 16);//串口状态指示灯-初始灰

    /*找出当前连接的串口并显示到SerialPort_comboBox*/
    QStringList serialNamePort; // 串口端口号列表
    serialPort = new QSerialPort(this); // 创建一个串口实例
    ui->SerialPort_comboBox->clear(); // 清除文本
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())//通过QSerialPortInfo查找可用串口
    {
        /* 方案1-带串口号和串口设备信息---追加文本*/
        /*使用方案1,直接打不开串口,必须对文本再进行处理,串口名字会影响打开串口的判断*/
//        QString portDescription = info.description();//获取所有设备信息
//        ui->SerialPort_comboBox->addItem(info.portName() + ": "+portDescription);

          ui->SerialPort_comboBox->addItem(info.portName() + ": "+info.description());//效果同上面两行一致

          /* 方案2-仅串口号不携带有串口设备信息*/
//        ui->SerialPort_comboBox->addItem(info.portName());
//        /*qDebug在QT的编译输出框中会打印下列信息,打包以后看不见的*/
//        qDebug() << "Name        : " << info.portName();//返回串口名称
//        qDebug() << "Description : " << info.description();//返回串口说明
//        qDebug() << "Manufacturer: " << info.manufacturer();//返回制造商信息
//        qDebug() << "Serial Number: " << info.serialNumber();//返回串口连接设备的串口唯一序列号
//        qDebug() << "System Location: " << info.systemLocation();  //系统本地位置

        if(serialPort->isOpen())//如果串口已经打开了 先给他关闭了
        {
            serialPort->clear();
            serialPort->close();
        }
    }

    /*手动连接信号与槽函数*/
    connect(serialPort,SIGNAL(readyRead()),this,SLOT(manual_serialPortReadyRead()));

}
.cpp

/*打开串口-串口配置*/
void Widget::on_OpenSerialPort_pushButton_clicked()
{
    /*串口及默认参数初始化*/
    QSerialPort::BaudRate baudRate=QSerialPort::Baud115200;
    QSerialPort::DataBits dataBits=QSerialPort::Data8;
    QSerialPort::StopBits stopBits=QSerialPort::OneStop;
    QSerialPort::Parity checkBits=QSerialPort::NoParity;

//    /*获取串口波特率*/
    if(ui->BaudRate_comboBox->currentText()=="4800")
        {baudRate=QSerialPort::Baud4800;}
    else if(ui->BaudRate_comboBox->currentText()=="9600")
        {baudRate=QSerialPort::Baud9600;}
    else if(ui->BaudRate_comboBox->currentText()=="115200")
        {baudRate=QSerialPort::Baud115200;}

    /*获取串口数据位*/
    if(ui->DateBits_comboBox->currentText()=="5")
        {dataBits=QSerialPort::Data5;}
    else if(ui->DateBits_comboBox->currentText()=="6")
        {dataBits=QSerialPort::Data6;}
    else if(ui->DateBits_comboBox->currentText()=="7")
        {dataBits=QSerialPort::Data7;}
    else if(ui->DateBits_comboBox->currentText()=="8")
        {dataBits=QSerialPort::Data8;}

    /*获取串口停止位*/
    if(ui->StopBit_comboBox->currentText()=="1")
        {stopBits=QSerialPort::OneStop;}
    else if(ui->StopBit_comboBox->currentText()=="1.5")
        {stopBits=QSerialPort::OneAndHalfStop;}
    else if(ui->StopBit_comboBox->currentText()=="2")
        {stopBits=QSerialPort::TwoStop;}

    /*获取串口奇偶校验位*/
    if(ui->CheckBit_comboBox->currentText() == "none"){
        {checkBits = QSerialPort::NoParity;}
    }else if(ui->CheckBit_comboBox->currentText() == "奇校验"){
        {checkBits = QSerialPort::OddParity;}
    }else if(ui->CheckBit_comboBox->currentText() == "偶校验"){
        {checkBits = QSerialPort::EvenParity;}
        }else{;}

    // 初始化串口属性:端口号、波特率、数据位、停止位、奇偶校验位数
    serialPort->setPortName(ui->SerialPort_comboBox->currentText());//设置端口号
    serialPort->setBaudRate(baudRate);
    serialPort->setDataBits(dataBits);
    serialPort->setStopBits(stopBits);
    serialPort->setParity(checkBits);

    /*对串口名字进行处理---section函数即分割字符串。
    在串口信息遍历时我们在串口号和串口详细信息中间加了“:”
    (方案1),现在以此“:”为界,分割字符
    若是使用方案2,此语句也不需要注销,找不到“:”重写后还是与方案2预期一样*/

    QString spTxt = ui->SerialPort_comboBox->currentText();
    spTxt = spTxt.section(':', 0, 0);//spTxt.mid(0, spTxt.indexOf(":"));
    //qDebug() << spTxt;
    serialPort->setPortName(spTxt);//重写serialPort

    //判断串口是否打开成功
    if(ui->OpenSerialPort_pushButton->text() == "打开串口")
    {
      if(serialPort->open(QIODevice::ReadWrite) == true)
        {
            setLED(ui->LED_label, 2, 16);//串口状态指示灯-绿
            ui->OpenSerialPort_pushButton->setText(tr("关闭串口"));
            ui->SerialPort_comboBox->setEnabled(false);// 让端口号下拉框不可选,避免误操作
            ui->MTextlabel->setText(ui->SerialPort_comboBox->currentText()+tr("打开成功!"));

            /*打开串口后--定时器开启--定时时间*/
            timSend->start(timSend_TIME);
        }
        else
        {
         setLED(ui->LED_label, 0, 16);//串口状态指示灯-初始灰
         ui->MTextlabel->setText(ui->SerialPort_comboBox->currentText()+tr("打开失败,此端口可能被占用!"));
        }
    }
    else
    {
        serialPort->close();
        ui->OpenSerialPort_pushButton->setText(tr("打开串口"));
        ui->MTextlabel->setText(ui->SerialPort_comboBox->currentText()+tr("关闭成功!"));
        ui->SerialPort_comboBox->setEnabled(true);// 让端口号下拉框可选
        setLED(ui->LED_label, 0, 16);//串口状态指示灯-初始灰

        /*关闭串口后--关闭定时器*/
        timSend->stop(); timer_overtime->stop(); timer_status->stop();
    }
}

/*刷新串口*/
void Widget::on_RefreshSerialPort_pushButton_clicked()
{
    ui->SerialPort_comboBox->clear();//清除防止多次重叠刷新
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts())
    {
//      ui->SerialPort_comboBox->addItem(info.portName());
        ui->SerialPort_comboBox->addItem(info.portName() + ": "+info.description());
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果Qt打不开串口,可能是由以下原因导致: 1. 串口被其他程序占用:如果串口已经被其他程序占用,那么Qt就无法打开该串口。你可以先关闭其他程序,然后再尝试打开串口。 2. 串口名称或端口号错误:如果串口名称或端口号错误,Qt也无法打开串口。你可以检查串口名称或端口号是否正确。 3. 串口状态错误:如果串口状态不正确,比如已经打开但没有关闭,Qt也无法打开串口。你可以确保串口已经正确关闭,或者使用QSerialPort::open()函数之前先调用QSerialPort::close()函数关闭串口。 4. 权限不足:如果你的系统权限不足,可能会导致Qt无法打开串口。你需要以管理员身份运行程序,或者修改权限以便可以访问串口。 解决方法: 1. 通过Windows的“设备管理器”或Linux的“lsusb”命令等工具查看串口名称和端口号是否正确。 2. 检查程序是否正确关闭了串口。可以在程序退出时使用QSerialPort::close()函数关闭串口,也可以在程序中增加异常处理,确保程序异常退出时也能正确关闭串口。 3. 检查串口是否被其他程序占用。可以先关闭其他程序,然后再尝试打开串口。 4. 如果你的系统权限不足,可以以管理员身份运行程序,或者修改权限以便可以访问串口。 总之,如果Qt打不开串口,需要认真检查串口名称、端口号、状态等情况,并确保程序正确关闭串口
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值