Qt之Serialport的开机自连和检测插拔

之前上传过一次QSerialport的资源,就想着什么时候来写篇博客来说明一下。

大部分就做了几个功能,串口的正常读写已经不用说了,主要是通过自动连接,以及USB断开的时候提醒以及再次插上的时候的提醒

主要代码如下:

自动连接主要是通过开机获取所有的端口名

void MainWindow::GetSerialPortNames()
{
    foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        nameSerialPort[countPort++] = info.portName();
    }

}

记得单独封装成函数,因为之后USB断开后需要不断调用这个函数

然后我们只需要打开定时器,不断的连接获取到的端口

void MainWindow::handleTimeout()
{
    if(!connectSuccess)
    {
        my_SerialPort->close();
        //m_count是已经连接的端口数,countport是总共的端口数
        if(m_count >= countPort)
        {
            m_pTimer->stop();
            ui->label_status->setText("未连接");
            QMessageBox::critical(this, tr("Error"), "打开串口失败!");
            ui->Btn_Reconnect->setEnabled(true);
            return;
        }
        ui->label_status->setText("正在连接...");
        my_SerialPort->setPortName(nameSerialPort[m_count++]);
        if(my_SerialPort->open(QIODevice::ReadWrite))
        {
            sendCommand(connectBuffer);
        }
    }
    else
    {
        m_count = 0;
        m_pTimer->stop();
        m_tTimer->start(3000);
        ui->label_status->setText("已连接");
        ui->Btn_Start->setEnabled(true);
        ui->Btn_Reconnect->setEnabled(false);
    }
}

这样的话就可以上电后自动接了

但是如果检测插拔怎么检测呢

只需要调用一个函数即可’

先设一个槽函数并关联这个函数

connect(my_SerialPort, static_cast(&QSerialPort::error),  this, &MainWindow::handleSerialError);

之后我们看这个函数

 

void MainWindow::handleSerialError(QSerialPort::SerialPortError error)
{
    if (error == QSerialPort::ResourceError) {
        QMessageBox::critical(this, tr("Error"), "串口连接中断,请检查是否正确连接!");
        my_SerialPort->close();
        ui->label_status->setText("未连接");
        m_pTimer->start(1000);
    }
}


此时打开端口连接函数,就可以自动检测插上了

然后在工作中,你会发现Qt接收经常会分两段接收,我就是根据通讯协议指定规则,如果存在两次接收就将其拼接在一起,每次检测拼接后的数据是否正确,超过几次错误之后就放弃这组数据,如果刚接收的数据是正确的,就将之前的数据放弃,这个我也是测试过的,之后并没有出现过问题。

//说的不好,写的也不好,但是最主要是分享一下自己关于串口类的理解,相信这些如果只是正常收发一般不会有问题了,可以快乐的使用了

//还有如果需要下载的可以下载https://download.csdn.net/download/qq_41399894/10912960,但是我的你肯定不能直接用,因为这通讯的各个命令都不一样,所以我就都删除了,只给你们留了直接移植的部分就好了

你可能感兴趣的:(Qt)