人生美好
最近在項目開發中需要用到CAN通信,才發現CAN通信語言寫法是要與CAN驅動相關的。
周立功USB-CANII(linux版)使用說明:
目錄
一、下載周立功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;//設置發送的是擴展幀。
如果文章對你有所幫助請幫忙點個贊,歡迎評論區討論。