1 連接USB-CAN II設備
示例代碼如下:
- void Ctbox_CarSimulatorDlg::OnBnClickedBtConnect()
- {
- // TODO: Add your control notification handler code here
- if(m_connect ==true){ //如果已經連接
- m_connect =false;
- Sleep(500);
- GetDlgItem(IDC_BT_CONNECT)->SetWindowText("連接");
- VCI_CloseDevice(VCI_USBCAN2,0);
- return;
- }
- //如果未連接
- UpdateData(true);
- VCI_INIT_CONFIG init_config;
- memset(&init_config,0,sizeof(VCI_INIT_CONFIG));
- init_config.AccCode=0; //驗收碼
- init_config.AccMask=0xffffffff; //屏蔽碼
- init_config.Filter=1; //過濾方式
- init_config.Mode=0; //模式
- init_config.Timing0=0; //定時器0
- init_config.Timing1=0x1c; //定時器1
- //打開設備
- if(VCI_OpenDevice(VCI_USBCAN2,0,0)!=STATUS_OK)
- {
- MessageBox("打開設備失敗!","警告",MB_OK|MB_ICONQUESTION);
- return;
- }
- //初始化CAN
- if(VCI_InitCAN(VCI_USBCAN2,0,m_channel_sel,&init_config)!=STATUS_OK)
- {
- MessageBox("初始化CAN失敗!","警告",MB_OK|MB_ICONQUESTION);
- VCI_CloseDevice(0,0);
- return;
- }
- //啟動CAN
- if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
- {
- MessageBox("啟動CAN失敗!","警告",MB_OK|MB_ICONQUESTION);
- VCI_CloseDevice(0,0);
- return;
- }
- m_connect=1;
- GetDlgItem(IDC_BT_CONNECT)->SetWindowText("斷開");
- }
注:這里,定時器0必須設備為0,定時器必須設備為0x1c,在PC上才能正常工作,不然調用發送接口時老是會返回錯誤。
2 發送CAN消息
- VCI_CAN_OBJ frameinfo;
- frameinfo.DataLen =8;
- frameinfo.RemoteFlag =0;
- frameinfo.ExternFlag =0;
- frameinfo.SendType =0;
- frameinfo.ID =CAN_ID_LOCK;
- frameinfo.Data[1] =lock;
- VCI_Transmit(VCI_USBCAN2,0,dlg->m_channel_sel,&frameinfo,1);
3 接收CAN消息
接收CAN消息一般是通過個線程來實現,如下:
- UINT Ctbox_CarSimulatorDlg::ReceiveThread(void * param)
- {
- Ctbox_CarSimulatorDlg *dlg =(Ctbox_CarSimulatorDlg *)param;
- VCI_CAN_OBJ frameinfo[50];
- VCI_ERR_INFO errinfo;
- int len=1;
- int i=0;
- while(1){
- Sleep(100);
- if(!dlg->m_connect){
- continue;
- }
- len=VCI_Receive(VCI_USBCAN2,0,dlg->m_channel_sel,frameinfo,50,200);
- if(len<=0){
- //注意:如果沒有讀到數據則必須調用此函數來讀取出當前的錯誤碼,
- //千萬不能省略這一步(即使你可能不想知道錯誤碼是什么)
- VCI_ReadErrInfo(VCI_USBCAN2,0,dlg->m_channel_sel,&errinfo);
- }
- else{
- //數據處理
- for(i=0;i<len;i++){
- switch(frameinfo[i].ID){
- case CANID_RC_HEAD_LIGHT:
- case CANID_RC_HORN:
- case CANID_RC_LOCK:
- dlg->m_remote_control_page.SetStatus(frameinfo[i].ID,8,frameinfo[i].Data);
- break;
- default:
- break;
- }
- }
- }
- }
- return 0;
- }
在對話框的初始化函數中啟動此接收線程:
- AfxBeginThread(ReceiveThread,this);
4 復位CAN
- void Ctbox_CarSimulatorDlg::OnBnClickedBtReset()
- {
- // TODO: Add your control notification handler code here
- if(m_connect==0){
- AfxMessageBox("還未連接!",0);
- return;
- }
- //復位CAN
- if(VCI_ResetCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
- {
- AfxMessageBox("復位失敗",0);
- }
- //啟動CAN
- if(VCI_StartCAN(VCI_USBCAN2,0,m_channel_sel)!=1)
- {
- MessageBox("啟動CAN失敗!","警告",MB_OK|MB_ICONQUESTION);
- VCI_CloseDevice(0,0);
- return;
- }
- AfxMessageBox("復位成功",0);
- }
5 其它
工程中必須包含SDK中提供到lib文件及頭文.
即可VS2010的工程屬性頁面的Linker->Input->Addtional Dependencies一欄中設置為:./ControlCAN.lib;%(AdditionalDependencies)
然后將.cpp文件中包含頭文:
- #include "ControlCAN.h"
最后需要將USB-CAN II SDK中提供的ControlCAN.dll及kerneldlls文件夾拷貝到工程目錄下,程序才能正常運行。
如上示例代碼即可操作USB-CAN II設備。
嵌入式學習交流群:561213221