Important: Please read the Qt Code of Conduct - https://forum.qt.io/topic/113070/qt-code-of-conduct

Do not succeed in reading and writting frames with peak system



  • Hi all,

    I've bought a PCAN-USB FD system to link my PC to an embedded system. The communication works well between my embedded system and PCAN-VIEW.

    Then, I imported PCANBasic.lib from the PCAN_Basic_API into my Qt Project (Qt 5.12.5 MinGW 64-bit). I copied the PCANBasic.dll in my executable folder. I checked that the plugin is available and that the QcanBusDevice is well connected to the can bus. However, I do not succeed in receiving or sending frames in my Qt Project: no communication with PCAN-VIEW or my embedded system

    Below is my Qt project. Any help would be appreciated.

    #include <windows.h>
    #include <math.h>
    
    #include <QtSerialBus>
    #include <QCanBus>
    #include <QCanBusDevice>
    #include <QCanBusFrame>
    
    #include <QDebug>
    #include <QThread>
    
    can::can()
    {
    
        if (QCanBus::instance()->plugins().contains(QStringLiteral("peakcan"))) {
            // plugin available
            qDebug() << "plugin available";
        }
    
        QString errorString;
    
        const QList<QCanBusDeviceInfo> devices = QCanBus::instance()->availableDevices(
            QStringLiteral("peakcan"), &errorString);
        if (!errorString.isEmpty())
            qDebug() << errorString;
    
        QCanBusDevice *device = QCanBus::instance()->createDevice(
                    QStringLiteral("peakcan"), QStringLiteral("usb0"), &errorString);
    
        if (!device) {
            // Error handling goes here
            qDebug() << errorString;
        } else {
            device->setConfigurationParameter(5,0);
            device->setConfigurationParameter(4,250000);
            //device->setConfigurationParameter(5,1);
            //device->setConfigurationParameter(6,250000);
            device->connectDevice();
            qDebug()<<device->state(); // ConnectedState
        }
    
        QCanBusFrame frame;
        frame.setFrameId(0x400);
        frame.setFrameType(QCanBusFrame::DataFrame);
        QByteArray payload("AAAA");
        frame.setPayload(payload);
    
        while(1)
        {
        device->writeFrame(frame);
        //Sleep(500);
        }
    
        /*QCanBusFrame frame2;
        frame2.setFrameId(0x500);
        frame2.setFrameType(QCanBusFrame::DataFrame);
    
        while (1)
        {
            if (device->framesAvailable()!=0)
            {
            frame2 = device->readFrame();
            qDebug() << frame2.payload();
            }
    
        }*/
    
    }
    
    
    TEMPLATE = app
    QT += network
    #QT += webkit
    QT += sql
    QT += widgets
    QT += serialbus
    QT += core
    TARGET = proto
    DEPENDPATH += .
    INCLUDEPATH += .
    
    HEADERS += \
        can.h \
    
    SOURCES += \
        can.cpp \
        main.cpp
    
    LIBS += "C:/Users/etudes/Desktop/PCAN_Basic_API/x64/VC_LIB/PCANBasic.lib"
    
    INCLUDEPATH += "C:/Users/etudes/Desktop/PCAN_Basic_API/x64"

  • Qt Champions 2019

    @Jules31 said in Do not succeed in reading and writting frames with peak system:

    while(1)
    {
    device->writeFrame(frame);
    //Sleep(500);
    }

    Please do not use endless-loops with Qt!



  • You are right. I've done a hundred tests trying to solve this issue.


  • Qt Champions 2019

    @Jules31 writeFrame() returns a bool - did you check what you get?
    Also, there are two methods to get error code/string - did you check them?



  • I've done these tests with the following source code:

        while(1)
        {
        qDebug()<<device->writeFrame(frame);
        qDebug()<<device->errorString();
        Sleep(500);
        }
    

    writFrame() returns "true".
    error() returns "QCanBusDevice::NoError".


  • Lifetime Qt Champion

    Hi @Jules31,

    please try the CAN example first. You can also start it from Qt Creator.

    Note that for 64 bit Qt you will need a 64 bit pcanbasic.dll.

    As said before, don't use sleep in event driven programs. It will block the event loop and that blocks the correct program execution.

    Regards



  • Hi,

    The example does not compile.

    I now use a signal but it still does not word:

    connect(device, &QCanBusDevice::framesReceived, this, &can::onFramesReceived);
    
    void can::onFramesReceived() {
        qDebug() << "[Frame received] !";
    }
    
    

  • Qt Champions 2019

    @Jules31 Are you sure the other side is responding?


  • Lifetime Qt Champion

    Hi @Jules31,

    The example does not compile.

    Please post the exact compiler error. The example should compile and run just fine.

    Also, in your first post you wrote:

    Then, I imported PCANBasic.lib from the PCAN_Basic_API into my Qt Project

    That is not needed. The pcanbasic.dll is loaded dynamically at runtime.



  • @aha_1980

    I disabled the "ResetCanController" option and I now get the error "Cannot load library pcanbasic".

    ed88eb9a-b009-473f-9f9c-3d1f958bc440-image.png



  • @jsulm
    Yes, it is responding because I receivre frames with Pcan-View.


  • Lifetime Qt Champion

    @Jules31 said in Do not succeed in reading and writting frames with peak system:

    I disabled the "ResetCanController" option

    What is that? Are you using a newer example than the one provided with Qt 5.12?

    and I now get the error "Cannot load library pcanbasic".

    As said, check that the DLL has the correct bitness.

    Regards



  • @aha_1980
    That works, I put the correct dll:

    eb8a4587-9aee-467c-8ece-1fe48eed5c59-image.png

    73d0ad15-bc3e-41e0-bc87-cdcb05ad5847-image.png

    However, it still does not work in my Qt Project.



  • @Jules31

    Another question: Does the PCAN-Basic_API also works with the PCAN-Ethernet Gateway DR from peak system ?

    Thanks in advance.


  • Lifetime Qt Champion

    Hi @Jules31,

    However, it still does not work in my Qt Project.

    Then please incorporate the fixes we mentioned above and show your modified code.

    Does the PCAN-Basic_API also works with the PCAN-Ethernet Gateway DR from peak system ?

    Currently not. Do you have such a device and could provide the needed adoptions to the peakcan plugin?

    Regards



  • Hi,

    I will incorporate your fixes today.

    I've just checked on peak-system website and it seems that the access to the CAN channels of a PCAN-Gateway is enabled via the new PCAN-LAN hardware type from PCAN-Basic library:

    https://www.peak-system.com/PCAN-Basic.239.0.html?&L=1

    Does anyone has tested to use P-CAN-Gateway with PCAN-Basic library yet ?

    Thank you


Log in to reply