人生美好
最近在项目开发中需要用到CAN通信,才发现CAN通信语言写法是要与CAN驱动相关的。
周立功USB-CANII(linux版)使用说明:
目录
一、下载周立功USB转CANII驱动。
下载连接https://download.csdn.net/download/weixin_37997214/12525386
二、环境配置
(1)将下载好的驱动解压放到程序调用库的文件夹中,
(2)在pro文件中链接该库,
(3)将controlcan.h文件加入到程序当中
(4)插入USB-CANII
(5)chmod 777 /dev/bus/usb/001 * 给CAN驱动权限。(001文件夹需根据实际情况配置)
三、通信
直接上干货:
我们使用USB转CANII设备无非是使用CAN通信的发送和接收两种。
3.1接收
(1)创建项目
创造一个MyCanModule类。该类继承QThread。
#include <QObject>
#include<QThread>
#include"controlcan.h"
class MyCanModule : public QThread
{
Q_OBJECT
public:
MyCanModule();
void run(); //重载run函数
};
(2)初始化CAN
这里为了方便,将初始化内容写在了构造中,各位看官可以根据自己的软件架构进行设计
MyCanModule::MyCanModule()
{
//1.打开CAN通道
if(VCI_OpenDevice(VCI_USBCAN2,0,0)) //打开CAN通道
{
//打开失败
return;
}
//2.配置CAN信息
VCI_INIT_CONFIG config;
config.AccCode = 0;
config.AccMask = 0xffffffff;//全部接收
config.Filter = 1;
config.Mode = 0;//1为只读
unsigned int gBand = 0x1c03;//波特率125K
config.Timing0 = gBand&0xff;
config.Timing1 = gBand >> 8;
//3.初始化CAN信息
if(!VCI_InitCAN(VCI_USBCAN2, 0/*ID*/, 0/*CAN0*/, &config))//初始化一个USBCANII,ID是第一个(插了两个U转CAN另一个就是1)的CAN0通道
{
return;
}
//4.开始CAN通信
if(!VCI_StartCAN(VCI_USBCAN2,0,0))//开始CAN通信 ID为0 的CAN0通道
{
return;
}
}
(3)线程接收
void MyCanModule::run()
{
_VCI_CAN_OBJ canMsg;
while(1)
{
canMsg.clear();//在_VCI_CAN_OBJ 结构体中添加clear函数,功能即为将其内容清零
VCI_Receive(VCI_USBCAN2, 0, 0 ,&canMsg,1, 1000);
canMsg.ID;//获取接收到的CANID
canMsg.Data[8];//获取接收到的CAN Data
}
}
接下来只要start线程就可以接收了。
3.2发送
在上述初始化成功后的基础上添加发送函数
void MyCanModule::Send()
{ //定义发送数据
VCI_CAN_OBJ sendbuff;
sendbuff.clear();//在结构体中定义clear函数,即清空其内数据
sendbuff.ID = 0xAABBCCDD;//帧ID
sendbuff.ExternFlag = 1;//设置发送的是扩展帧
sendbuff.DataLen = sizeof (VCI_CAN_OBJ);//数据长度
sendbuff.Data[8];//数据赋值
//发送
if(1 != VCI_Transmit(VCI_USBCAN2, 0, 0, &sendbuff,1))//经过CAN0将数据发送出去
{
//发送失败
}
}
四、注意事项
在开发过程中遇到一些问题,总结如下:
(1)程序运行到OPEN就崩溃:未连接CAN盒或未使用chmod 777 /dev/bus/usb/001 * 命令给权限。
(2)程序OPEN两次就崩溃:解决方案,只走一次OPEN,在OPEN的时候会将CAN口都打开。
(3)发送的时候发送扩展帧ID接收方只能收到小于2500的帧ID:解决方案,sendbuff.ExternFlag = 1;//设置发送的是扩展帧。
如果文章对你有所帮助请帮忙点个赞,欢迎评论区讨论。