当前位置: 首页 > article >正文

qt实现socketCAN

一.初始化Init函数

1.点击 连接CAN 按键(默认为连接CAN,点击一次变为断开CAN)--->进入connectDevice函数

        1.1按键为连接CAN:根据当前选择的可用接口,比特率初始化CAN

QString cmd1=tr("ifconfig %1 down").arg(ui->comboBox_2->currentText());
        QString cmd2=tr("ip link set up %1 type can bitrate %2 restart-ms 100").arg(ui->comboBox_2->currentText()).arg(ui->comboBox_3->currentText());
        system(cmd1.toStdString().c_str());
        system(cmd2.toStdString().c_str());

        1.2以设置的插件名与接口实例化canDevice

                QCanBusDevice作用:1.连接断开CAN总线设备 

                connectDevice(): 尝试连接到CAN总线设备

                                                         disconnectDevice(): 断开与CAN总线设备的连接。

                                                        2.读取发送帧

               readFrames(int maxNumberOfFrames): 从CAN总线读取数据帧

               writeFrames(const QList<QCanBusFrame> &frames): 向CAN总线写入数据帧。

                                                        3.错误处理

                                                       errorOccurred(QCanBusDevice::Error error): 当CAN总线设备发生错误时发出信号。               errorString() const: 返回描述错误的字符串。

canDevice = QCanBus::instance()->createDevice(ui->comboBox->currentText(),ui->comboBox_2->currentText(),&errorString);

                canDevice创建成功:连接CAN  canDevice->connectDevice()连接成功之后进行按键使能与失能。进行接收消息帧,错误处理

                接收消息帧

 connect(canDevice,&QCanBusDevice::framesReceived,[=](){
           this->receivedFrames();
        });

                 错误处理 connect(canDevice,&QCanBusDevice::errorOccurred,this,&MainWindow::canDeviceErrors);

void MainWindow::receivedFrames()
{
    if(!canDevice)
        return;
    //读取帧
    while(canDevice->framesAvailable())
    {
        QString view;
        const QCanBusFrame frame = canDevice->readFrame();
        //检查读取的帧是否是错误帧frame.frameType()返回帧的类型
        if(frame.frameType()==QCanBusFrame::ErrorFrame)
        {
            view=canDevice->interpretErrorFrame(frame);
        }
        else
        {
            view=frame.toString();
        }
        //设置时间戳
        const QString time=QString::fromLatin1("%1.%2 ").arg(frame.timeStamp().seconds(),10,10,QLatin1Char(' ')).arg(frame.timeStamp().microSeconds()/100,4,10,QLatin1Char('0'));

        const QString flags=frameFlags(frame);

        //追加显示接收到的消息
        ui->textBrowser->insertPlainText(time+flags+view+"\n");
    }
}
static QString frameFlags(const QCanBusFrame &frame)
{
    QString res=QString(" --- ");
    if(frame.hasBitrateSwitch())
        res[1]=QLatin1Char('B');
    if(frame.hasErrorStateIndicator())
        res[2]=QLatin1Char('E');
    if(frame.hasLocalEcho())
        res[3]=QLatin1Char('L');

    return res;

}
//错误处理
void MainWindow::canDeviceErrors(QCanBusDevice::CanBusError error) const
{
    switch (error)
    {
        case QCanBusDevice::ReadError:
        case QCanBusDevice::WriteError:
        case QCanBusDevice::ConnectionError:
        case QCanBusDevice::ConfigurationError:
        case QCanBusDevice::UnknownError:
            ui->label_4->setText(canDevice->errorString());
            break;
        default:
            break;
    }
}

                发送信息:

void MainWindow::sendMsg()
{
    if(!canDevice)
        return;
    QString str=ui->lineEdit->text();
    /* 以空格分隔lineEdit的内容,并存储到字符串链表中 */
    QStringList strList=str.split(' ');
    QString strTmp=nullptr;
    for(int i=1;i<strList.count();++i)
    {
        strTmp+=strList[i];
    }

    //将strTmp中的信息转为QByteArray进行发送
    //strTemp.toLatin1():这个调用将QString转换为QByteArray
    QByteArray data0 = strTmp.toLatin1();
    //fromHex() 函数将16进制转换成二进制数据
    QByteArray data = QByteArray::fromHex(data);

    //以16进制读取要发送的帧内容里第一个数据,并作为帧ID
    bool ok;
    int framId = strList[0].toInt(&ok,16);
    QCanBusFrame fram = QCanBusFrame(framId,data);
    //发送帧
    canDevice->writeFrame(fram);

}


http://www.kler.cn/a/452726.html

相关文章:

  • QT笔记- QTreeView + QFileSystemModel 当前位置的保存与恢复 #选中 #保存当前索引
  • Java 中 getClass() 方法的使用与原理分析:深入理解对象类型信息
  • 从测试服务器手动热部署到生产环境的实现
  • 简述Git中如何将一个新增文件添加到本地仓库?
  • HTML-CSS(day01)
  • linux中 mysql备份
  • hive常用函数有哪些
  • HCIE-day9-OSPF
  • 亚远景-ISO 21434标准涵盖了哪些方面?
  • 基于深度学习(HyperLPR3框架)的中文车牌识别系统-搭建开发环境
  • 01.HTTPS的实现原理-HTTPS的概念
  • 【华为OD-E卷-MVP争夺战 100分(python、java、c++、js、c)】
  • Chrome+Postman做接口测试
  • 海格通信嵌入式面试题及参考答案
  • Ubuntu系统下 npm install -g tauri 报错问题处理
  • pnpm、Yarn 和 npm 的区别?
  • MySQL用表组织数据
  • 面试经典问题 —— 最大/小前K个数问题(top - K)问题
  • postgresql ERROR: cannot drop the currently open database
  • Java处理视频思路
  • 【接口自动化连载】使用yaml配置文件自动生成接口case
  • Postman最新接口自动化持续集成
  • 虚拟机桥接模式网络连接不上解决方法
  • SQL server学习10-数据库编程(中)
  • 常用的 JVM 调优的参数
  • 【C++多重类循环依赖问题】基于class前向声明与类定义和实现分离的解决方案与分析