CAN调试工具Qt软件开发文档

CAN调试工具Qt软件开发文档
目录
1 设计目的 1
1.1 基本功能 2
1.2 开发环境 2
2 使用说明 2
2.1 页面介绍 2
2.2 调试窗口的使用 4
3 通信接口及运行流程 5
3.1 通信接口 5
3.2 数据发送流程 6
3.3 数据接收流程 6
3.4 全局数据 6
3.4.1配置数据 6
3.5 CANID存储方式 7
3.5.1CANID的对齐方式 7
3.5.2 ID转换算法 7
4 端口通信类 8
4.1 接口父类Port 8
4.1.1类定义 8
4.2 接口子类CanZPort 8
4.2.1类定义 8
4.2.2动态库的显式加载 8
4.3 接口子类CanGTPort 8
4.2.1类定义 9
4.2.2动态库的隐式加载 9
5 各功能页面 9
5.1 主页面MainDialog 9
5.1.1界面设计 9
5.1.2类设计 9
5.1.3构造函数 9
5.1.4保存最新配置 9
5.1.5加载配置文件 9
5.1.6打开端口 10

1 设计目的
1.1 基本功能
采用Qt编写的CAN通信调试工具,基于吉阳光电和致远周立功USB转CAN卡,可完成CAN帧的发送和接收,带配置参数自动保存,定时发送,帧类型选择,文本和十六进制等。带有折叠相同的帧ID的功能,如果有相同的帧ID,则会自动折叠显示。可组装字符串、字节、Short、整数、浮点数等数据并发送。带有保存到文件功能,文件名根据时间自动生成,解决了保存成中文乱码的问题。相对独立的端口类,可方便更换其他CAN卡的开发库。接收采用多线程和定时器方式,可灵活选择。

1.2 开发环境
采用Windows 系统下的Qt 5.12.7版本,使用吉阳光电的适配器库函数VCI_CAN.lib或者ZLG周立功的USB-CAN卡的开发库ControlCAN.lib。编译器分别采用了MinGW32和MSVC2015。

2 使用说明
2.1 页面介绍
运行程序后,会直接进入主页面。选择好CAN卡的类型,及波特率以后,即可连接并启动CAN。吉阳光电的调试助手打开主页面如下:

在这里插入图片描述

周立功助手的打开界面如下:
在这里插入图片描述

如果打开成功,可点击发送功能,进行数据的发送和接收了。
如果收到数据,则会有接收数据出现在接收窗口,否则会超时提醒。

2.2 调试窗口的使用
为方便编码即调试,设计中使用了调试窗口,方便控制台打印信息。
开启调试窗口的方法是:在项目代码目录的.pro项目文件中添加一行:
CONFIG += console#显示控制台提示窗口,以方便调试.
在这里插入图片描述

3 通信接口及运行流程
3.1 通信接口
CAN通信的格式,已有定义,具体如下:
在这里插入图片描述

通信说明:
每次发送的一帧,作为一个完整的内容进行解析。因此本示例中都是基于这8个字节的数据,来进行格式解析的。

3.2 数据发送流程
对话框获取到发送按钮事件后,会先发送一组数据,随后启动定时器。定时器超时后,调用发送函数。通过接口层的发送函数,组装数据帧后,调用底层发送函数,完成发送。数据发送流程如下。

3.3 数据接收流程
吉阳光电的工程代码,接收采用多线程方式,即继承系统的线程类,实现run()函数,来不停扫描完成数据的接收。
周立功工程代码,接收采用定时的方式,即通过定时器超时,来不停扫描完成数据的接收。当数据量吞吐量大的时候,也可以采用多线程机制。
接收到数据后,发送一个自定义的信号和槽,(以队列方式),触发数据解析流程,从而完成数据的解析及显示。

3.4 全局数据
3.4.1配置数据
将 配置数据 全局化,可以方便各模块的读写。
说明: 端口配置数据,可保持到配置文件中
typedef struct
{
int devType;//设备型号
int devIndex;//设备索引
int canChannel;//CAN的通道路数
int canMode;//0-正常,1-只接收
QString canBaudRate;//5Kbps 500Kbps
bool isFoldRepeat;//是否折叠重复帧ID报文
}ConfigData;

3.5 CANID存储方式
本节内容只针对吉阳光电或者需要操作嵌入式寄存器时需要。对于周立功的CAN设备,它的CANID对齐方式,由其驱动程序自动转换,无需编程额外进行操作。
3.5.1CANID的对齐方式
帧ID的对齐方式:
标准帧ID为11位,扩展帧为29位,需要用一个32位无符号整数存储时,就会出现两种存储方式右对齐方式(直接ID方式)与左对齐方式SJA1000寄存器方式。

直接ID方式,将ID理解成11位或者29位的整数,按照数值大小,存放到32位存储空间中。即ID的最低有效位ID.0与bit.0对齐
31 30 29 28 … … … 3 2 1 0 (32位无符号整数)
xxx 10 9 8 7 6 5 4 3 2 1 0 (11位标准帧)最左边空余21位
x x x 28 27 26 … 11 10 9 8 7 6 5 4 3 2 1 0 (29位标准帧)最左边空余3位

左对齐方式SJA1000,将ID全部左移到最高位,以便硬件发送寄存器时,从最高位开始发送,从最高位开始仲裁总线,从而达到ID值越小优先级越高的效果。
即ID的最高有效位ID.10或ID.28与bit.31对齐
31 30 29 28 … 21 …4 3 2 1 0 (32位无符号整数)
10 9 8 7 6 5 4 3 2 1 0 xxx (11位标准帧)最右边空余21位
28 27 26 26 … 18 …1 0 x x x (29位标准帧)最右边空余3位
3.5.2 ID转换算法
设备操作库里的ID存放特点:
在VCI_CAN_OBJ结构体的.ID[4]数组里存放帧id,默认是按照SJA1000 mode即左对齐方式填入can id的(目的是方便硬件寄存器进行总线仲裁)。
其中:
.ID[0]代表最左边的字节,也就是帧id最左边的字节(最高位)
.ID[3]代表最右边的字节,也就是帧id最右边的字节(最低位)
注意:这和电脑内C语言系统的存放不一样。
一个字节内部,一般不区分高低位,都是按照方便人阅读的大端存储的,不再剖分字节内部结构。

ID对齐的转换算法:

(1)从界面的QLineEdit控件输入时的算法:
,将从左边第一个输入的字符串,转换到ID数组的[0]的位置上,这表示高位对齐到最左边,是SJA1000寄存器模式
将直接ID数,ID左移到最高位上,数值从左边第一个输入的字符串,转换到ID数组的[0]的位置上,这表示高位对齐到最左边,是SJA1000寄存器模式

(2)将接收到的VCI_CAN_OBJ.ID[4]转换成(直接ID方式的)符串输出时的算法:
例子:标准帧ID: 00 00 60 00转换出来是3
方法1:逐个字节转换拼接,仅对字节内部使用移位。该方法便于理解。
算法是:对于扩展帧:每个字节都是由本字节的5位和高字节移过来的3位组成。3位的部分为高,5位的部分为低
方法2:对整个32位整数移位,看起来简洁。
算法是:将ID[4]转换成一个无符号整数int, 先进行高低字节位置转换, 然后右移>>21。
只有高低字节先反转过来,字节排序才会理顺,才可以右移。即:00 60 00 00 >>21
注意:左移或右移之前,都要转换成方便人阅读的大端模式书写,然后再进行操作,否则不好理解。

4 端口通信类
封装一个端口通信类,并构建CanGTPort或CanZPort通信子类,从而将将数据的发送、解析等功能独立出来。
4.1 接口父类Port
4.1.1类定义
class Port: public QObject
{
Q_OBJECT
};
具体实现略
4.2 接口子类CanZPort
4.2.1类定义
class CanZPort: public Port
{
Q_OBJECT
}
具体实现略
4.2.2动态库的显式加载
采用显式加载的方式,将CAN设备的动态库加载进来。具体如下:
QLibrary lib("./ControlCAN.dll");//显式的加载库文件
if(true==lib.load())//判断是否加载成功
qDebug()<<“dll load ok”;
else
qDebug()<<“load can .dll failed:”<<lib.errorString();//打印加载出错的原因
///下面是将dll库里提供的函数,进行函数指针的再次声明,以便使用
pOpenDevice = (VCI_OpenDevice *)lib.resolve(“VCI_OpenDevice”);//打开函数
pCloseDevice = (VCI_CloseDevice *)lib.resolve(“VCI_CloseDevice”);//关闭设备

4.3 接口子类CanGTPort
4.2.1类定义
class CanGTPort: public Port
{
Q_OBJECT
}
具体实现略
4.2.2动态库的隐式加载
采用隐式加载的方式,将CAN设备开发阶段的lib库由Qt自动加载进来。
在工程的.pro文件中,添加如下代码:
LIBS += -L"KaTeX parse error: Expected 'EOF', got '#' at position 25: …32/" -lVCI_CAN #̲LIBS += -L"PWD/GYCan64/" -lVCI_CAN
并包含相应的头文件,在生成的可执行程序运行时,在build-XXXX-Release目录下,添加对应的dll文件。
注意:厂家提供的.dll文件依赖于另外一个dll文件,需要把这几个头文件及对应的目录结构一起拷贝过来。因为这些dll文件在操作USB接口时,需要USB接口的DLL文件(有可能转换成串口再操作)。

5 各功能页面
5.1 主页面MainDialog
5.1.1界面设计
界面设计采用QtCreater进行可视化编辑,具体可参照源代码。

5.1.2类设计
类的成员包括:
此处略,可参考源代码。

5.1.3构造函数
构造函数可参考源代码,此处略。

5.1.4保存最新配置
函数功能:保存配置到文件
输入输出:null
返回值:void
说明:槽函数
void MainDialog::on_btnSaveConfig_clicked()

5.1.5加载配置文件
函数功能:加载配置文件,并显示界面上
输入输出:
返回值:void
说明:加载.ini配置文件,可打开可运行目录下的XXX.ini文件以便加深理解
void MainDialog:: on_btnLoadConfig_clicked ()

5.1.6打开端口
函数功能:打开端口
输入输出:null
返回值:void
说明:
void MainDialog:: on_btnStartCan_clicked()

32Author Mark-Q32000-
28Author Mark-Q-28121

  • 1
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值