一款基于CAN总线的模拟ECU工具

在周立功的底层CAN库上封装了CanBusDevice 支持多个版本的动态库加载,可以用于实现单路CAN通信和多路CAN通信,共享库实现,内部有2个线程(发送和接收),采用线程锁:

#ifndef CANBUSDEVICE_H
#define CANBUSDEVICE_H

#include <QObject>
#include <QMap>

QT_BEGIN_NAMESPACE

#ifndef QT_STATIC
    #if defined(BUILD_CANBUSDEVICE_LIB)
    #define CANBUSDEVICE_EXPORT Q_DECL_EXPORT
    #else
    #define CANBUSDEVICE_EXPORT Q_DECL_IMPORT
    #endif
#else
    #define CANBUSDEVICE_EXPORT
#endif

class CanBusData;
class CanBusDevicePrivate;

class CANBUSDEVICE_EXPORT CanBusDeviceInfo {

public:
    explicit CanBusDeviceInfo(const QString &description, int devType)
    { m_description = description; m_devType = devType; }
    QString description() { return m_description; }
    int devType() { return m_devType; }

    static QList<CanBusDeviceInfo> availablePorts();

private:
    int m_devType;
    QString m_description;
};

class CANBUSDEVICE_EXPORT CanBusDevice : public QObject
{
    Q_OBJECT

public:

    enum Channel {
        Channel_0 = 0,
        Channel_1,
        Channel_2,
        Channel_3,
        UnknownChannel = -1
    };
    Q_ENUM(Channel)

    enum FilterType {
        DualFiltering = 0,
        SingleFiltering,
        UnknownFilterType = -1
    };
    Q_ENUM(FilterType)

    enum WorkMode {
        Normal = 0,
        ListenOnly,
        UnknownWorkMode = -1
    };
    Q_ENUM(WorkMode)

    enum BaudRate {
        Baud1000K = 1000,
        Baud800K = 800,
        Baud500K = 500,
        Baud250K = 250,
        Baud125K = 125,
        Baud100K = 100,
        Baud50K = 50,
        Baud20K = 20,
        Baud10K = 10,
        Baud5K = 5,
        UnknownBaud = -1
    };
    Q_ENUM(BaudRate)

    enum SendType {
        NormalTransmission = 0,
        SingleTransmission,
        SelfReceiving,
        SingleSelfReceiving,
        UnknownSendType = -1
    };
    Q_ENUM(SendType)

    enum FrameType {
        StandardFrame = 0,
        ExtendedFrame,
        UnknownExternFlag = -1
    };
    Q_ENUM(FrameType)

    enum FrameFormat {
        DataFrame = 0,
        RemoteFrame,
        UnknownFrameFormat = -1
    };
    Q_ENUM(FrameFormat)

    enum FilterIdMode {
        Disabled = 0,
        NonReceivingIds,
        OnlyReceivingIds,
        UnknownFilterIdMode = -1
    };
    Q_ENUM(FilterIdMode)

    explicit CanBusDevice(const QString &fileName, QObject *parent = nullptr);
    ~CanBusDevice();

    bool dynamicLoad(bool isLoad, const QString &fileName = QString());

    bool setAccessCode(int channel, quint32 accessCode);
    quint32 accessCode(int channel) const;
    
    bool setAccessMask(int channel, quint32 accessMask);
    quint32 accessMask(int channel) const;
    
    bool setFilterType(int channel, FilterType filterType);
    FilterType filterType(int channel) const;
    
    bool setWorkMode(int channel, WorkMode workMode);
    WorkMode workMode(int channel) const;
    
    bool setBaudRate(int channel, qint32 baudRate);
    qint32 baudRate(int channel) const;

    QString timer0(qint32 baudRate);
    QString timer1(qint32 baudRate);

    void setFilterIdMode(FilterIdMode mode);
    FilterIdMode filterIdMode(void);
    void addFilterCanid(quint32 canid);
    void addFilterCanids(QList<quint32> canids);
    void clearFilterCanids(void);
    QList<quint32> filterCanids(void);
    
    bool open(int devType, int devIndex);
    void close(void);
    bool isOpen() const;
    qint64 write(int channel, quint32 canid, const QByteArray &data, 
        FrameType frameType = ExtendedFrame, FrameFormat frameFormat = DataFrame,
        SendType sendType = NormalTransmission);

    QString errorString(void);

Q_SIGNALS:
    void detailedData(int channel, QList<CanBusData> &canDatas);
    void sectionData(int channel, quint32 canid, const QByteArray &data);
    void error(int channel, quint32 errCode, const QByteArray &passive, quint8 arLost);

private slots:
    void doRawCanData(int channel, QList<CanBusData> &canDatas);

private:
    CanBusDevicePrivate *const d_ptr;
    FilterIdMode m_filterIdMode;
    QList<quint32> m_filterCanids;
    QMap<int, qint32> m_baudRates;

private:
    Q_DECLARE_PRIVATE(CanBusDevice)
    Q_DISABLE_COPY(CanBusDevice)
};

class CANBUSDEVICE_EXPORT CanBusData
{
public:
    quint32                     canid;
    quint32                     timeStamp;
    quint8                      timeFlag;
    CanBusDevice::SendType      sendType;
    CanBusDevice::FrameType     frameType;
    CanBusDevice::FrameFormat   frameFormat;
    QByteArray                  data;
};

QT_END_NAMESPACE

#endif // CANBUSDEVICE_H

下载地址:https://download.youkuaiyun.com/download/xiyuan255/25512747

 

集成CANoe官方将BLF加密CAN转ASC格式的CAN数据的功能,自解析DBC文件转CSV文件(数据模拟)功能;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值