qt实现socketCAN

server/2024/12/26 12:01:02/

一.初始化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转换为QByteArrayQByteArray data0 = strTmp.toLatin1();//fromHex() 函数将16进制转换成二进制数据QByteArray data = QByteArray::fromHex(data);//以16进制读取要发送的帧内容里第一个数据,并作为帧IDbool ok;int framId = strList[0].toInt(&ok,16);QCanBusFrame fram = QCanBusFrame(framId,data);//发送帧canDevice->writeFrame(fram);}


http://www.ppmy.cn/server/153307.html

相关文章

python中bug修复案例-----图形界面程序中修复bug

我在开发一个小型的图形界面应用程序时&#xff0c;使用了 Tkinter 库来创建窗口和各种组件。代码的目标是实现一个简单的登录界面&#xff0c;用户输入用户名和密码后&#xff0c;点击登录按钮&#xff0c;程序会验证输入的信息并给出相应提示。然而&#xff0c;当我运行程序并…

Max AI prompt1

1&#xff0c;内容/要点逻辑链&#xff0c;层次结构可视化 请提取其中的主要内容以及观点&#xff0c;以及对应的逻辑链&#xff0c;以图示化、层次结构通俗易懂地展现&#xff0c;要求使用中文 #我目前常用的文献阅读prompt提示词&#xff0c;主要是内容、逻辑链2者兼备2&…

CSS(二):美化网页元素

目录 字体样式 文本样式 列表样式 背景图片 字体样式 字体相关的 CSS 属性&#xff1a; font-family&#xff1a;设置字体font-size&#xff1a;设置字体大小font-weight&#xff1a;设置字体的粗细&#xff08;如 normal, bold, lighter 等&#xff09;color&#xff1a;…

lookup join 使用缓存参数和不使用缓存参数的执行前后对比

0.先看结论 #缓存开启参数&#xff0c;默认关闭lookup.cache.max-rows 1000, -- 设置最大缓存条目数为 1000lookup.cache.ttl 10 min -- 设置缓存条目的最大存活时间为 10 分钟启用缓存 查询时性能较高&#xff0c;因为数据直接从缓存中读取。缓存未过期时&#xff0c…

可以免费制作翻页电子书的软件

​随着数字化时代的到来&#xff0c;电子书已经成为人们阅读的重要方式之一。翻页电子书以其独特的视觉效果和便捷性&#xff0c;受到了广大读者的喜爱。今天推荐一款免费制作翻页电子书的软件。 1. 实用工具&#xff1a;打开FLBOOK在线制作电子杂志平台。 2. 设计模板&#xf…

在 CentOS 8 系统上安装 Jenkins 的全过程

一、前言 我是一个前端开发&#xff0c;需要频繁将编写的前端系统打包更新到公司的linux服务器&#xff0c;觉得这种工作纯体力活&#xff0c;有时候太浪费时间&#xff0c;以前用过别人搭建的Jenkins可以很好的解决这个问题。 Jenkins 是一款流行的开源持续集成和持续交付&a…

我在广州学 Mysql 系列——数据表查询命令详解

ℹ️大家好&#xff0c;我是LXJ&#xff0c;今天星期二了&#xff0c;本文将讲述MYSQL查询数据的详细命令以及相关例题~~ 复习&#xff1a;&#x1f449;《Mysql函数的练习题》 同时&#xff0c;数据库相关内容查看专栏&#x1f449;【数据库专栏】~ 想要了解更多内容请点击我的…

ARM 获取cpu个数

MPIDR_EL1寄存器 AFF0 &#xff1a;表示一个 core 中的第几个 thread&#xff0c;大多数 core 都是 single-threaded core&#xff0c;所以大多数 core 中的该值是 0. AFF1&#xff1a;表示一个 cluster 中的第几个 cpu AFF2/AFF3&#xff1a;表示系统中的第几个 cluster&#…