记录基本操作,以备不时之需,自己的杂乱笔记,思路应该比较清晰
相机掉线
- 判断相机掉线:采集图片出错
- 相机重连尝试:不退出线程,重新打开相机,并将新的变量赋值给线程中一直使用的变量
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()
函数,直到串口被重新连接
QT的库函数还是十分好用的