Auf dieser Seite

CAN-Bus-Manager

Das Beispiel sendet und empfängt CAN-Bus-Frames.

Das Beispiel sendet und empfängt CAN-Bus-Frames. Eingehende Frames werden nach ihrem Typ sortiert. Über einen Verbindungsdialog können die Parameter für die CAN-Bus-Verbindung angepasst werden.

Wichtige Qt Serial Bus in diesem Beispiel verwendete Klassen:

CAN-Manager mit Steuerelementen zum Senden von CAN-Frames (Frame-Typ, ID, Nutzdaten) und einer Tabelle der empfangenen CAN-Frames mit Zeitstempeln und Nutzdaten

Erstellen eines QCanBusDevice

Für jegliche CAN-Kommunikation ist eine Instanz von ` QCanBusDevice ` erforderlich.

Mit ` ConnectDialog ` lassen sich alle erforderlichen Parameter festlegen. Anschließend wird das Gerät unter Verwendung der angegebenen Plugin- und Schnittstellennamen erstellt:

    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);

Über die hergestellten Verbindungen können eingehende Frames verarbeitet, gesendete Frames gesteuert und Fehler behandelt werden.

Sobald das Gerät erstellt ist, verwenden Sie ` QCanBusDevice::connectDevice()` um die Kommunikation zu starten.

Verarbeitung eingehender Frames

QCanBusDevice gibt das Signal „ framesReceived()“ aus, sobald neue Frames verfügbar sind. Mit der Methode „ readFrame()“ kann ein einzelnes „ QCanBusFrame “ gelesen werden, sofern „ available frames “ vorhanden ist. Sobald der Frame empfangen wurde, können einzelne Parameter wie „ frameId “, „ timeStamp “ oder „ payload “ daraus extrahiert werden:

    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}));
    }

Frames senden

Um benutzerdefinierte Daten über den CAN-Bus zu senden, muss der Benutzer mindestens einen „ frameId “ und einen „ payload “ angeben. Optional können weitere „ QCanBusFrame “-Parameter konfiguriert werden:

    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);

Sobald der Frame vorbereitet ist, kann die Methode ` QCanBusDevice::writeFrame()` verwendet werden, um ihn zu senden:

    m_canDevice->writeFrame(frame);

Ausführen des Beispiels

Sie können das Beispiel wie folgt ausführen:

Beispielprojekt @ 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.