在周立功的底层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文件(数据模拟)功能;