我使用的是 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 帧时,它正在错误地解码数据。
首先,这是源设备上的 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 文件相匹配,数据也被其他应用程序成功接收和解码。
通过 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]
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();
}