QT关于相机、串口掉线(拔掉)重连

时间:2021-11-30
本文章向大家介绍QT关于相机、串口掉线(拔掉)重连,主要包括QT关于相机、串口掉线(拔掉)重连使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

记录基本操作,以备不时之需,自己的杂乱笔记,思路应该比较清晰

相机掉线

  1. 判断相机掉线:采集图片出错
  2. 相机重连尝试:不退出线程,重新打开相机,并将新的变量赋值给线程中一直使用的变量
void total_thread::run()
{
    VideoCapture cap(0);
    Mat img, result;
    int thread_stop = param_Cutpp.thread_shutup;
    int data_wrap = 0;
    int angle3 = 0;//文档缺角标志
    double ruihua=4.2;//锐化参数
    Letscut cutp;

    while (!thread_stop)//不结束线程
    {
        msleep(100);
        mutex->lock();
        thread_stop = param_Cutpp.thread_shutup;//获得线程运行标值
        data_wrap = param_Cutpp.data_wrap;//获得外部校正标志
        angle3 = param_Cutpp.angle_3;
        ruihua = param_Cutpp.Ruihua;//获得锐化参数
        mutex->unlock();
        try {
            if(cap.isOpened())
            cap>>img;
            
            if (!img.empty())//采集成功
            {
                //一系列操作                
            }
            else
            {
                cap.release();
                if (!cap.isOpened())
                {
                    //cap.release();
                    VideoCapture cap1(0);
                    if (cap1.isOpened())cap = cap1;
                }

            }
        }
        catch (int)//这里弹出错误提示
        {
            ;
        }
        catch (std::exception& e)
        {
            ;//弹出对话错误提示框
        }
        
    }

}

串口相关


连接串口:根据串口的名字、序列号可以打开串口
获得串口数据:QT提供了监测串口发送数据的信号函数,与自己的槽函数连接即可实时监测串口传输进来的数据
串口掉线监测:QT提供了串口错误信号函数,连接自己的错误处理槽函数可以自动处理掉线事件(我在槽函数中主要实现串口的重连操作,一旦出现错误就启动重连计时器,实时监测是否有合适串口连接在机器上)
串口重连:串口重连与第一步连接串口使用的同一个函数,随着计时器不断调用该槽函数,直到串口连接成功,串口重新连接成功后,关闭计时器。


串口连接函数

void Cutpaper::GetSerialPortNames()//获取串口相关的信息,并重连串口
{
    QSerialPortInfo com_info;
    foreach(const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) {
        if (info.serialNumber() == "")//串口序列号,或者串口的名字作为串口的标识符
        {
            com_info = info;
            break;
        }
    }
    serial->setPort(com_info);
    if (serial->open(QIODevice::ReadWrite)) {
        qDebug() << "serial open";
        timer_serl.stop();//结束重连触发计时器
        serial->setPortName("srl");
        serial->setBaudRate(QSerialPort::Baud115200);
        serial->setDataBits(QSerialPort::Data8);//设置数据位8
        serial->setParity(QSerialPort::NoParity); //校验位设置为0
        serial->setStopBits(QSerialPort::OneStop);//停止位设置为1
        serial->setFlowControl(QSerialPort::NoFlowControl);//设置为无流控制
        QObject::connect(serial, &QSerialPort::readyRead, this, &Cutpaper::serial_clot);
        QObject::connect(serial, static_cast<void (QSerialPort::*)
            (QSerialPort::SerialPortError)>(&QSerialPort::error),
            this, &Cutpaper::handleSerialError);
    }
    else {
        qDebug() << "serial not openned";
    }
    

}

获取串口数据

void  Cutpaper::serial_clot()
{
    QByteArray buf;
    buf = serial->readAll();
    if (!buf.isEmpty())
    {
        qDebug() << buf;
    }
    buf.clear();
}

串口出错监测

void Cutpaper::handleSerialError(QSerialPort::SerialPortError error)//检测串口连接错误
{
    if (error == QSerialPort::ResourceError||error== QSerialPort::PermissionError) {//包括串口被拔出来的错误
        char buf_err[100];
        sprintf(buf_err, "串口连接中断,请检查是否正确连接!");
        QString str_Err = QString::fromLocal8Bit(buf_err);
        QMessageBox::critical(this, tr("Error"), str_Err);
        //serial->clear();
        serial->close();
        //serial->deleteLater();//串口出错,释放串口内容
        timer_serl.start(500);//打开串口重连请求
    }
}

说明
timer_serl是一个计时器,在界面建立的时候就与GetSerialPortNames()函数connect,然后启动计时器,连接到串口之后,关闭计时器。
当串口出现错误时,该计时器重新被打开,也就是会调用GetSerialPortNames()函数,直到串口被重新连接
————————————————
版权声明:本文为CSDN博主「VeraWin」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/TiffanyXYf/article/details/109369195

原文地址:https://www.cnblogs.com/qianxiaoPro/p/15624722.html