Sur cette page

Gestionnaire de bus CAN

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

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

Principales Qt Serial Bus utilisées dans cet exemple :

Gestionnaire CAN avec commandes d'envoi de trames CAN (type de trame, ID, charge utile) et tableau des trames CAN reçues indiquant les horodatages et les charges utiles

Création d'un QCanBusDevice

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

ConnectDialog permet de spécifier tous les paramètres requis. Le périphérique est ensuite créé à l'aide des 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.

Une fois le périphérique 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() permet de lire une seule QCanBusFrame tant qu’il y a des available frames. Une fois la trame reçue, des paramètres individuels tels que frameId, timeStamp ou payload peuvent en être extraits :

    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 minimum un frameId et un payload. D’autres paramètres QCanBusFrame peuvent être configurés de manière facultative :

    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

Vous pouvez exécuter l’exemple à partir de :

Exemple de projet sur 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.