QT6 QCanBus 无法正确解码帧

问题描述 投票:0回答:0

我使用的是 Mac 并且遵循了 https://doc.qt.io/qt-6/macos.html & https://doc.qt.io/qt-6/qtserialbus-peakcan-overview.html 文档。

我正在使用

QT6.4.1 for MacOS
.

当 QT 收到 Can 帧时,它正在错误地解码数据。

源设备上的 CAN 数据

首先,这是源设备上的 DBC 文件和

candump
数据:

DBC文件:

BO_ 2 Time: 2 ECU
 SG_ Minutes : 8|8@1+ (1,0) [0|0] "min" Vector__XXX
 SG_ Hours : 0|8@1+ (1,0) [0|0] "hrs" Vector__XXX

BO_ 10 GPS_SpeedTrackAlt: 8 ECU
 SG_ Altitude : 32|16@1- (0.1,0) [0|0] "Meters" Vector__XXX
 SG_ Track : 16|16@1+ (0.1,0) [0|359.9] "Degrees" Vector__XXX
 SG_ Speed : 0|16@1+ (0.1,0) [0|0] "mph" Vector__XXX

BO_ 11 GPS_Location: 8 ECU
 SG_ Longitude : 32|32@1+ (1,0) [-180|180] "Degrees" Vector__XXX
 SG_ Latitude : 0|32@1+ (1,0) [-90|90] "Degrees" Vector__XXX

源设备上

candump can0
的转储输出:

# candump can0
  can0  00A   [8]  00 00 0D 00 CE 01 00 00
  can0  00B   [8]  CA 2F 4D 42 22 66 AC BE
  can0  00A   [8]  00 00 0D 00 CE 01 00 00
  can0  00B   [8]  CA 2F 4D 42 24 66 AC BE

  ...

  can0  00A   [8]  00 00 0D 00 CC 01 00 00
  can0  00B   [8]  CB 2F 4D 42 45 66 AC BE
  can0  002   [2]  06 35
  can0  00A   [8]  00 00 0D 00 CD 01 00 00
  can0  00B   [8]  CB 2F 4D 42 49 66 AC BE

正如您所见,正在生成的 CAN 数据与 DBC 文件相匹配,数据也被其他应用程序成功接收和解码。

在我的 Mac 上

通过 Python 或 MacCAN Monitor 工具接收 CAN 数据时数据正确显示。 ID 正确,有效载荷长度正确,数据正确。 (实际有效载荷会随着时间的推移略有不同,因此有效载荷内的实际数据略有不同,但数据的形状是一致的。)

Python输出:

ID=00A LEN=8 DATA=[00 00 47 0A 6E 02 00 00]
ID=00B LEN=8 DATA=[E9 2F 4D 42 0E 67 AC BE]
ID=00A LEN=8 DATA=[00 00 47 0A 6D 02 00 00]
ID=00B LEN=8 DATA=[E9 2F 4D 42 28 66 AC BE]
ID=002 LEN=2 DATA=[06 3A 00 00 00 00 00 00]
ID=00A LEN=8 DATA=[00 00 47 0A 6A 02 00 00]
ID=00B LEN=8 DATA=[EA 2F 4D 42 CA 65 AC BE]
ID=00A LEN=8 DATA=[00 00 47 0A 6E 02 00 00]

MacCan 显示器的输出 MacCAN Monitor Screen Grab

QT输出

这是 Qt 的调试输出

qDebug() << canFrame.toString() << " Payload: " << canFrame.payload();

"0000000A   [6]  E3 00 00 00 00 00"  Payload:  "\xE3\x00\x00\x00\x00\x00"
"     00B  [66]  Remote Request"  Payload:  "\x06^\xAC\xBE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xC4\x00\x00`\x00\x00\x10/!\x00\x00`\x00\x00)\x00@\xFF""e>'\xB8\n\x00\x00 E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"0000000A   [6]  E3 00 00 00 00 00"  Payload:  "\xE3\x00\x00\x00\x00\x00"
"     00B  [66]  Remote Request"  Payload:  "\x06^\xAC\xBE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xC4\x00\x00`\x00\x00\x10/!\x00\x00`\x00\x00)\x00@\xFF""e>'\xB8\n\x00\x00 E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"     002   [0]"  Payload:  ""
"0000000A   [6]  E3 00 00 00 00 00"  Payload:  "\xE3\x00\x00\x00\x00\x00"
"     00B  [66]  Remote Request"  Payload:  "\x07^\xAC\xBE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xC4\x00\x00`\x00\x00\x10/!\x00\x00`\x00\x00)\x00@\xFF""e>'\xB8\n\x00\x00 E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"0000000A   [6]  E3 00 00 00 00 00"  Payload:  "\xE3\x00\x00\x00\x00\x00"
"     00B  [66]  Remote Request"  Payload:  "\x07^\xAC\xBE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xC4\x00\x00`\x00\x00\x10/!\x00\x00`\x00\x00)\x00@\xFF""e>'\xB8\n\x00\x00 E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"0000000A   [6]  E3 00 00 00 00 00"  Payload:  "\xE3\x00\x00\x00\x00\x00"
"     00B  [66]  Remote Request"  Payload:  "\t^\xAC\xBE\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80\xC4\x00\x00`\x00\x00\x10/!\x00\x00`\x00\x00)\x00@\xFF""e>'\xB8\n\x00\x00 E\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
"0000000A   [6]  E4 00 00 00 00 00"  Payload:  "\xE4\x00\x00\x00\x00\x00"

您可以看到 QT 的输出与预期不同,帧 ID 是正确的:

帧ID 预期的扩展 ID 预计长度 QT 扩展 ID QT 长度
0x02 没有 2 没有 0
0x0A 没有 8 66
0x0B 没有 8 没有 6

我尝试过其他 CAN 源并看到同样的问题。

这是我正在运行的重现问题和调试输出的代码:

CanBusTest.pro

QT += quick serialbus

SOURCES += \
        main.cpp

resources.files = main.qml 
resources.prefix = /$${TARGET}
RESOURCES += resources

# Additional import path used to resolve QML modules in Qt Creator's code model
QML_IMPORT_PATH =

# Additional import path used to resolve QML modules just for Qt Quick Designer
QML_DESIGNER_IMPORT_PATH =

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

QMAKE_APPLE_DEVICE_ARCHS = x86_64 arm64

main.cpp

#include <QCanBus>
#include <QGuiApplication>
#include <QQmlApplicationEngine>

class FrameReceiver : public QObject {
  public:
    FrameReceiver(QObject *parent = nullptr, QCanBusDevice *device = nullptr) {
        this->device = device;
        connect(device, &QCanBusDevice::framesReceived, this, &FrameReceiver::onNewFrame);
    }
  public slots:
    void onNewFrame(void) {
        while (this->device->framesAvailable()) {
            QCanBusFrame canFrame = this->device->readFrame();
            qDebug() << canFrame.toString() << " Payload: " << canFrame.payload();

        }
    }

  private:
    QCanBusDevice *device;
};

int main(int argc, char *argv[]) {
    QGuiApplication app(argc, argv);

    QString errorString;
    QCanBusDevice *device =
        QCanBus::instance()->createDevice(QStringLiteral("peakcan"), QStringLiteral("usb0"), &errorString);

    device->setConfigurationParameter(QCanBusDevice::BitRateKey, QVariant::fromValue(250000));
    qDebug() << "Can Device: " << device;
    device->connectDevice();

    FrameReceiver *frameReceiver = new FrameReceiver(nullptr, device);

    QQmlApplicationEngine engine;
    const QUrl url(u"qrc:/CanBusTest/main.qml"_qs);
    QObject::connect(
        &engine, &QQmlApplicationEngine::objectCreated, &app,
        [url](QObject *obj, const QUrl &objUrl) {
            if (!obj && url == objUrl)
                QCoreApplication::exit(-1);
        },
        Qt::QueuedConnection);
    engine.load(url);

    return app.exec();
}
macos qt can-bus qt6
© www.soinside.com 2019 - 2024. All rights reserved.