Я пытаюсь читать и писать с последовательным портом.
Я создал класс с именем serial и связал его с readyRead на mainwindow.cpp.
QObject::connect(frm_serial->arduino,SIGNAL(readyRead()),frm_serial,SLOT(serialRead()));
Я читаю данные, когда я получил их, подключив сигнал в serial.cpp без каких-либо проблем.
Я пишу данные в serial.cpp тоже без проблем.
Но когда я попытался записать данные из другого класса «Программа неожиданно завершила».
Вот код метода подключения в другом классе
connect(this,SIGNAL(giden_seri(QString)),frm_serial,SLOT(serialWrite(QString)));
и строка отправляют код в другой класс
emit giden_seri(seri_mesaj);
Вот моя функция serialWrite в serial.cpp
void serial::serialWrite(QString gelen_seri)
{
arduino->write(gelen_seri.toStdString().c_str());
}
Кстати, я не могу не использовать никаких функций serialDevice, не только писать ….
Редактировать:
mainwindow.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
serial.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
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;
}
serial.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());
}
manuel.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;
}
}
Задача ещё не решена.
Других решений пока нет …