En esta página

Gestor del bus CAN

El ejemplo envía y recibe tramas de bus CAN.

El ejemplo envía y recibe tramas de bus CAN. Las tramas entrantes se ordenan según su tipo. Se proporciona un diálogo de conexión para ajustar los parámetros de conexión del bus CAN.

Claves Qt Serial Bus utilizadas en este ejemplo:

Creación de un QCanBusDevice

Se requiere una instancia de QCanBusDevice para realizar cualquier comunicación CAN.

El ConnectDialog permite especificar todos los parámetros requeridos. A continuación se crea el dispositivo utilizando los nombres de plugin e interfaz proporcionados:

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

Las conexiones establecidas permiten procesar las tramas entrantes, controlar las tramas enviadas y gestionar los errores.

Una vez creado el dispositivo, utilice QCanBusDevice::connectDevice() para iniciar la comunicación.

Procesamiento de tramas entrantes

QCanBusDevice emite una señal framesReceived() cuando hay nuevas tramas disponibles. El método readFrame() se puede utilizar para leer una sola QCanBusFrame mientras haya available frames. Una vez recibida la trama, se pueden extraer de ella parámetros individuales como frameId, timeStamp, o 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}));
    }

Envío de tramas

Para enviar datos personalizados a través del bus CAN, el usuario necesita proporcionar al menos un frameId y un payload. Opcionalmente se pueden configurar otros parámetros QCanBusFrame:

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

Una vez preparada la trama, se puede utilizar el método QCanBusDevice::writeFrame() para enviarla:

    m_canDevice->writeFrame(frame);

Ejecutar el ejemplo

Para ejecutar el ejemplo desde Qt Creator, abra el modo Welcome y seleccione el ejemplo de Examples. Para más información, consulte Qt Creator: Tutorial: Construir y ejecutar.

Proyecto de ejemplo @ 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.