QT关于相机、串口掉线(拔掉)重连
记录基本操作,以备不时之需,自己的杂乱笔记,思路应该比较清晰
相机掉线
- 判断相机掉线:采集图片出错
- 相机重连尝试:不退出线程,重新打开相机,并将新的变量赋值给线程中一直使用的变量
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
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)