周立功USB-CANII(linux版)與Qt線程結合

人生美好

最近在項目開發中需要用到CAN通信,才發現CAN通信語言寫法是要與CAN驅動相關的。

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

目錄

一、下載周立功USB轉CANII驅動。

二、環境配置

三、通信

3.1接收

(1)創建項目

(2)初始化CAN

(3)線程接收

3.2發送

四、注意事項


 

一、下載周立功USB轉CANII驅動。

下載連接

二、環境配置

(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;//設置發送的是擴展幀。

如果文章對你有所幫助請幫忙點個贊,歡迎評論區討論。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章