首页 > 其他分享 >qt一个在线程管理的串口

qt一个在线程管理的串口

时间:2024-05-25 11:40:34浏览次数:30  
标签:在线 signal QSerialPort connect SerialPortController 串口 serial include qt

qt一个在线程管理的串口

 

#include <QObject>
#include <QSerialPort>
#include <QSerialPortInfo>
#include <QDebug>
#include <QFile>
#include <QTextStream>
#include <QThread>
#include <QTimer>
#include <QEventLoop>

class SerialPortController : public QSerialPort
{
    Q_OBJECT
public:
    explicit SerialPortController(QObject* parent = nullptr)
        :QSerialPort(parent)
    {
        connect(this,&SerialPortController::signal_SendData,this,&SerialPortController::OnSendData);
        connect(this, &SerialPortController::readyRead, this, &SerialPortController::OnReadyRead,Qt::DirectConnection);
    }
    ~SerialPortController(){}
signals:
    void signal_SendData(const QByteArray &d);
    void signal_ReadData(const QByteArray &d);
public slots:
    void OnSendData(const QByteArray &d) {
        qint64 len = write(d);
    }
    void OnReadyRead()
    {
        QByteArray d = readAll();
        if(d.length()>0)
        {
            emit signal_ReadData(d);
        }
    }
};

/*
使用方式:
SerialPortEx 创建一个对象
  open((QString port, int baud,int Flow。。。)打开串口
WriteData(QByteArray d)发送数据
signal_ReadData(const QByteArray&) 信号曹返回tcp数据
****************************/

class SerialPortEx : public QObject
{
    Q_OBJECT
public:
    explicit SerialPortEx(QObject* parent = nullptr)
        :QObject(parent)
    {
        serial = new SerialPortController;

        connect(serial, &SerialPortController::errorOccurred, [=](QSerialPort::SerialPortError error)
                {
                    if (error != QSerialPort::NoError  ) {
                        emit signal_ConnectStatus(false);
                        connect_flag = false;
                        qDebug()<<port_name<<"error"<< error;
                    }
                });
    }
    ~SerialPortEx()
    {
        workerThread.quit();
        workerThread.wait();
    }

    // port;//串口号
    // baud;//波特率
    // Flow =流控制:无控制,硬件控制,软件控制等
    // parity;//校验位
    // dataBits;//数据位
    // stopBits;//停止位
    bool open(QString port, int baud,int Flow = QSerialPort::NoFlowControl, QString dataBits = "8", QString stopBits = "1", QString parity = "0")
    {
        try
        {
            port_name= port;
            serial->setPortName(port_name);
            if (serial->isOpen()) {
                serial->close();
            }
            if (serial->open(QIODevice::ReadWrite))
            {
                serial->flush(); //清空缓冲区
                serial->setBaudRate((QSerialPort::BaudRate)baud); //设置波特率
                serial->setDataBits((QSerialPort::DataBits)dataBits.toInt()); //设置数据位
                serial->setParity((QSerialPort::Parity)parity.toInt()); //设置校验位
                serial->setStopBits((QSerialPort::StopBits)stopBits.toInt()); //设置停止位
                serial->setFlowControl((QSerialPort::FlowControl)Flow);//Hardware flow control (RTS/CTS)
                //connect(serial, &QSerialPort::readyRead, this, &SerialPortEx::readyReadSlot,Qt::QueuedConnection);
                connect_flag = true;

                serial->moveToThread(&workerThread);
                connect(&workerThread, &QThread::finished, serial, &QObject::deleteLater);
                connect(serial, &SerialPortController::signal_ReadData, this, &SerialPortEx::signal_ReadData);
                workerThread.start();
                emit signal_ConnectStatus(true);

                return true;
            }

        }
        catch (...)
        {
            qCritical()<<"打开串口失败"<<port << ":" << baud;
        }
        return false;
    }
    void close()
    {
         serial->close();
    }

    void WriteData(QByteArray d)
    {
        if(!connect_flag)return;
        emit serial->signal_SendData(d);
    }
    void WriteData(QString val)
    {
        WriteData(val.toLatin1());
    }

    bool getConSts()
    {
        return connect_flag;
    }

    void waitReady(int time)
    {
        if(!connect_flag)return;

        if(time < 0)
        {
            qCritical()<<"SerialPortEx waitReady error msec "<<time;
        }
        QEventLoop Loop;
        QTimer::singleShot(time, &Loop, SLOT(quit()));
        Loop.exec();
    }

private:
    SerialPortController* serial;

    QString port_name ;
    bool connect_flag = false;

     QThread workerThread;

signals:
    void signal_ReadData(const QByteArray &d);
    void signal_ConnectStatus(bool status);
};

 

标签:在线,signal,QSerialPort,connect,SerialPortController,串口,serial,include,qt
From: https://www.cnblogs.com/dwx-bzdcxy/p/18212226

相关文章

  • C#串口通讯 源码Demo
    在C#中进行串口通讯主要涉及到以下几个步骤:引入命名空间usingSystem.IO.Ports;创建SerialPort对象SerialPortport=newSerialPort();设置串口属性//设置串口名:port.PortName="COM1";//设置波特率:port.BaudRate=9600;//设置校验位:port.Parity=Parity.None;//......
  • 基于Springboot的在线英语阅读分级平台(有报告)。Javaee项目,springboot项目。
    演示视频:基于Springboot的在线英语阅读分级平台(有报告)。Javaee项目,springboot项目。项目介绍:采用M(model)V(view)C(controller)三层体系结构,通过Spring+SpringBoot+Mybatis+Vue+Maven+Layui+Elementui来实现。MySQL数据库作为系统数据储存平台,实现了基于B/S结构的Web......
  • Qt moc系统的黑魔法?
    Qt的元对象系统(Meta-ObjectSystem)是Qt框架的核心功能之一,为C++语言增加了一些动态特性,借助元对象系统Qt可以实现以下功能信号与槽机制(SignalsandSlots)运行时类型信息(Run-TimeTypeInformation,RTTI)属性系统(PropertySystem)动态对象创建(DynamicObjectCreation)动态方法调......
  • QTreeView中item节点任意拖拽移动,添加,删除与自绘指示器
    文章目录效果图主要功能点概要遇到的问题指示器拖拽总结效果图主要功能点节点自由拖拽移动自绘树的指示器可拖拽添加节点概要整体还是对于model-view这一套的使用,左侧的实现可看我的这篇文章,本文具体讲讲这个树QTreeView的拖拽与自绘指示器。关于树......
  • 判断点在形状里,点在线段上
    /************************************************************************函数名: OnSegment功能描述: 判断点q是否在p1和p2的线段上(调试用)输入参数: p1线段端点1;p2线段端点2;q要判断的点;输出参数: 无返回值: ture点在线段上;false点不在线段上******......
  • 截图工具可以分为不同类型,包括操作系统自带的工具、第三方软件、在线截图工具等。以下
    截图工具可以分为不同类型,包括操作系统自带的工具、第三方软件、在线截图工具等。以下是常见的截图工具分类:操作系统自带工具:操作系统通常会内置基本的截图工具,例如:Windows:SnippingTool、Snip&Sketch、Windows键+PrintScreen(全屏截图)等。macOS:Grab、Preview、Shift......
  • C++/Qt桌面应用学习路线参考
    ......
  • 二维码生成器,一个支持多文件在线转二维码的的工具,免费二维码生成器
    随着科技的飞速发展,二维码已成为我们生活中不可或缺的一部分。从支付到信息分享,再到活动报名,二维码以其独特的优势,为我们带来了极大的便利。在众多二维码生成器平台中,易易二维码凭借其丰富的功能和卓越的性能,逐渐崭露头角,成为众多用户的首选。本文将对易易二维码生成器平台工具的......
  • PageOffice国产版用强制留痕模式在线编辑word文件
    #PageOffice国产版强制留痕模式编辑查看本示例演示效果本示例关键代码的编写位置Vue+Springboot注意PageOffice国产版支持统信UOS、银河麒麟等操作系统本文中展示的代码均为关键代码,复制粘贴到您的项目中,按照实际的情况,例如文档路径,用户名等做适当修改即可使用。Word中的“......
  • Mobexterm 串口换行错误
    问题描述使用Mobexterm连接串口时,在回显中存在换行错误问题,严重影响阅读串口数据。解决方法在左侧操作窗口中右击发生换行错误问题的窗口,比如我需要右击COM9右击后,在下拉列表中选择Editsession在该窗口下方三个选择项中,选择Terminalsettings,继续选择Expor......