You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

QT6 QCanBus在MacOS下无法正确解码CAN帧问题求助

Qt 6.4.1 macOS下PEAK CAN接收帧解码异常问题

环境说明

使用Mac设备,遵循Qt官方的macOS配置文档及Qt SerialBus PEAK CAN文档操作,当前版本为QT6.4.1 for MacOS。

源设备CAN数据

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输出

# 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接收时,帧ID、负载长度及数据均正常:

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 Monitor截图验证接收正常)

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"

帧ID正确,但其他参数与预期不符:

帧ID预期扩展标识预期长度Qt扩展标识Qt长度
0x02否2否0
0x0A否8是6
0x0B否8否66

更换其他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();
}

内容的提问来源于stack exchange,提问作者Guy Radford

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 17:48:12