Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.9.1 - Qt Creator : 4.4.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Instancier dynamiquement QML

Bonjour,

Actuellement, J'ai fait un soft qui communique avec plusieurs Arduino, ils sont tous relier à un port de mon PC.

Je souhaite proposer un 2ème mode de communication où les Arduino sont en parallèle via RS422 et donc un seul port COM sur le PC pour tous.

Je défini quel mode de communication je souhaite utilisé au démarrage du soft avec un .ini.


Ma problématique, c'est comment organiser mon programme pour que les 2 modes cohabitent.

C'est à dire que dans la première situation que j'ai actuellement, j'ai un objet QML où j'instancie une classe C++ qui gère la communication. Je répète cet objet à chaque module arduino et je n'ai donc rien à faire (simple et efficace).
Mais en revanche, si je souhaite communiquer avec un seul port COM, il faut que je fasse appel à cette classe C++ qu'une fois seulement.

Exemple :

Actuellement
-------------------------
Objet QML { // Répéter pour chaque module

SerialCom { // Ma classe communication qui utilise un port COM
}
...
}
-------------------------
Deuxième mode (comme je l'imagine)
-------------------------
Application {

SerialCom { // Ma classe communication qui utilise un port COM
}

Objet QML { // Répéter pour chaque module

SerialCom { // Ne dois plus être instancier
}
...
}
Objet QML { // Répéter pour chaque module

SerialCom { // Ne dois plus être instancier
}
...
}
...

}
-------------------------
J'espère que j'ai réussi à expliquer mon problème correctement... mon soucis est surtout comment m'y prendre.

- Est ce que je peux créer un objet QML dans une condition ? Est-ce la meilleur solution ?

- Ou bien est ce que je peux dans ma classe SerialCom créer un "attribut de classe" (static QSerialPort serial) que j'utiliserai seulement dans le cas d'un seul port COM ? (ne me taper pas je ne pense pas que cette utilisation existe mais au cas ou ! #-o )

Merci pour vos conseils.

Réponses

  • 11 Sep modifié
    Bonsoir,
    ils sont tous relier à un port de mon PC
    A travers un liaison USB je suppose ?
    Tu utilises des Arduino officiel (donc avec un FTDI) ou des clones (donc avec le CH430 je ne sais plus) ?
    les Arduino sont en parallèle via RS422 et donc un seul port COM sur le PC
    A travers un adaptateur ? Lequel ?
  • Merci loupium mais mon problème ne se trouve pas ici... par défaut les arduino communiqueront en parallèle et en cas de débogage je basculerai sur une communication un arduino par port.

    Mon problème est plus sur l'architecture du soft, si une des solutions que j'ai cité avant reste correcte à réaliser
  • Hello,

    Tu n'as pas précisé comment tu utilises "SerialCom", mais tu peux peut-être t'en sortir avec une seule classe de comm.

    Le Loader QML pourrait être une solution, mais c'est pas très "propre" à mon goût, ça serait vite le bordel de gérer si SerialCom existe/n'existe pas...
    Tu pourrais avoir un singleton, mais c'est pas tip top non plus.

    L'idéal serait que ce soit transparent, mais c'est un peu plus compliqué à mettre en place. Quelque chose comme une classe "mère" qui gère toute la comm (le ou les ports), instanciée une seule fois, et des interfaces (une autre classe) "connectées" à la classe mère, cette dernière leur envoyant les données qui les concernent individuellement (comme si chaque interface avait son propre port com).
    L'interface pourrait "s'enregistrer" auprès de la classe mère (via une propriété par ex), la classe mère tient une liste des interfaces et leur envoi des données soit depuis "leur" port com (si chacun son port) soit depuis le bus RS422 (qui a un protocole pour différencier les cartes je suppose) qui est filtré par la classe mère (et pareil dans l'autre sens, pour envoyer).
    J'ai pas réussi à me rappeler d'exemples qui font un truc comme ça mais ça doit exister ;-)

    Ou encore, le premier SerialCom qui est toujours créé, et les suivants qui soit utilisent le premier, soit se connectent aux leur... (en QML ou en C++)

    Voilà quelques idées...
  • Qu'est ce qui t'empêche de créer le `SerialCom` une seule fois et de le référencer ensuite dans tes objets pour les modules par id ? Tu les utilises comment actuellement tes `SerialCom` ?

    Ou ne pourrais-tu pas le créer côté c++ et juste l'exposer au qml en tant que context property ?
Connectez-vous ou Inscrivez-vous pour répondre.