⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 can.cpp

📁 用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 + -