周立功USB-CANII(linux版)与Qt线程结合

人生美好

最近在项目开发中需要用到CAN通信,才发现CAN通信语言写法是要与CAN驱动相关的。

周立功USB-CANII(linux版)使用说明:

目录

一、下载周立功USB转CANII驱动。

二、环境配置

三、通信

3.1接收

(1)创建项目

(2)初始化CAN

(3)线程接收

3.2发送

四、注意事项


 

一、下载周立功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;//设置发送的是扩展帧。

如果文章对你有所帮助请帮忙点个赞,欢迎评论区讨论。

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值