前言
最近工作中需要自己去開發一個上位機,上位機的通訊方式是CAN,利用Kvaser將CAN信息傳遞到上位機,所以就需要二次開發Kvaser,保證上位機的正常通訊。
原本是本着前人栽樹,後人乘涼的態度,去網絡上查找相關的源碼,不過很可惜的是,我只找到部分關於C#的源碼,而且網絡上很少有相關的資料,這裏對應的API函數可以去官網看看,裏面的內容還是挺詳細,對於英文不是很好的同學,可以參考這份文件《Kvaser API學習心得》。這篇博客也有一些資源鏈接
準備工作
1.Kvaser一條;
2.Kvaser驅動,這個可以去Kvaser官網下載;
3.安裝QT;
4.USB-CAN盒,用於接受和發送CAN報文,主要是爲了驗證我的數據發送和接收是否正確;
步驟
前面的鋪墊做好以後,可以正式來開發
1.導入CAN鏈接庫
在驅動文件夾中找到canlib文件夾
打開canlib-》Lib-》MS,找到canlib32.lib
將這個文件和canlib-》INC中canlib.h一起復制到項目文件夾下
2.初始化Kvaser
canInitializeLibrary();//kvaser初始化
h = canOpenChannel(0,canOPEN_EXCLUSIVE);//打開通道0,可以參照上述提到的Kvaser API學習心得文件中查看API詳細說明
if(h == canOK)
{
canSetBusParams(h,BAUD_500K,0,0,0,0,0);
canSetBusOutputControl(h,canDRIVER_NORMAL);
canBusOn(h);
}
3.發送數據
//這裏之發了3位數據,爲了驗證發送是否正確
char msg[64];
msg[0] = 0;
msg[1] = 1;
msg[2] = 2;
h = canWrite(h,0x123,msg,3,0);
4.接受數據
status = canRead(h,&id,&msg,&dlc,&flag,&time1);
if(status == canOK)
{
for(int i = 0; i < 8; i++)
{
msg_byte[i] = msg[i] + 0x00;//這裏轉換成了十進制
}
}
5.結果
本博客主要爲了驗證Kvaser的通信是否正常,所以界面沒有去做設計,只有一個發送按鈕,接收的數據直接輸出到了控制檯。
實驗界面:
發送:
發送的數據在代碼中:[0,1,2],所以我們看到USB-CAN的結果。
接收
數據由USB-CAN發送出,接受到的數據我直接用qDebug輸出到了控制檯(這裏我做了進制的轉換,所以顯示的數據爲十進制,比如發送10,顯示出來的會是16)