Liaison série QT-Arduino

Bonjour à tous ! je souhaiterais transmettre des données de mon Arduino Uno vers une application Qt programmée en C++. Les données en question sont des nombre compris entre 20 et 1000.
Au niveau de l'Arduino, aucun soucis. Le moniteur série print bien les nombre sans problème. Cependant au niveau de Qt, il a tendance à couper mes nombre. Par exemple pour le nombre 328, il va prendre que "28" en omettant le "3". Les 2 sont en Baud 9600.

Voici le code de la classe communication de mon application :

#include "seriallink.h"
#include <QDebug>

seriallink::seriallink(QObject *parent)
    : QObject{parent}
{
    _serial.setPortName("COM7");
    _serial.setBaudRate(QSerialPort::Baud9600);
    _serial.setDataBits(QSerialPort::Data8);
    _serial.setParity(QSerialPort::NoParity);
    _serial.setStopBits(QSerialPort::OneStop);
    _serial.setFlowControl(QSerialPort::NoFlowControl);

    connect(&_serial, &QSerialPort::readyRead, this, &seriallink::newData);
}
seriallink::~seriallink(){
    closeConnection();
}

void seriallink::openConnection(){
    if(!_serial.open(QIODevice::ReadWrite))
        qDebug() <<"Connection impossible";
    else qDebug() << "Connection ok";
}

void seriallink::write(const char* message){
    _serial.write(message);
}

void seriallink::closeConnection(){
    _serial.close();
}

bool seriallink::isOpen(){
    return _serial.isOpen();
}

bool seriallink::isWritable(){
    return _serial.isWritable();
}

void seriallink::newData(){
    emit gotNewData(_serial.readAll());
}

Ce code vient tout droit de cette vidéo :

Et voici le code qui exploite les données recus :

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

    arduino = new seriallink;
    arduino -> openConnection();
    //std::this_thread::sleep_for(std::chrono::nanoseconds(10));
    connect(arduino, &seriallink::gotNewData, this, &MainWindow::updateGUI);
}

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

void MainWindow::updateGUI(QByteArray data){
    if (data.toInt() >= 20)
    {
        ui->verticalSlider_2->setValue(map_(data.toInt(), 20, 1000, 0, 255));

        qDebug() << (map_(data.toInt(), 20, 1000, 0, 255)) << " == " << data;

        ui->lcdNumber->display(ui->lcdNumber->value()+data);
        ui->lcdNumber_2->display(ui->verticalSlider_2->value());
    }
}

Si quelqu'un peut m'éclaircir sur mon problème :slight_smile:

Merci d'avance !

il manque du code, par exemple où est déclarée _serial ?

Oui effectivement j'ai oublié de mettre le fichier .h :

#ifndef SERIALLINK_H
#define SERIALLINK_H

#include <QObject>
#include <QSerialPort>

class seriallink : public QObject
{
    Q_OBJECT
public:
    explicit seriallink(QObject *parent = nullptr);
    ~seriallink();

    void openConnection();
    void closeConnection();
    void write(const char* message);
    bool isOpen();
    bool isWritable();

private slots:
    void newData();

signals:
    void gotNewData(QByteArray data);

private:
    QSerialPort _serial;

};

#endif // SERIALLINK_H

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.