📄 can.cpp
字号:
#include "stdafx.h"
#include "zzMon.h"
#include "zzMonDlg.h"
#include "CAN.h"
#include "ControlCAN.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
volatile CANSTATE CANSTATENOW ;
volatile HWND m_hTermWnd;
volatile HANDLE m_hPostMsgEvent; // 用于WM_COMMNOTIFY消息的事件对象
CWinThread* m_pThread;
UINT CANProc(LPVOID pParam)
{
CZzMonDlg *dlg=(CZzMonDlg*)pParam;
OVERLAPPED os;
DWORD RECNUM;
//VCI_ERR_INFO errinfo;
// CEpasDoc *pDoc=(CEpasDoc*)pParam;
memset(&os, 0, sizeof(OVERLAPPED));
os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);
if(os.hEvent==NULL)
{
AfxMessageBox("Can't create event object!");
return (UINT)-1;
}
while(1)
{
// if (CANSTATENOW.m_bConnected)
// {
RECNUM = VCI_GetReceiveNum(HostDevtype,HostDevind,HostCannum) ;
//VCI_ReadErrInfo(HostDevtype,HostDevind,HostCannum,&errinfo);
if (RECNUM>0)
{
WaitForSingleObject(m_hPostMsgEvent, INFINITE);
ResetEvent(m_hPostMsgEvent);
SendMessage(dlg->m_hWnd, WM_MY_MESSAGECAN, 0, 0);
}
// }
}
CloseHandle(os.hEvent);
return 0;
}
////////////////////////////////////////////////////////
BOOL SENDCANBroadcasting()
{
VCI_CAN_OBJ frameinfo;
frameinfo.DataLen=1;
frameinfo.RemoteFlag=0;
frameinfo.ExternFlag=0;
frameinfo.ID=0;
frameinfo.SendType=0;
frameinfo.Data[0]=0x37;
if(VCI_Transmit(HostDevtype,HostDevind,HostCannum,&frameinfo,1)==1)
{
// MessageBox(NULL,"广播帧成功","广播帧成功",MB_OK);
return TRUE;
}
else
{
// CANERRNO=VCI_ReadErrInfo(HostDevtype,HostDevind,HostCannum,&vei);
CANERR();
return FALSE;
}
return true;
}
////////////////////////////////////////////////////////
BOOL SENDCAN(INT ID,CHAR pParam,BYTE *wParam)
{
VCI_CAN_OBJ frameinfo;
CHAR i;
frameinfo.DataLen=8;
frameinfo.RemoteFlag=0;
frameinfo.ExternFlag=0;
frameinfo.ID=ID;
frameinfo.SendType=0;
switch(pParam)
{
case 1: //发参数帧
for (i=0;i<8;i++)
{
frameinfo.Data[i]=ParametersDataFrame[i];
}
// frameinfo.Data=ParametersDataFrame;
break;
case 2: //读图像帧
for (i=0;i<8;i++)
{
frameinfo.Data[i]=ImageDataFrame[i];
}
//frameinfo.Data=ImageDataFrame;
break;
case 3: //开关继电器
for (i=0;i<4;i++)
{
frameinfo.Data[i]=SwitchesDataFrame[i];
}
frameinfo.Data[4]=wParam[0];
frameinfo.Data[5]=wParam[1];
frameinfo.Data[6]=wParam[2];
frameinfo.Data[7]=0;
break;
case 4: //显示虫子数量
for (i=0;i<4;i++)
{
frameinfo.Data[i]=InsectNumDataFrame[i];
}
frameinfo.Data[4]=wParam[0];
frameinfo.Data[5]=wParam[1];
frameinfo.Data[6]=0;
frameinfo.Data[7]=0;
break;
case 5: //请求重发
for (i=0;i<8;i++)
{
frameinfo.Data[i]=ReSendDataFrame[i];
}
//frameinfo.Data=ReSendDataFrame;
break;
case 6: //应答命令
for (i=0;i<8;i++)
{
frameinfo.Data[i]=ResponseDataFrame[i];
}
//frameinfo.Data=ResponseDataFrame;
break;
case 7: //数据结束命令
for (i=0;i<8;i++)
{
frameinfo.Data[i]=EndDataFrame[i];
}
//frameinfo.Data=EndDataFrame;
break;
}
// if (VCI_ClearBuffer(7,0,0)==1)
// {
// return true;
// }
if(VCI_Transmit(HostDevtype,HostDevind,HostCannum,&frameinfo,1)==1)
{
return true;
}
else
{
// CANERRNO=VCI_ReadErrInfo(HostDevtype,HostDevind,HostCannum,&vei);
AfxMessageBox("发送失败");
CANERR();
return FALSE;
}
}
void CANERR()
{
VCI_ERR_INFO vei;
DWORD CANERRNO;
CANERRNO=VCI_ReadErrInfo(HostDevtype,HostDevind,HostCannum,&vei);
//错误处理
}
////////////////////////////////////////////////////////
//配置通讯端口
BOOL ConfigConnection()
{
VCI_INIT_CONFIG init_config;
init_config.AccCode=HostAccCode;//can的验证码,屏蔽码和波特率以及滤波方式
init_config.AccMask=HostAccMask;
init_config.Filter=HostFilter;
init_config.Mode=HostMode;
init_config.Timing0=HostTiming0;
init_config.Timing1=HostTiming1;
if(VCI_OpenDevice(HostDevtype,HostDevind,HostCannum)!=STATUS_OK)
{
MessageBoxA(NULL,"打开设备失败!","警告",MB_OK|MB_ICONQUESTION);
return false;
}
if(VCI_InitCAN(HostDevtype,HostDevind,HostCannum,&init_config)!=STATUS_OK)
{
MessageBoxA(NULL,"初始化CAN失败!","警告",MB_OK|MB_ICONQUESTION);
VCI_CloseDevice(HostDevtype,HostDevind);
return false ;
}
return TRUE ;
}
BOOL OpenConnection( )
{
//m_hTermWnd=hTermWnd;
//bReadFrame = FALSE;
//bReadCOM = FALSE;
if(CANSTATENOW.m_bConnected) return FALSE;
if(ConfigConnection())
{
/* m_pThread=AfxBeginThread(CANProc, CZzMonDlg->GetSafeHwnd(),//this,
THREAD_PRIORITY_NORMAL, 0,
CREATE_SUSPENDED, NULL); // 创建并挂起线程
if(m_pThread==NULL)
{
VCI_CloseDevice(HostDevtype,HostDevind);
return FALSE;
}
else
{
CANSTATENOW.m_bConnected=TRUE;
m_pThread->ResumeThread(); // 恢复线程运行 */
if(VCI_StartCAN(HostDevtype,HostDevind,HostCannum)==1) //启动CAN
{
return TRUE;
}
}
else
{
VCI_CloseDevice(HostDevtype,HostDevind);
return FALSE;
}
return FALSE;
}
///////////////////////////////////////////////////
/////////
void CloseConnection()
{
if(!CANSTATENOW.m_bConnected) return;
CANSTATENOW.m_bConnected=FALSE;
//结束CommProc线程中WaitSingleObject函数的等待
SetEvent(m_hPostMsgEvent);
//等待辅助线程终止
WaitForSingleObject(m_pThread->m_hThread, INFINITE);
m_pThread=NULL;
VCI_CloseDevice(HostDevtype,HostDevind);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -