我正在嘗試使用帶有 QT 的 peakcan 插件從 canbus 讀取和列印幀,但我認為我在某處犯了錯誤。
這是我的代碼:
qDebug() << "connectCanDevice";
if (QCanBus::instance()->plugins().contains(QStringLiteral("peakcan"))) {
// plugin available
QString errorString;
QCanBusDevice *device = QCanBus::instance()->createDevice(
QStringLiteral("peakcan"), QStringLiteral("usb0"), &errorString);
if (!device) {
// Error handling goes here
qDebug() << "Device cannot be created";
} else {
qDebug() << "Bit Rate Configration";
device->setConfigurationParameter(QCanBusDevice::BitRateKey, 250000);
device->setConfigurationParameter(QCanBusDevice::DataBitRateKey, 100000);
device->errorOccurred(QCanBusDevice::ReadError);
if(device->connectDevice()) {
qDebug() << SIGNAL (framesReceived());
qDebug() << device->framesAvailable();
while(device->framesAvailable()) {
QCanBusFrame frame = device->readFrame();
QString test = frame.toString();
std::string text = test.toUtf8().constData();
qDebug()<<test;
std::cout<<text<<std::endl;
}
}
}
}
這是輸出:
connectCanDevice qt.canbus.plugins.peakcan:使用 PCAN-API 版本:4.6.1.728 位元率配置 qt.canbus.plugins.peakcan:不支持的資料位元率值:100000 2framesReceived() 0
作為一個初學者,我從qt檔案中看不太懂。我可以用 Pcanview 看到框架。canbus沒有問題。
uj5u.com熱心網友回復:
好的,我看到您在這里遺漏了一些要點,這是一個可以完成作業的簡單代碼示例:
if (QCanBus::instance()->plugins().contains(QStringLiteral("socketcan")))
{
QString errorString;
QCanBusDevice *device = QCanBus::instance()->createDevice(
QStringLiteral("socketcan"), QStringLiteral("can0"), &errorString);
if (!device)
{
qDebug() << errorString;
}
else
{
bool retval = device->connectDevice();
if(retval == false)
{
qDebug() << "cannot open CAN interface";
}
else
{
QObject::connect(device, &QCanBusDevice::framesReceived, [=] () {
while(device->framesAvailable() > 0)
{
auto frame = device->readFrame();
QString d = QString("%1 # ").arg(frame.frameId(), 3, 16, QChar('0'));
for(int i = 0;i < frame.payload().length();i )
{
d = QString("%1 ").arg(static_cast<uint8_t>(frame.payload().at(i)), 2, 16, QChar('0'));
}
qInfo() << d;
}
});
}
}
}
為了簡短起見,我在這里使用了 lambda 函式,但您可以根據需要使用其他選項。我也測驗了它,socketcan因為它使用pcan了驅動程式。簡短說明:我將QCanBusDevice::framesReceived信號連接到我的函式,該函式將在接收到幀時呼叫。然后我閱讀所有可用的幀并將其列印出來。您可以在此處
閱讀有關 Qt 信號/插槽機制的更多資訊
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/513280.html
標籤:C qtqml总线
