zoukankan      html  css  js  c++  java
  • 如何在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

  • 相关阅读:
    《那些年啊,那些事——一个程序员的奋斗史》——81
    《那些年啊,那些事——一个程序员的奋斗史》——83
    《那些年啊,那些事——一个程序员的奋斗史》——80
    《那些年啊,那些事——一个程序员的奋斗史》——82
    《那些年啊,那些事——一个程序员的奋斗史》——81
    《那些年啊,那些事——一个程序员的奋斗史》——82
    《那些年啊,那些事——一个程序员的奋斗史》——82
    网络学习杂七杂八
    字典类的代码的学习
    SNMP++ 编译记录
  • 原文地址:https://www.cnblogs.com/huan-huan/p/8608868.html
Copyright © 2011-2022 走看看