如何在VC下使用USB-CAN II接口卡操作CAN通信


1 連接USB-CAN II設備

示例代碼如下:

[cpp]  view plain  copy
 
  1. void Ctbox_CarSimulatorDlg::OnBnClickedBtConnect()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     if(m_connect ==true){   //如果已經連接  
  5.         m_connect =false;  
  6.         Sleep(500);  
  7.         GetDlgItem(IDC_BT_CONNECT)->SetWindowText("連接");  
  8.         VCI_CloseDevice(VCI_USBCAN2,0);  
  9.         return;  
  10.     }  
  11.   
  12.     //如果未連接  
  13.     UpdateData(true);  
  14.     VCI_INIT_CONFIG init_config;  
  15.     memset(&init_config,0,sizeof(VCI_INIT_CONFIG));  
  16.     init_config.AccCode=0;                  //驗收碼  
  17.     init_config.AccMask=0xffffffff;                 //屏蔽碼  
  18.     init_config.Filter=1;               //過濾方式  
  19.     init_config.Mode=0;                     //模式  
  20.     init_config.Timing0=0;              //定時器0  
  21.     init_config.Timing1=0x1c;               //定時器1  
  22.   
  23.     //打開設備  
  24.     if(VCI_OpenDevice(VCI_USBCAN2,0,0)!=STATUS_OK)  
  25.     {  
  26.         MessageBox("打開設備失敗!","警告",MB_OK|MB_ICONQUESTION);  
  27.         return;  
  28.     }  
  29.     //初始化CAN  
  30.     if(VCI_InitCAN(VCI_USBCAN2,0,m_channel_sel,&init_config)!=STATUS_OK)  
  31.     {  
  32.         MessageBox("初始化CAN失敗!","警告",MB_OK|MB_ICONQUESTION);  
  33.         VCI_CloseDevice(0,0);  
  34.         return;  
  35.     }  
  36.     //啟動CAN  
  37.     if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)  
  38.     {  
  39.         MessageBox("啟動CAN失敗!","警告",MB_OK|MB_ICONQUESTION);  
  40.         VCI_CloseDevice(0,0);  
  41.         return;  
  42.     }  
  43.     m_connect=1;  
  44.     GetDlgItem(IDC_BT_CONNECT)->SetWindowText("斷開");  
  45. }  


注:這里,定時器0必須設備為0,定時器必須設備為0x1c,在PC上才能正常工作,不然調用發送接口時老是會返回錯誤。

2 發送CAN消息

[cpp]  view plain  copy
 
  1. VCI_CAN_OBJ frameinfo;  
  2.   
  3. frameinfo.DataLen =8;  
  4. frameinfo.RemoteFlag =0;  
  5. frameinfo.ExternFlag =0;  
  6. frameinfo.SendType =0;  
  7. frameinfo.ID =CAN_ID_LOCK;  
  8. frameinfo.Data[1] =lock;  
  9. VCI_Transmit(VCI_USBCAN2,0,dlg->m_channel_sel,&frameinfo,1);  

3 接收CAN消息

接收CAN消息一般是通過個線程來實現,如下:

[cpp]  view plain  copy
 
  1. UINT Ctbox_CarSimulatorDlg::ReceiveThread(void * param)  
  2. {  
  3.     Ctbox_CarSimulatorDlg *dlg =(Ctbox_CarSimulatorDlg *)param;  
  4.   
  5.     VCI_CAN_OBJ frameinfo[50];  
  6.     VCI_ERR_INFO errinfo;   
  7.     int len=1;   
  8.     int i=0;   
  9.     while(1){  
  10.         Sleep(100);  
  11.         if(!dlg->m_connect){  
  12.             continue;  
  13.         }  
  14.         len=VCI_Receive(VCI_USBCAN2,0,dlg->m_channel_sel,frameinfo,50,200);    
  15.         if(len<=0){  
  16.             //注意:如果沒有讀到數據則必須調用此函數來讀取出當前的錯誤碼,    
  17.             //千萬不能省略這一步(即使你可能不想知道錯誤碼是什么)    
  18.             VCI_ReadErrInfo(VCI_USBCAN2,0,dlg->m_channel_sel,&errinfo);   
  19.         }  
  20.         else{  
  21.             //數據處理  
  22.             for(i=0;i<len;i++){  
  23.                 switch(frameinfo[i].ID){  
  24.                 case CANID_RC_HEAD_LIGHT:  
  25.                 case CANID_RC_HORN:  
  26.                 case CANID_RC_LOCK:  
  27.                     dlg->m_remote_control_page.SetStatus(frameinfo[i].ID,8,frameinfo[i].Data);  
  28.                     break;    
  29.                 default:  
  30.                     break;  
  31.                 }  
  32.             }  
  33.         }  
  34.   
  35.     }  
  36.     return 0;  
  37. }  


在對話框的初始化函數中啟動此接收線程:

[cpp]  view plain  copy
 
  1. AfxBeginThread(ReceiveThread,this);  


4 復位CAN

[cpp]  view plain  copy
 
  1. void Ctbox_CarSimulatorDlg::OnBnClickedBtReset()  
  2. {  
  3.     // TODO: Add your control notification handler code here  
  4.     if(m_connect==0){  
  5.         AfxMessageBox("還未連接!",0);  
  6.         return;  
  7.     }  
  8.     //復位CAN  
  9.     if(VCI_ResetCAN(VCI_USBCAN2,0,m_channel_sel)!=1)  
  10.     {  
  11.         AfxMessageBox("復位失敗",0);  
  12.     }  
  13.     //啟動CAN  
  14.     if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)  
  15.     {  
  16.         MessageBox("啟動CAN失敗!","警告",MB_OK|MB_ICONQUESTION);  
  17.         VCI_CloseDevice(0,0);  
  18.         return;  
  19.     }  
  20.     AfxMessageBox("復位成功",0);      
  21. }  

 

5 其它

工程中必須包含SDK中提供到lib文件及頭文.

即可VS2010的工程屬性頁面的Linker->Input->Addtional Dependencies一欄中設置為:./ControlCAN.lib;%(AdditionalDependencies)

然后將.cpp文件中包含頭文:

[cpp]  view plain  copy
 
  1. #include "ControlCAN.h"  

最后需要將USB-CAN II SDK中提供的ControlCAN.dll及kerneldlls文件夾拷貝到工程目錄下,程序才能正常運行。

 

如上示例代碼即可操作USB-CAN II設備。

嵌入式學習交流群:561213221


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM