Sur cette page

Gestionnaire de bus CAN

L'exemple envoie et reçoit des trames de bus CAN.

L'exemple envoie et reçoit des trames de bus CAN. Les trames entrantes sont classées en fonction de leur type. Une boîte de dialogue de connexion permet de régler les paramètres de connexion au bus CAN.

Clés Qt Serial Bus classes utilisées dans cet exemple :

Création d'un QCanBusDevice

Une instance de QCanBusDevice est nécessaire pour effectuer toute communication CAN.

Le site ConnectDialog permet de spécifier tous les paramètres requis. Ensuite, le dispositif est créé en utilisant les noms de plugin et d'interface fournis :

    QString errorString;
    m_canDevice.reset(QCanBus::instance()->createDevice(p.pluginName, p.deviceInterfaceName,
                                                        &errorString));
    connect(m_canDevice.get(), &QCanBusDevice::errorOccurred,
            this, &MainWindow::processErrors);
    connect(m_canDevice.get(), &QCanBusDevice::framesReceived,
            this, &MainWindow::processReceivedFrames);
    connect(m_canDevice.get(), &QCanBusDevice::framesWritten,
            this, &MainWindow::processFramesWritten);

Les connexions établies permettent de traiter les trames entrantes, de contrôler les trames envoyées et de gérer les erreurs.

Lorsque le dispositif est créé, utilisez QCanBusDevice::connectDevice() pour démarrer la communication.

Traitement des trames entrantes

QCanBusDevice émet un signal framesReceived() lorsque de nouvelles trames sont disponibles. La méthode readFrame() peut être utilisée pour lire une seule QCanBusFrame tant qu'il y a des available frames. Une fois la trame reçue, il est possible d'en extraire des paramètres individuels tels que frameId, timeStamp ou payload:

    while (m_canDevice->framesAvailable()) {
        m_numberFramesReceived++;
        const QCanBusFrame frame = m_canDevice->readFrame();

        QString data;
        if (frame.frameType() == QCanBusFrame::ErrorFrame)
            data = m_canDevice->interpretErrorFrame(frame);
        else
            data = QString::fromLatin1(frame.payload().toHex(' ').toUpper());

        const QString time = QString::fromLatin1("%1.%2  ")
                .arg(frame.timeStamp().seconds(), 10, 10, ' '_L1)
                .arg(frame.timeStamp().microSeconds() / 100, 4, 10, '0'_L1);

        const QString flags = frameFlags(frame);

        const QString id = QString::number(frame.frameId(), 16).toUpper();
        const QString dlc = QString::number(frame.payload().size());

        m_model->appendFrame(QStringList({QString::number(m_numberFramesReceived),
                                          time, flags, id, dlc, data}));
    }

Envoi de trames

Pour envoyer des données personnalisées sur le bus CAN, l'utilisateur doit fournir au moins un frameId et un payload. D'autres paramètres QCanBusFrame peuvent être configurés en option :

    const uint frameId = m_ui->frameIdEdit->text().toUInt(nullptr, 16);
    QString data = m_ui->payloadEdit->text();
    m_ui->payloadEdit->setText(formatHexData(data));
    const QByteArray payload = QByteArray::fromHex(data.remove(u' ').toLatin1());

    QCanBusFrame frame = QCanBusFrame(frameId, payload);
    frame.setExtendedFrameFormat(m_ui->extendedFormatBox->isChecked());
    frame.setFlexibleDataRateFormat(m_ui->flexibleDataRateBox->isChecked());
    frame.setBitrateSwitch(m_ui->bitrateSwitchBox->isChecked());

    if (m_ui->errorFrame->isChecked())
        frame.setFrameType(QCanBusFrame::ErrorFrame);
    else if (m_ui->remoteFrame->isChecked())
        frame.setFrameType(QCanBusFrame::RemoteRequestFrame);

Une fois la trame préparée, la méthode QCanBusDevice::writeFrame() peut être utilisée pour l'envoyer :

    m_canDevice->writeFrame(frame);

Exécution de l'exemple

Pour exécuter l'exemple à partir de Qt CreatorOuvrez le mode Welcome et sélectionnez l'exemple à partir de Examples. Pour plus d'informations, voir Qt Creator: Tutoriel : Construire et exécuter.

Exemple de projet @ code.qt.io

© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.