Bonjour a vous (: !

Merci d'avance si vous essayez de m'aider (:

Dans le cadre de mon BTS, je développe une application de connexion en MODBUS sur des sondes E4000 (Nanosense).
J'ai adapter mon code d'un exemple de QT 5.8 d'un Maitre MODBUS. Après avoir retiré toutes les partis d'IHM, je suis tomber sur une erreur de segmentation.
L'erreur se trouve au niveau de ces lignes de codes :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
auto reply = qobject_cast<QModbusReply* >(sender());
const QModbusDataUnit unit = reply->result();
La variable "reply" vaut 0 après la première ligne, et un pointeur qui vise sur 0, c'est pas super (:.
Il y a deux possibilité j'ai l’impression, soit la fonction sender() de QObject retourne 0 puisqu'elle n'est pas dans un slot (J'ai modifier ça et je l'ai déplacer dans un slot), soit le cast retourne 0 puisque l'objet QModbusReply n'est pas du même type que le résultat de sender(). Dans tous les cas c'est sur qu'avec le débug me prouve qu'avant l’erreur de segmentation, la variable "reply" vaut 0.

Pour avoir toutes les informations voilà mon code complet :

Le header :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
#ifndef CONNECTIONPORTSERIE_H
#define CONNECTIONPORTSERIE_H
 
class QModbusClient;
class QModbusReply;
class SettingsDialog;
class WriteRegisterModel;
 
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <QString>
#include <QModbusDevice>
#include <QModbusRtuSerialMaster>
#include <QtSerialPort/QSerialPort>
#include <QVariant>
#include <QModbusDataUnit>
#include <QUrl>
 
class ConnexionPortSerie : public QObject {
private:
        int parity = QSerialPort::NoParity;
        int baud = QSerialPort::Baud9600;
        int dataBits = QSerialPort::Data8;
        int stopBits = QSerialPort::OneStop;
        int responseTime = 3000;
        int numberOfRetries = 3;
        int addressNetwork = 1;
        int portNetwork = 502;
 
        QModbusClient *modbusDevice;
 
public:
        ConnexionPortSerie();
 
        QVariant const toVariant(QString);
        QModbusDataUnit readRequest() const;
        void read();
        void connection();
 
        int getParity();
        int getBaud();
        int getDataBits();
        int getStopBits();
        int getResponseTime();
        int getNumberOfRetries();
        int getAddressNetwork();
        int getPortNetwork();
 
        void setParity(int Parity);
        void setBaud(int Baud);
        void setDataBits(int DataBits) ;
        void setStopBits(int StopBits);
        void setResponseTime(int ResponseTime);
        void setNumberOfRetries(int NumberOfRetries);
        void setAddressNetwork(int AddressNetwork);
        void setPortNetwork(int PortNetwork);
 
        ~ConnexionPortSerie();
 
private slots :
        void readReady();
};
 
#endif // CONNECTIONPORTSERIE_H
le main :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include "connectionportserie.h"
 
#include <QCoreApplication>
 
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);
 
    ConnexionPortSerie * test = new ConnexionPortSerie();
    test->connection();
    test->read();
 
    return a.exec();
}
Le CPP:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
#include "connectionportserie.h"
#include <QCoreApplication>
 
 
ConnexionPortSerie::ConnexionPortSerie(){
 
}
 
ConnexionPortSerie::~ConnexionPortSerie()
{
 
}
 
void ConnexionPortSerie::connection(){
 
    modbusDevice = new QModbusRtuSerialMaster();
 
    const QString portCom("COM1");
 
    if (modbusDevice->state() != QModbusDevice::ConnectedState) {
        modbusDevice->setConnectionParameter(QModbusDevice::SerialPortNameParameter, toVariant(portCom));
        modbusDevice->setConnectionParameter(QModbusDevice::SerialParityParameter, this->getParity());
        modbusDevice->setConnectionParameter(QModbusDevice::SerialBaudRateParameter, this->getBaud());
        modbusDevice->setConnectionParameter(QModbusDevice::SerialDataBitsParameter, this->getDataBits());
        modbusDevice->setConnectionParameter(QModbusDevice::SerialStopBitsParameter, this->getStopBits());
        //modbusDevice->setConnectionParameter(QModbusDevice::NetworkAddressParameter, this->getAddressNetwork());
        //modbusDevice->setConnectionParameter(QModbusDevice::NetworkPortParameter, this->getPortNetwork());
        modbusDevice->setTimeout(this->getResponseTime());
        modbusDevice->setNumberOfRetries(this->getNumberOfRetries());
        //auto *reply = modbusDevice->sendReadRequest(readRequest(), 1);
 
    }
 
    if (!modbusDevice->connectDevice()) {
        std::cout<<"Connexion echoue"<<std::endl;
    }
 
    if (modbusDevice->state() == QModbusDevice::ConnectedState) {
        std::cout<<"Connexion reussis"<<std::endl;
    }
 
    /*modbusDevice->disconnectDevice();
 
    if (modbusDevice->state() != QModbusDevice::ConnectedState) {
        std::cout<<"Connexion eteinte"<<std::endl;
    }
*/
 
}
 
 
QModbusDataUnit ConnexionPortSerie::readRequest() const
{
    const auto table = static_cast<QModbusDataUnit::RegisterType> (QModbusDataUnit::InputRegisters);
 
    std::cout<<"Entree fonction readRequest"<<std::endl;
 
    int startAddress = 1;
    Q_ASSERT(startAddress >= 0 && startAddress < 10);
 
 
    int numberOfEntries = qMin(10, 15 - startAddress);
 
    std::cout<<"fonction readRequest(InputRegisters,adresse de depart,nombre de depart)"<<std::endl;
 
    return QModbusDataUnit(table, startAddress, numberOfEntries);
 
    std::cout<<"Fin de fonction readRequest"<<std::endl;
}
 
void ConnexionPortSerie::read()
{
    //modbusDevice->sendReadRequest(readRequest(), 1);
 
    std::cout<<"Entree fonction read"<<std::endl;
 
    if (auto *reply = modbusDevice->sendReadRequest(readRequest(),1)) {
        if (!reply->isFinished()) {
            readReady();
            std::cout<<"on definie la fonction d'envois avec tous les parametre plus le numero de l'esclave ici, et le lancement de la fonction readReady"<<std::endl;
        } else
            delete reply; // broadcast replies return immediately
    }
 
    std::cout<<"Fin de fonction read"<<std::endl;
}
 
void ConnexionPortSerie::readReady()
{
    std::cout<<"Entree fonction readReady"<<std::endl;
 
    auto reply = qobject_cast<QModbusReply* >(sender());
 
    std::cout<<"La variable reply a pris le resultat de la demande du maitre"<<std::endl;
 
    const QModbusDataUnit unit = reply->result();
    for (uint i = 0; i < unit.valueCount(); i++) {
        const QString entry = QObject::tr("Input Registers").arg(unit.startAddress()).arg(QString::number(unit.value(i),unit.registerType() <= QModbusDataUnit::Coils ? 10 : 16));
        std::cout<<&entry<<std::endl;
    }
    reply->deleteLater();
 
    std::cout<<"fin de fonction readReady"<<std::endl;
 
}
 
 
 
 
QVariant const ConnexionPortSerie::toVariant(QString _value) {
    return QVariant(_value);
}
 
int ConnexionPortSerie::getParity(){
    return parity;
}
 
int ConnexionPortSerie::getBaud(){
    return baud;
}
 
int ConnexionPortSerie::getDataBits(){
    return dataBits;
}
 
int ConnexionPortSerie::getStopBits(){
    return stopBits;
}
 
int ConnexionPortSerie::getResponseTime(){
    return responseTime;
}
 
int ConnexionPortSerie::getNumberOfRetries(){
    return numberOfRetries;
}
 
int ConnexionPortSerie::getAddressNetwork(){
    return addressNetwork;
}
 
int ConnexionPortSerie::getPortNetwork(){
    return portNetwork;
}
 
 
 
void ConnexionPortSerie::setParity(int Parity){
    parity=Parity;
}
 
void ConnexionPortSerie::setBaud(int Baud){
    baud=Baud;
}
 
void ConnexionPortSerie::setDataBits(int DataBits){
    dataBits=DataBits;
}
 
void ConnexionPortSerie::setStopBits(int StopBits){
    stopBits=StopBits;
}
 
void ConnexionPortSerie::setResponseTime(int ResponseTime){
    responseTime=ResponseTime;
}
 
void ConnexionPortSerie::setNumberOfRetries(int NumberOfRetries){
    numberOfRetries=NumberOfRetries;
}
 
void ConnexionPortSerie::setAddressNetwork(int AddressNetwork){
    addressNetwork=AddressNetwork;
}
 
void ConnexionPortSerie::setPortNetwork(int PortNetwork){
    portNetwork=PortNetwork;
}
Merci encore d'avance si vous avez accordé un petit peu de temps à mon problème (: