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
相关产品推荐
相关产品推荐

