如何在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

posted @ 2018-03-20 13:56  慧心的眼眸  阅读(2063)  评论(0编辑  收藏  举报