基于VC的can总线通讯.doc_第1页
基于VC的can总线通讯.doc_第2页
基于VC的can总线通讯.doc_第3页
基于VC的can总线通讯.doc_第4页
基于VC的can总线通讯.doc_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

/接口卡类型定义 #define VCI_PCI5121 1 #define VCI_PCI9810 2 #define VCI_USBCAN1 3 #define VCI_USBCAN2 4 #define VCI_PCI9820 5 #define VCI_CAN232 6 /CAN错误码 #define ERR_CAN_OVERFLOW 0x0001 /CAN控制器内部FIFO溢出 #define ERR_CAN_ERRALARM 0x0002 /CAN控制器错误报警 #define ERR_CAN_PASSIVE 0x0004 /CAN控制器消极错误 #define ERR_CAN_LOSE 0x0008 /CAN控制器仲裁丢失 #define ERR_CAN_BUSERR 0x0010 /CAN控制器总线错误 /通用错误码 #define ERR_DEVICEOPENED 0x0100 /设备已经打开 #define ERR_DEVICEOPEN 0x0200 /打开设备错误 #define ERR_DEVICENOTOPEN 0x0400 /设备没有打开 #define ERR_BUFFEROVERFLOW 0x0800 /缓冲区溢出 #define ERR_DEVICENOTEXIST 0x1000 /此设备不存在 #define ERR_LOADKERNELDLL 0x2000 /装载动态库失败 #define ERR_CMDFAILED 0x4000 /执行命令失败错误码 #define ERR_BUFFERCREATE 0x8000 /内存不足 /函数调用返回状态值 #define STATUS_OK 1 #define STATUS_ERR 0 /1.ZLGCAN系列接口卡信息的数据类型。 typedef struct _VCI_BOARD_INFO USHORT hw_Version; USHORT fw_Version; USHORT dr_Version; USHORT in_Version; USHORT irq_Num; BYTE can_Num; CHAR str_Serial_Num20; CHAR str_hw_Type40; USHORT Reserved4; VCI_BOARD_INFO,*PVCI_BOARD_INFO; /2.定义CAN信息帧的数据类型。 typedef struct _VCI_CAN_OBJ UINT ID; UINT TimeStamp; BYTE TimeFlag; BYTE SendType; BYTE RemoteFlag;/是否是远程帧 BYTE ExternFlag;/是否是扩展帧 BYTE DataLen; BYTE Data8; BYTE Reserved3; VCI_CAN_OBJ,*PVCI_CAN_OBJ; /3.定义CAN控制器状态的数据类型。 typedef struct _VCI_CAN_STATUS UCHAR ErrInterrupt; UCHAR regMode; UCHAR regStatus; UCHAR regALCapture; UCHAR regECCapture; UCHAR regEWLimit; UCHAR regRECounter; UCHAR regTECounter; DWORD Reserved; VCI_CAN_STATUS,*PVCI_CAN_STATUS; /4.定义错误信息的数据类型。 typedef struct _ERR_INFO UINT ErrCode; BYTE Passive_ErrData3; BYTE ArLost_ErrData; VCI_ERR_INFO,*PVCI_ERR_INFO; /5.定义初始化CAN的数据类型 typedef struct _INIT_CONFIG DWORD AccCode; DWORD AccMask; DWORD Reserved; UCHAR Filter; UCHAR Timing0; UCHAR Timing1; UCHAR Mode; VCI_INIT_CONFIG,*PVCI_INIT_CONFIG; DWORD _stdcall VCI_OpenDevice(DWORD DeviceType,DWORD DeviceInd,DWORD Reserved); DWORD _stdcall VCI_CloseDevice(DWORD DeviceType,DWORD DeviceInd); DWORD _stdcall VCI_InitCAN(DWORD DeviceType, DWORD DeviceInd, DWORD CANInd, PVCI_INIT_CONFIG pInitConfig); DWORD _stdcall VCI_ReadBoardInfo(DWORD DeviceType,DWORD DeviceInd,PVCI_BOARD_INFO pInfo); DWORD _stdcall VCI_ReadErrInfo(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_ERR_INFO pErrInfo); DWORD _stdcall VCI_ReadCANStatus(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_STATUS pCANStatus); DWORD _stdcall VCI_GetReference(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData); DWORD _stdcall VCI_SetReference(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,DWORD RefType,PVOID pData); ULONG _stdcall VCI_GetReceiveNum(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd); DWORD _stdcall VCI_ClearBuffer(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd); DWORD _stdcall VCI_StartCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd); DWORD _stdcall VCI_ResetCAN(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd); ULONG _stdcall VCI_Transmit(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pSend,ULONG Len); ULONG _stdcall VCI_Receive(DWORD DeviceType,DWORD DeviceInd,DWORD CANInd,PVCI_CAN_OBJ pReceive,ULONG Len,INT WaitTime=-1) 以上为头文件 然后你必须把对方的LIB文件导入库引入工程 以下是对话框 其中实现收发void CTestDlg:OnButtonStartcan() / TODO: Add your control notification handler code here if(m_connect=0) return; if(VCI_StartCAN(m_devtype,m_devind,m_cannum)=1) ShowInfo( 启动成功 ,0); else CString str; str= 启动失败 ; ShowInfo(str,2); theApp.TimerID=timeSetEvent(3,0,fnTimerProc,NULL,TIME_PERIODIC);/设置多媒体定时器。 SetTimer(1,55,NULL); void CTestDlg:OnButtonConnect() / TODO: Add your control notification handler code here if(m_connect=1) m_connect=0; Sleep(500); GetDlgItem(IDC_BUTTON_CONNECT)- SetWindowText( 连接 ); VCI_CloseDevice(m_devtype,m_devind); return; VCI_INIT_CONFIG init_config; int index,filtertype,mode,cannum; CString strcode,strmask,strtiming0,strtiming1,strtmp; char szcode20,szmask20,sztiming020,sztiming120; unsigned char sztmp4; DWORD code,mask,timing0,timing1; UpdateData(true); index=0;/设备索引好,0为PCI5121,m_ComboIndex.GetCurSel(); filtertype=filter_type;/滤波的方式,0为单滤波,1为双滤波。m_ComboFilterType.GetCurSel(); mode=0;/m_ComboMode.GetCurSel();/0 正常模式 1,只听模式。 cannum=can_number;/CAN 的路数,0或1;m_ComboCANInd.GetCurSel(); strcode=Acode;/m_EditCode;代码 strmask=Amask;/m_EditMask;验收屏蔽码; if(braut=0)strtiming0= c0 ;strtiming1= 14 ; if(braut=1)strtiming0= c0 ;strtiming1= 1c ; if(braut=2)strtiming0= c1 ;strtiming1= 1c ; if(braut=3)strtiming0= c3 ;strtiming1= 1c ; if(braut=4)strtiming0= c4 ;strtiming1= 1c ; if(braut=5)strtiming0= c9 ;strtiming1= 1c ; if(braut=6)strtiming0= 18 ;strtiming1= 1c ; if(braut=7)strtiming0= 31 ;strtiming1= 1c ; UpdateData(false); strtmp=strcode; strcode.Format( %08s ,strtmp); strtmp=strmask; strmask.Format( %08s ,strtmp); strtmp=strtiming0; strtiming0.Format( %02s ,strtmp); strtmp=strtiming1; strtiming1.Format( %02s ,strtmp); strcpy(szcode,(LPCTSTR)strcode); strcpy(szmask,(LPCTSTR)strmask); strcpy(sztiming0,(LPCTSTR)strtiming0); strcpy(sztiming1,(LPCTSTR)strtiming1); if(strtodata(unsigned char*)szcode,sztmp,4,0)!=0) MessageBox( 验收码数据格式不对! , 警告 ,MB_OK|MB_ICONQUESTION); return; code=(DWORD)sztmp0) 24)+(DWORD)sztmp1) 16)+(DWORD)sztmp2) 8)+ (DWORD)sztmp3); if(strtodata(unsigned char*)szmask,sztmp,4,0)!=0) MessageBox( 屏蔽码数据格式不对! , 警告 ,MB_OK|MB_ICONQUESTION); return; mask=(DWORD)sztmp0) 24)+(DWORD)sztmp1) 16)+(DWORD)sztmp2) SetWindowText( 断开 ); / AfxBeginThread(ReceiveThread,this);/开始线程; void CALLBACK fnTimerProc(UINT uID,UINT uMsg,DWORD dwUser,DWORD dw1,DWORD dw2)/多媒体定时器回掉函数 CTestDlg * dlg; dlg=(CTestDlg *)(theApp.m_pMainWnd); dlg- receive();/调用接受函数。 sjtime+; if(sjtime%1=0) dlg- send(); int CTestDlg:receive() /接受函数。 CTestDlg * dlg; dlg=(CTestDlg *)(theApp.m_pMainWnd); CListBox *box=(CListBox *)dlg- GetDlgItem(IDC_LIST_INFO); VCI_CAN_OBJ frameinfo50; VCI_ERR_INFO errinfo; int len=1; int i=0; CString str,tmpstr; / Sleep(1); if(dlg- m_connect=0) return(0); len=VCI_Receive(dlg- m_devtype,dlg- m_devind,dlg- m_cannum,frameinfo,5,0); if(len m_devtype,dlg- m_devind,dlg- m_cannum,&errinfo); else for(i=0;i fp, %d ,dlg- receivetime); str= 接收到数据帧: ; if(frameinfoi.TimeFlag=0) tmpstr= 时间标识:无 ; else tmpstr.Format( 时间标识:%08x ,frameinfoi.TimeStamp); str+=tmpstr; tmpstr.Format( 帧ID:%08x ,frameinfoi.ID); str+=tmpstr; str+= 帧格式: ; if(frameinfoi.RemoteFlag=0) tmpstr= 数据帧 ; else tmpstr= 远程帧 ; str+=tmpstr; str+= 帧类型: ; if(frameinfoi.ExternFlag=0) tmpstr= 标准帧 ; else tmpstr= 扩展帧 ; str+=tmpstr; / box- InsertString(box- GetCount(),str);/不显示否则来不及 fprintf(dlg- fp, %s ,str); if(frameinfoi.RemoteFlag=0)/若是数据就接受数据 str= 数据: ; if(frameinfoi.DataLen 8) frameinfoi.DataLen=8; for(int j=0;j m_Section); /LeaveCriticalSection(&(dlg- m_Section); / box- InsertString(box- GetCount(),str);/不显示否则来不及 fprintf(dlg- fp, %sn ,str);/将收到的数据放到文件中。 if(frameinfoi.RemoteFlag!=0) str= 远程帧 ; fprintf(dlg- fp, %sn ,str); dlg- receivetime+;/receive 次数。 box- SetCurSel(box- GetCount()-1); return(1); void CTestDlg:send() if(m_connect=0) return; VCI_CAN_OBJ frameinfo; char szFrameID9; unsigned char FrameID4=0,0,0,0; memset(szFrameID, 0 ,9); unsigned char Data8; / char szData25; BYTE datalen=0;/ int i=0; memcpy(&szFrameID0,(LPCTSTR)sendid,8);/注意这种将CString 类型转化位char的方

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论