C++ Qt Serial无法从其他类使用

C++ Qt Serial无法从其他类使用,c++,qt,qtserialport,qtserial,C++,Qt,Qtserialport,Qtserial,我正在尝试用串口读写。 我创建了一个名为serial的类,并将其与mainwindow.cpp上的readyRead连接 QObject::connect(frm_serial->arduino,SIGNAL(readyRead()),frm_serial,SLOT(serialRead())); 当我通过在serial.cpp中连接信号接收数据时,我正在读取数据,没有任何问题 我在serial.cpp中写入数据也没有任何问题 但当我试图从另一个类写入数据时,“程序意外地完成了” 下面是

我正在尝试用串口读写。 我创建了一个名为serial的类,并将其与mainwindow.cpp上的readyRead连接

QObject::connect(frm_serial->arduino,SIGNAL(readyRead()),frm_serial,SLOT(serialRead()));
当我通过在serial.cpp中连接信号接收数据时,我正在读取数据,没有任何问题

我在serial.cpp中写入数据也没有任何问题

但当我试图从另一个类写入数据时,“程序意外地完成了”

下面是另一个类中connect方法的代码

    #ifndef MANUEL_H
    #define MANUEL_H

    #include <QWidget>
    #include <QString>

    #include "serial.h"

    #include <QDebug>
    #include <QByteArray>
    #include <QString>
    #include <QtSerialPort/QSerialPort>

    namespace Ui {
    class manuel;
    }

    class manuel : public QWidget
    {
        Q_OBJECT

    public:
        explicit manuel(QWidget *parent = 0);
        ~manuel();

    private slots:

        void seri_gonder();

    signals:
        void giden_veri(QString s);
        void giden_seri(QString veri);

    private:
        Ui::manuel *ui;
        QString seri_mesaj="";
        bool mesaj_hazir=0; // 0 yok , 1 Hazir
        serial *frm_serial;

    };

    #endif // MANUEL_H
connect(此,信号(giden_seri(QString)),frm_串行,插槽(serialWrite(QString))

和字符串在另一个类中发送代码

    #ifndef MANUEL_H
    #define MANUEL_H

    #include <QWidget>
    #include <QString>

    #include "serial.h"

    #include <QDebug>
    #include <QByteArray>
    #include <QString>
    #include <QtSerialPort/QSerialPort>

    namespace Ui {
    class manuel;
    }

    class manuel : public QWidget
    {
        Q_OBJECT

    public:
        explicit manuel(QWidget *parent = 0);
        ~manuel();

    private slots:

        void seri_gonder();

    signals:
        void giden_veri(QString s);
        void giden_seri(QString veri);

    private:
        Ui::manuel *ui;
        QString seri_mesaj="";
        bool mesaj_hazir=0; // 0 yok , 1 Hazir
        serial *frm_serial;

    };

    #endif // MANUEL_H
emit giden_seri(seri_mesaj)

这是我在serial.cpp中的serialWrite函数

void serial::serialWrite(QString gelen_seri)
{
    arduino->write(gelen_seri.toStdString().c_str());
}
    #include "serial.h"

serial::serial(QObject *parent) :
    QObject(parent)
{
}


void serial::ard_kontrol()
{
    arduino_is_available=false;
    arduino_port_name="";
    serialBuffer="";
    arduino = new QSerialPort;

    foreach (const QSerialPortInfo &serialPortInfo,     QSerialPortInfo::availablePorts()) {
        if(serialPortInfo.hasProductIdentifier() && serialPortInfo.hasVendorIdentifier())
        {
            if(serialPortInfo.serialNumber() == arduino_seri)
            {
                arduino_port_name= serialPortInfo.portName();
                arduino_is_available=true;
            }
        }

    }

    if(arduino_is_available)
    {
        qDebug() << "Arduino var : " << arduino_port_name ;
        arduino->setPortName(arduino_port_name);
        arduino->open(QSerialPort::ReadWrite);
        arduino->setBaudRate(QSerialPort::Baud9600);
        arduino->setDataBits(QSerialPort::Data8);
        arduino->setParity(QSerialPort::NoParity);
        arduino->setStopBits(QSerialPort::OneStop);
        arduino->setFlowControl(QSerialPort::NoFlowControl);
    }

    else
        qDebug() << "Arduino yok";
}

void serial::serialRead()
{
    serialBuffer.append(arduino->readAll());
    if(serialBuffer.indexOf(bas) >=0 && serialBuffer.indexOf(son) >= 0)
    {    serialBuffer=serialBuffer.mid(serialBuffer.indexOf(bas)+bas.length(),serialBuffer.indexOf(son)-(serialBuffer.indexOf(bas)+bas.length()));
        qDebug() << serialBuffer;
        serialBuffer="";
   }
}    

void serial::serialWrite(QString gelen_seri)
{
    arduino->write(gelen_seri.toStdString().c_str());
}
顺便说一下,我不能不使用serialDevice的任何功能,不仅仅是写

编辑:

主窗口

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "serial.h"

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

private:
    Ui::MainWindow *ui;
    manuel frm_manuel;
    serial *frm_serial = new serial;
};

#endif // MAINWINDOW_H
\ifndef主窗口
#定义主窗口
#包括
#包括“serial.h”
名称空间用户界面{
类主窗口;
}
类主窗口:公共QMainWindow
{
Q_对象
私人:
Ui::MainWindow*Ui;
manuel frm_manuel;
串行*frm_串行=新串行;
};
#endif//main窗口
连载

#ifndef SERIAL_H
#define SERIAL_H

#include <QObject>
#include <QtSerialPort/QSerialPort>
#include <QtSerialPort/QSerialPortInfo>
#include <QDebug>
#include <QByteArray>
#include <QString>

class serial : public QObject
{
    Q_OBJECT
public:
    explicit serial(QObject *parent = 0);
    QSerialPort *arduino;
    const QString arduino_seri = "75533353637351110171";
    QString arduino_port_name;
    bool arduino_is_available;

    QString serialBuffer;
    QString bas="cagri",son="deniz";

signals:

public slots:
    void ard_kontrol();

    void serialRead();

    void serialWrite(QString gelen_seri);

};

#endif // SERIAL_H
\ifndef SERIAL\u H
#定义序列号
#包括
#包括
#包括
#包括
#包括
#包括
类序列号:公共QObject
{
Q_对象
公众:
显式串行(QObject*parent=0);
QSerialPort*arduino;
const QString arduino_seri=“75535363735110171”;
QString arduino_港口名称;
布尔·阿杜伊诺可用;
QString串行缓冲区;
QString bas=“cagri”,son=“deniz”;
信号:
公众时段:
void ard_kontrol();
void serialRead();
无效串行写入(QString gelen_seri);
};
#endif//SERIAL_H
manuel.h(我的另一个班级)

\ifndef MANUEL\u H
#定义MANUEL_H
#包括
#包括
#包括“serial.h”
#包括
#包括
#包括
#包括
名称空间用户界面{
曼努埃尔类;
}
类manuel:公共QWidget
{
Q_对象
公众:
显式manuel(QWidget*parent=0);
~manuel();
专用插槽:
void seri_gonder();
信号:
无效giden_veri(QString s);
void giden_seri(QString veri);
私人:
Ui::manuel*Ui;
QString seri_mesaj=“”;
布尔梅萨杰乌哈齐尔=0;//0约克,1哈齐尔
序列号*frm_序列号;
};
#完//MANUEL_H
mainWindow.cpp

    #include "mainwindow.h"
    #include "ui_mainwindow.h"
    #include <QPixmap>
    #include <QObject>


    bool auto_flag=0;

    MainWindow::MainWindow(QWidget *parent) :
        QMainWindow(parent),
        ui(new Ui::MainWindow)
    {
        ui->setupUi(this);
        frm_serial->ard_kontrol();

        QObject::connect(frm_serial->arduino,SIGNAL(readyRead()),frm_serial,SLOT(serialRead()));

    }

    MainWindow::~MainWindow()
    {
        delete ui;
    }
#包括“mainwindow.h”
#包括“ui_main window.h”
#包括
#包括
bool auto_标志=0;
主窗口::主窗口(QWidget*父窗口):
QMainWindow(父级),
用户界面(新用户界面::主窗口)
{
用户界面->设置用户界面(此);
frm_serial->ard_kontrol();
连接(frm_串行->arduino,信号(readyRead()),frm_串行,插槽(serialRead());
}
MainWindow::~MainWindow()
{
删除用户界面;
}
serial.cpp

void serial::serialWrite(QString gelen_seri)
{
    arduino->write(gelen_seri.toStdString().c_str());
}
    #include "serial.h"

serial::serial(QObject *parent) :
    QObject(parent)
{
}


void serial::ard_kontrol()
{
    arduino_is_available=false;
    arduino_port_name="";
    serialBuffer="";
    arduino = new QSerialPort;

    foreach (const QSerialPortInfo &serialPortInfo,     QSerialPortInfo::availablePorts()) {
        if(serialPortInfo.hasProductIdentifier() && serialPortInfo.hasVendorIdentifier())
        {
            if(serialPortInfo.serialNumber() == arduino_seri)
            {
                arduino_port_name= serialPortInfo.portName();
                arduino_is_available=true;
            }
        }

    }

    if(arduino_is_available)
    {
        qDebug() << "Arduino var : " << arduino_port_name ;
        arduino->setPortName(arduino_port_name);
        arduino->open(QSerialPort::ReadWrite);
        arduino->setBaudRate(QSerialPort::Baud9600);
        arduino->setDataBits(QSerialPort::Data8);
        arduino->setParity(QSerialPort::NoParity);
        arduino->setStopBits(QSerialPort::OneStop);
        arduino->setFlowControl(QSerialPort::NoFlowControl);
    }

    else
        qDebug() << "Arduino yok";
}

void serial::serialRead()
{
    serialBuffer.append(arduino->readAll());
    if(serialBuffer.indexOf(bas) >=0 && serialBuffer.indexOf(son) >= 0)
    {    serialBuffer=serialBuffer.mid(serialBuffer.indexOf(bas)+bas.length(),serialBuffer.indexOf(son)-(serialBuffer.indexOf(bas)+bas.length()));
        qDebug() << serialBuffer;
        serialBuffer="";
   }
}    

void serial::serialWrite(QString gelen_seri)
{
    arduino->write(gelen_seri.toStdString().c_str());
}
#包括“serial.h”
串行::串行(QObject*父对象):
QObject(父对象)
{
}
void serial::ard_kontrol()
{
arduino_可用=错误;
arduino_port_name=“”;
serialBuffer=“”;
arduino=新的QSerialPort;
foreach(常量QSerialPortInfo和serialPortInfo,QSerialPortInfo::availableport()){
if(serialPortInfo.hasProductIdentifier()&&serialPortInfo.hasVendorIdentifier())
{
如果(serialPortInfo.serialNumber()==arduino\u seri)
{
arduino_port_name=serialPortInfo.portName();
arduino_可用=真;
}
}
}
如果(arduino_可用)
{
qDebug()打开(QSerialPort::ReadWrite);
arduino->setBaudRate(QSerialPort::Baud9600);
arduino->setDataBits(QSerialPort::Data8);
arduino->setParity(QSerialPort::NoParity);
arduino->setStopBits(QSerialPort::OneStop);
arduino->setFlowControl(QSerialPort::NoFlowControl);
}
其他的
qDebug()readAll());
if(serialBuffer.indexOf(bas)>=0&&serialBuffer.indexOf(son)>=0)
{serialBuffer=serialBuffer.mid(serialBuffer.indexOf(bas)+bas.length(),serialBuffer.indexOf(son)-(serialBuffer.indexOf(bas)+bas.length());
qDebug()写入(gelen_seri.toStdString().c_str());
}
曼努埃尔

#include "manuel.h"
#include "ui_manuel.h"
#include <QDebug>
#include <QPixmap>

manuel::manuel(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::manuel)
{
    ui->setupUi(this);
    frm_serial=new serial();
    connect(this,SIGNAL(giden_veri(QString)),frm_uyari,SLOT(gelen_veri(QString)));
    connect(this,SIGNAL(giden_seri(QString)),frm_serial,SLOT(serialWrite(QString)));
}

manuel::~manuel()
{
    delete ui;
}


void manuel::seri_gonder()
{
    if(mesaj_hazir)
    {
        emit giden_seri(seri_mesaj);
        mesaj_hazir=0;
    }
}
#包括“manuel.h”
#包括“ui_manuel.h”
#包括
#包括
manuel::manuel(QWidget*父项):
QWidget(母公司),
用户界面(新用户界面::曼努埃尔)
{
用户界面->设置用户界面(此);
frm_serial=新的serial();
连接(此,信号(giden_veri(QString)),frm_uyari,插槽(gelen_veri(QString));
连接(此,信号(giden_seri(QString)),frm_串行,插槽(serialWrite(QString));
}
曼努埃尔::~manuel()
{
删除用户界面;
}
void manuel::seri_gonder()
{
如果(梅萨杰乌哈齐尔)
{
排放吉登塞里(塞里梅萨);
mesaj_hazir=0;
}
}

您可以共享完整的代码。当然,它可能很复杂。我发现了一些东西。当我从另一个类检查serail端口的可用性时,它显示“未打开/可写/可读…”.但是当我从自己的类中检查它时,它是打开的。我在任何地方都不会关闭它。我如何从另一个类中打开序列号?请共享您的代码或简化的内容,但复制错误。您可以通过github或类似介质共享它。我已尝试过您的代码,如果无法执行,则很难提供帮助,因为它们丢失了正在加载.ui文件、.pro文件和其他文件。如果您可以将其发送到我的电子邮件:e。yllanescucho@gmail.com