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. Zur Einstellung der CAN-Bus-Verbindungsparameter steht ein Verbindungsdialog zur Verfügung.
Schlüssel Qt Serial Bus Klassen, die in diesem Beispiel verwendet werden:
Erstellen eines QCanBusDevice
Eine Instanz von QCanBusDevice ist erforderlich, um eine CAN-Kommunikation durchzuführen.
Die ConnectDialog
ermöglicht die Angabe aller erforderlichen Parameter. Danach 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);
Die hergestellten Verbindungen ermöglichen es, eingehende Frames zu verarbeiten, die gesendeten Frames zu kontrollieren und Fehler zu behandeln.
Wenn das Gerät erstellt ist, verwenden Sie QCanBusDevice::connectDevice(), um die Kommunikation zu starten.
Verarbeitung eingehender Frames
QCanBusDevice gibt ein framesReceived()-Signal aus, wenn neue Frames verfügbar sind. Die Methode readFrame() kann verwendet werden, um ein einzelnes QCanBusFrame zu lesen, solange es available frames gibt. Sobald der Frame empfangen wurde, können einzelne Parameter wie frameId, timeStamp oder payload aus ihm 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})); }
Senden von Frames
Um benutzerdefinierte Daten über den CAN-Bus zu senden, muss der Benutzer mindestens ein frameId und ein payload bereitstellen. 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
Zum Ausführen des Beispiels von Qt Creatorzu starten, öffnen Sie den Modus Welcome und wählen Sie das Beispiel aus Examples. Weitere Informationen finden Sie unter Erstellen und Ausführen eines Beispiels.
© 2025 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.