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

14 篇文章 1 订阅

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

相机掉线

  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)
		{
			;//弹出对话错误提示框
		}
		
	}

}

串口相关

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

串口连接函数

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()函数,直到串口被重新连接
QT的库函数还是十分好用的

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值