2026/4/1 19:11:19
网站建设
项目流程
html网页制作个人网站,深圳保障性住房和公租房区别,确定网站建设目的,江西网络推广seoCAN调试工具源代码吉阳光电致远周立功USB卡CAN单帧通信协议带相同ID折叠显式加载dll数据保存QT编写的CAN通信调试工具#xff0c;基于致远周立功USB转CAN卡#xff0c;可完成CAN帧的发送和接收#xff0c;带配置参数自动保存#xff0c;定时发送#xff0c;帧类型选择基于致远周立功USB转CAN卡可完成CAN帧的发送和接收带配置参数自动保存定时发送帧类型选择文本和十六进制等。 带有折叠相同的帧ID的功能如果有相同的帧ID则会自动折叠显示。 可组装字符串字节数整数等并完成发送。 带有保存到文件功能文件名根据时间自动生成解决了保存成中文乱码的问题。 2.环境说明 开发环境是Qt5.12.1吉阳光电和周立功的USB-CAN卡的开发库ControlCAN.dll。 源代码中包含详细注释使用说明设计文档等。 请将源码放到纯英文路径下再编译。 3.使用介绍 可直接运行在可执行程序里的exe文件操作并了解软件运行流程。 本代码产品特点 1、尽量贴合实际应用方便软件模块复用。 2、注释完善讲解详细还有相关扩展知识点介绍。 3、提供代码设计文档使用文档环境配置文档等。 4.子功能模块介绍 封装了CAN通信通信类可方便更换其他CAN卡 具有控制台调试窗口配置参数可自动保存 带有数据保存功能文件名可根据时间及日期自动生成 相同帧ID的报文可自动折叠显示 带有自定义协议示例可以文本或十六进制输入最近在研究CAN通信相关的项目发现了一款基于Qt编写的超实用CAN通信调试工具今天就来和大家分享一下。它基于致远周立功USB转CAN卡功能丰富在实际应用场景中能发挥很大作用。一、工具核心功能1. CAN帧的发送和接收这是工具最基础也是最重要的功能。代码中通过调用吉阳光电和周立功USB - CAN卡的开发库ControlCAN.dll来实现这一功能。以发送为例在Qt中你可能会看到类似这样的代码片段// 假设已经初始化好了CAN设备获取到设备句柄m_deviceHandle // 构建要发送的CAN帧 VCI_CAN_OBJ sendFrame; sendFrame.ID 0x123; // 假设ID为0x123 sendFrame.DataLen 8; // 数据长度为8字节 for (int i 0; i 8; i) { sendFrame.Data[i] i; // 填充数据 } sendFrame.SendType 0; // 正常发送类型 // 调用库函数发送CAN帧 int result VCI_Transmit(m_deviceHandle, 0, 0, sendFrame, 1); if (result 1) { qDebug() CAN帧发送成功; } else { qDebug() CAN帧发送失败; }在这段代码里首先构建了一个VCICANOBJ结构体类型的CAN帧对象sendFrame设置好ID、数据长度、数据内容以及发送类型。然后调用VCI_Transmit函数这个函数是来自ControlCAN.dll库的它接收设备句柄、CAN通道号、要发送的帧对象以及发送帧数等参数。通过返回值判断发送是否成功。2. 配置参数自动保存这个功能很贴心对于经常使用的用户来说不用每次都重新配置参数。在Qt里通常会用到QSettings类来实现配置参数的保存和读取。// 保存配置参数 QSettings settings(config.ini, QSettings::IniFormat); settings.setValue(CAN/baudrate, m_baudrate); settings.setValue(CAN/deviceID, m_deviceID); // 读取配置参数 int baudrate settings.value(CAN/baudrate, 500000).toInt(); int deviceID settings.value(CAN/deviceID, 0).toInt();这里通过QSettings类将CAN的波特率mbaudrate和设备IDmdeviceID保存到名为config.ini的配置文件中。读取时如果配置文件中没有相应的值就使用默认值。3. 定时发送定时发送功能在一些需要周期性发送CAN帧的场景下非常有用。在Qt中可以利用QTimer类来实现定时功能。QTimer *sendTimer new QTimer(this); connect(sendTimer, QTimer::timeout, this, MainWindow::sendCANFrame); sendTimer-start(1000); // 每1000毫秒1秒发送一次上述代码创建了一个QTimer对象sendTimer当timeout信号触发时会调用MainWindow类中的sendCANFrame函数这个函数就是实际发送CAN帧的函数。start(1000)表示每1000毫秒触发一次定时事件。4. 帧类型选择CAN帧有不同的类型如标准帧、扩展帧等。在代码中可以通过一个下拉框或者类似的UI控件让用户选择帧类型然后根据用户选择来设置CAN帧结构体中的相关标志位。// 假设在UI中有一个QComboBox对象m_frameTypeComboBox用于选择帧类型 int frameTypeIndex m_frameTypeComboBox-currentIndex(); if (frameTypeIndex 0) { sendFrame.ExternFlag 0; // 标准帧 } else { sendFrame.ExternFlag 1; // 扩展帧 }这里根据QComboBox的当前选中索引来判断用户选择的帧类型进而设置CAN帧结构体sendFrame中的ExternFlag标志位。5. 文本和十六进制显示及发送用户既可以以文本形式输入要发送的数据也可以以十六进制形式输入。在代码中需要对用户输入进行解析。// 假设用户在一个QLineEdit中输入十六进制数据如01 02 03 QString hexInput ui-hexLineEdit-text(); QByteArray data QByteArray::fromHex(hexInput.toUtf8()); // 将解析出来的QByteArray数据填充到CAN帧的Data数组中 for (int i 0; i data.length() i 8; i) { sendFrame.Data[i] data.at(i); }这段代码从QLineEdit中获取用户输入的十六进制字符串通过QByteArray::fromHex函数将其转换为字节数组然后填充到CAN帧的Data数组中。6. 相同ID帧折叠显示这是一个很实用的显示优化功能。在显示接收到的CAN帧列表时如果有相同的帧ID会自动折叠显示。实现这个功能的关键在于维护一个数据结构比如一个QMap来记录每个ID对应的帧列表。QMapint, QListVCI_CAN_OBJ idFrameMap; // 假设接收到一个CAN帧recvFrame if (idFrameMap.contains(recvFrame.ID)) { idFrameMap[recvFrame.ID].append(recvFrame); } else { QListVCI_CAN_OBJ frameList; frameList.append(recvFrame); idFrameMap.insert(recvFrame.ID, frameList); }上述代码根据接收到的CAN帧的ID将其添加到对应的QList中如果该ID还没有对应的列表则创建一个新的列表并插入。这样在显示时就可以根据这个QMap来实现折叠显示。7. 数据保存功能带有保存到文件功能文件名根据时间自动生成并且解决了保存成中文乱码的问题。在Qt中可以这样实现QDateTime currentTime QDateTime::currentDateTime(); QString fileName currentTime.toString(yyyyMMdd_hhmmss) .txt; QFile file(fileName); if (file.open(QIODevice::WriteOnly | QIODevice::Text | QIODevice::Append)) { QTextStream out(file); out.setCodec(UTF - 8); // 设置编码为UTF - 8解决中文乱码 out 接收到的CAN帧数据 endl; // 假设已经有一个QListVCI_CAN_OBJ类型的receivedFrames列表存储接收到的帧 for (const VCI_CAN_OBJ frame : receivedFrames) { out ID: QString::number(frame.ID, 16) Data: ; for (int i 0; i frame.DataLen; i) { out QString::number(frame.Data[i], 16) ; } out endl; } file.close(); }这段代码首先获取当前时间并格式化为文件名然后以追加和文本模式打开文件。通过设置QTextStream的编码为UTF - 8来避免中文乱码问题。最后将接收到的CAN帧数据按格式写入文件。二、开发环境及注意事项开发环境是Qt5.12.1使用了吉阳光电和周立功的USB - CAN卡的开发库ControlCAN.dll。这里要注意源代码中包含详细注释、使用说明、设计文档等但请将源码放到纯英文路径下再编译不然可能会遇到编译错误。三、使用介绍大家可以直接运行可执行程序里的exe文件通过实际操作来了解软件运行流程。这款代码产品特点也很突出尽量贴合实际应用方便软件模块复用注释完善讲解详细还有相关扩展知识点介绍提供代码设计文档、使用文档、环境配置文档等。四、子功能模块介绍1. 封装CAN通信类封装了CAN通信通信类这使得更换其他CAN卡变得很方便。通过将与CAN卡交互的底层操作封装在一个类中上层代码只需要调用这个类的接口函数而不需要关心具体的CAN卡型号细节。class CANCommunication { public: CANCommunication(); ~CANCommunication(); bool initCANDevice(); bool sendFrame(VCI_CAN_OBJ frame); bool receiveFrame(VCI_CAN_OBJ frame); private: int m_deviceHandle; };在这个简单的类定义中包含了初始化CAN设备、发送帧和接收帧的接口函数以及一个设备句柄成员变量。这样在实际应用中如果要更换CAN卡只需要修改这个类中与底层库交互的部分代码而其他使用到CAN通信功能的地方基本不需要改动。2. 控制台调试窗口具有控制台调试窗口配置参数可自动保存。控制台调试窗口方便开发者在调试过程中输出一些调试信息观察程序的运行状态。结合前面提到的配置参数自动保存功能在调试过程中修改的一些配置参数下次启动程序时依然生效。3. 数据保存功能回顾再次强调一下数据保存功能文件名可根据时间及日期自动生成这个功能在记录数据时非常实用方便对不同时间的数据进行区分和管理。4. 相同帧ID折叠显示回顾相同帧ID的报文可自动折叠显示优化了数据显示效果让用户能更清晰地查看接收到的CAN帧数据。5. 自定义协议示例带有自定义协议示例可以文本或十六进制输入。这为开发者在实际项目中根据自己的需求定制CAN通信协议提供了很好的参考无论是简单的数据传输还是复杂的控制指令交互都能从这个示例中获取灵感。CAN调试工具源代码吉阳光电致远周立功USB卡CAN单帧通信协议带相同ID折叠显式加载dll数据保存QT编写的CAN通信调试工具基于致远周立功USB转CAN卡可完成CAN帧的发送和接收带配置参数自动保存定时发送帧类型选择文本和十六进制等。 带有折叠相同的帧ID的功能如果有相同的帧ID则会自动折叠显示。 可组装字符串字节数整数等并完成发送。 带有保存到文件功能文件名根据时间自动生成解决了保存成中文乱码的问题。 2.环境说明 开发环境是Qt5.12.1吉阳光电和周立功的USB-CAN卡的开发库ControlCAN.dll。 源代码中包含详细注释使用说明设计文档等。 请将源码放到纯英文路径下再编译。 3.使用介绍 可直接运行在可执行程序里的exe文件操作并了解软件运行流程。 本代码产品特点 1、尽量贴合实际应用方便软件模块复用。 2、注释完善讲解详细还有相关扩展知识点介绍。 3、提供代码设计文档使用文档环境配置文档等。 4.子功能模块介绍 封装了CAN通信通信类可方便更换其他CAN卡 具有控制台调试窗口配置参数可自动保存 带有数据保存功能文件名可根据时间及日期自动生成 相同帧ID的报文可自动折叠显示 带有自定义协议示例可以文本或十六进制输入总之这款QT编写的CAN通信调试工具功能全面且实用无论是对于CAN通信初学者还是有一定经验的开发者都有很大的参考价值。希望大家可以去尝试使用一下说不定能在你的项目中发挥大作用。