Qt CAN总线发送和接收案例

设置比特率类

// 文件: BitRateBox.h
// 作用: 定义了一个用于选择比特率的组合框类 BitRateBox,该类继承自QComboBox。
//       提供了设置和获取比特率、以及是否启用可变数据速率的功能。

#ifndef BITRATEBOX_H
#define BITRATEBOX_H

#include <QComboBox> // 引入Qt的组合框类QComboBox

// 使用QT宏来引入QIntValidator类的命名空间
QT_BEGIN_NAMESPACE
class QIntValidator;
QT_END_NAMESPACE

// BitRateBox 类定义,继承自QComboBox
class BitRateBox : public QComboBox
{
   
   
public:
    // 构造函数,接受一个可选的父窗口指针
    explicit BitRateBox(QWidget *parent = nullptr);
    // 析构函数
    ~BitRateBox();

    // 获取当前选定的比特率
    int bitRate() const;

    // 查询是否启用了灵活的数据速率(Flexible Data Rate)
    bool isFlexibleDataRateEnabled() const;
    // 设置灵活数据速率的启用状态
    void setFlexibleDateRateEnabled(bool enabled);

protected slots: // 更正:应为private slots,因为这些槽函数不应在类外部被直接调用
    // 根据下拉菜单的选择项检查并应用自定义速度策略
    void checkCustomSpeedPolicy(int idx);

private:
    // 初始化比特率选项
    void fillBitRates();

    // 标记是否启用了灵活数据速率,默认为禁用
    int m_isFlexibleDataRateEnabled; // 注意:此处类型应为bool而非int以匹配其用途
    // 用于验证用户输入的自定义比特率的整数验证器
    QIntValidator *m_customSpeedValidator;
};

#endif // BITRATEBOX_H // 头文件结束标记

设置比特率类实现

#include "bitratebox.h"
#include <QLineEdit> // 包含QLineEdit头文件,用于访问lineEdit()方法

// BitRateBox构造函数,初始化组合框并设置验证器
BitRateBox::BitRateBox(QWidget *parent) :
    QComboBox(parent),
    m_customSpeedValidator(new QIntValidator(0, 1000000, this)) // 初始化验证器,允许0到1000000的整数输入
{
   
   
    fillBitRates(); // 填充默认比特率选项

    // 连接下拉菜单选项变化的信号到checkCustomSpeedPolicy槽函数
    connect(this, QOverload<int>::of(&QComboBox::currentIndexChanged),
            this, &BitRateBox::checkCustomSpeedPolicy);
}

// 析构函数,释放m_customSpeedValidator所占内存
BitRateBox::~BitRateBox()
{
   
   
    delete m_customSpeedValidator;
}

// 返回当前选中的比特率
int BitRateBox::bitRate() const
{
   
   
    // 如果选中的是"Custom"项,则直接解析文本为整数返回
    if (currentIndex() == (count() - 1))
        return currentText().toInt();

    // 否则,从itemData获取预设比特率值
    return itemData(currentIndex()).toInt();
}

// 查询灵活数据速率是否启用
bool BitRateBox::isFlexibleDataRateEnabled() const
{
   
   
    return m_isFlexibleDataRateEnabled;
}

// 设置灵活数据速率的启用状态,并根据状态调整验证器上限
void BitRateBox::setFlexibleDateRateEnabled(bool enabled)
{
   
   
    m_isFlexibleDataRateEnabled = enabled;
    // 根据状态调整自定义速度的最大值
    m_customSpeedValidator->setTop(enabled ? 10000000 : 1000000);
    fillBitRates(); // 重新填充比特率选项以反映设置
}

// 根据当前选中项决定是否进入自定义速度模式并设置验证器
void BitRateBox::checkCustomSpeedPolicy(int idx)
{
   
   
    const bool isCustomSpeed = !itemData(idx).isValid(); // 判断是否选择了"Custom"
    setEditable(isCustomSpeed); // 是否允许编辑(自定义输入)
    if (isCustomSpeed) {
   
   
        clearEditText(); // 清除已有编辑文本
        lineEdit()->setValidator(m_customSpeedValidator); // 设置验证器控制输入合法
    }
}

// 填充比特率选项到组合框
void BitRateBox::fillBitRates()
{
   
   
    // 静态比特率列表
    const QList<int> rates = {
   
   
        10000, 20000, 50000, 100000, 125000, 250000, 500000, 800000, 1000000
    };
    // 灵活数据速率列表,仅当功能启用时显示
    const QList<int> dataRates = {
   
   
        2000000, 4000000, 8000000
    };

    // 清空现有选项
    clear();

    // 添加静态比特率选项
    for (int rate : rates)
        addItem(QString::number(rate), rate);

    // 根据配置添加灵活数据速率选项
    if (isFlexibleDataRateEnabled()) {
   
   
        for (int rate : dataRates)
            addItem(QString::number(rate), rate);
    }

    // 添加"Custom"选项,允许用户输入自定义比特率
    addItem(tr("Custom"));
    // 默认选择500000 bits/sec
    setCurrentIndex(6);
}

发送数据帧类

// 文件: SendFrameBox.h
// 作用: 定义了一个用于构造和管理发送CAN总线数据帧界面的类SendFrameBox,该类继承自QGroupBox。
//       包括两个自定义验证器HexIntegerValidator和HexStringValidator,分别用于验证十六进制整数和十六进制字符串输入的有效性。

#ifndef SENDFRAMEBOX_H
#define SENDFRAMEBOX_H

#include <QCanBusFrame> // CAN总线数据帧类
#include <QGroupBox>    // Qt中的分组框基类
#include <QRegularExpression> // 正则表达式类,可能用于输入验证辅助
#include <QValidator>   // 输入验证基类

QT_BEGIN_NAMESPACE
namespace Ui {
   
    class SendFrameBox; } // 前向声明Ui命名空间内的SendFrameBox类,通常由Qt Designer生成
QT_END_NAMESPACE

// HexIntegerValidator类定义,用于验证输入是否为有效的十六进制整数
class HexIntegerValidator : public QValidator
{
   
   
    Q_OBJECT // 支持信号槽机制

public:
    // 构造函数,可选传入父对象指针
    explicit HexIntegerValidator(QObject *parent = nullptr);

    // 重写了QValidator的validate方法,用于实际的输入验证逻辑
    QValidator::State validate(QString &input, int &) const;

    // 设置验证器允许的最大十六进制数值
    void setMaximum(uint maximum);

private:
    uint m_maximum = 0; // 最大允许的十六进制数值
};

// HexStringValidator类定义,用于验证输入是否为有效的十六进制字符串
class HexStringValidator : public QValidator
{
   
   
    Q_OBJECT

public:
    // 构造函数
    explicit HexStringValidator(QObject *parent = nullptr);

    // 重写的验证逻辑
    QValidator::State validate(QString &input, int &pos) const;

    // 设置验证器允许的最长输入长度
    void setMaxLength(int maxLength);

private:
    int m_maxLength = 0; // 允许的最长输入长度
};

// SendFrameBox类定义,负责构建和管理发送CAN帧的UI界面
class SendFrameBox : public QGroupBox
{
   
   
    Q_OBJECT // 支持信号槽机制

public:
    // 构造函数,可选传入父对象指针
    explicit SendFrameBox(QWidget *parent = nullptr);
    // 析构函数
    ~SendFrameBox();

    // 信号,当用户操作完成并准备发送CAN帧时发出
    signals:
        void sendFrame(const QCanBusFrame &frame);

private:
    Ui::SendFrameBox *m_ui; // 指向由Qt Designer生成的用户界面对象

    HexIntegerValidator *m_hexIntegerValidator; // 十六进制整数验证器
    HexStringValidator *m_hexStringValidator;   // 十六进制字符串验证器
};

#endif // SENDFRAMEBOX_H // 头文件结束标记

发送数据帧类的实现

#include "sendframebox.h"
#include "ui_sendframebox.h"

// 定义标准ID和扩展ID的最大值
enum {
   
   
    MaxStandardId = 0x7FF, // 标准CAN帧ID的最大值
    MaxExtendedId = 0x10000000 // 扩展CAN帧ID的最大值
};

// 定义CAN帧数据域最大负载长度,区分经典CAN与FD(灵活数据速率)CAN
enum {
   
   
    MaxPayload = 8, // 经典CAN帧最大负载字节数
    MaxPayloadFd = 64 // FD CAN帧最大负载字节数
};

// HexIntegerValidator构造函数,初始化最大验证值为标准CAN ID的最大值
HexIntegerValidator::HexIntegerValidator(QObject *parent) :
    QValidator(parent),
    m_maximum(MaxStandardId)
{
   
   
}

// 验证输入的十六进制整数是否有效
QValidator::State HexIntegerValidator::validate(QString &input, int &)
{
   
   
    bool ok;
    uint value = input.toUInt(&ok, 16); // 将输入转换为无符号整数

    if (input.isEmpty()) // 空输入视为中间状态,等待更多输入
        return Intermediate;

    if (!ok || value > m_maximum) // 转换失败或超过最大值则无效
        return Invalid;

    return Acceptable; // 否则,输入有效
}

// 设置验证的最大十六进制数值
void HexIntegerValidator::setMaximum(uint maximum)
{
   
   
    m_maximum = maximum;
}

// HexStringValidator构造函数,初始化最大验证长度为经典CAN负载长度
H
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值