0

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

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

当我通过在serial.cpp中连接信号接收数据时,我正在读取数据,没有任何问题。

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

但是当我尝试从另一个类写入数据时“程序意外完成”。

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

connect(this,SIGNAL(giden_seri(QString)),frm_serial,SLOT(serialWrite(QString)));

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

emit giden_seri(seri_mesaj);

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

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

顺便说一句,我不能不使用serialDevice的任何功能,不仅写....

编辑:

主窗口.h

#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

串行.h

#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

manuel.h(我的另一堂课)

    #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

主窗口.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;
    }

串行.cpp

    #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());
}

手册.cpp

#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;
    }
}

Github 仓库

4

0 回答 0