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

📄 canmonitorview.cpp

📁 CAN总线监听代码,非常有用
💻 CPP
字号:
// CanMonitorView.cpp : CCanMonitorView 类的实现
//

#include "stdafx.h"
#include "CanMonitor.h"

#include "CanMonitorDoc.h"
#include "CanMonitorView.h"
#include "ControlCAN.h"
#include "CanCardDlg.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif

UINT CanSnifferThread( LPVOID pParam );

unsigned int CanCardType     = 0x0;
unsigned int CanCardIndex    = 0x0;
unsigned int CanCardPort     = 0x0;
unsigned int CanPortTseg0    = 0x0;    
unsigned int CanPortTseg1    = 0x0; 
unsigned int CanPortFltType  = 0x0;
unsigned int CanPortWorkMode = 0x0;
unsigned int CanPortAcc      = 0x0;
unsigned int CanPortMask     = 0x0ffffffff;

// CCanMonitorView

IMPLEMENT_DYNCREATE(CCanMonitorView, CListView)

BEGIN_MESSAGE_MAP(CCanMonitorView, CListView)
    ON_COMMAND(ID_CAPTURE_RUN, &CCanMonitorView::OnCaptureRun)
    ON_UPDATE_COMMAND_UI(ID_CAPTURE_RUN, &CCanMonitorView::OnUpdateCaptureRun)
    ON_COMMAND(ID_EDIT_CLEAR, &CCanMonitorView::OnEditClear)
END_MESSAGE_MAP()

// CCanMonitorView 构造/析构

CCanMonitorView::CCanMonitorView()
: m_menuFlag(0)
, m_iIndex(0)
{
	// TODO: 在此处添加构造代码
    m_menuFlag = 0;
    m_iIndex = 0;
}

CCanMonitorView::~CCanMonitorView()
{
    m_menuFlag = 0;
}

BOOL CCanMonitorView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: 在此处通过修改
	//  CREATESTRUCT cs 来修改窗口类或样式
    cs.style |= LVS_REPORT;
	return CListView::PreCreateWindow(cs);
}

void CCanMonitorView::OnInitialUpdate()
{
	CListView::OnInitialUpdate();
    CListCtrl& theListCtrl = GetListCtrl();

    DWORD dwStyle = theListCtrl.GetExtendedStyle();
    dwStyle |= LVS_EX_FULLROWSELECT; 
    dwStyle |= LVS_EX_GRIDLINES;
    theListCtrl.SetExtendedStyle(dwStyle);

    theListCtrl.InsertColumn(0,_T("消息序号"),LVCFMT_CENTER,80);
    theListCtrl.InsertColumn(1,_T("CAN标识"),LVCFMT_CENTER,120);
    theListCtrl.InsertColumn(2,_T("时间戳"),LVCFMT_CENTER,120);
    theListCtrl.InsertColumn(3,_T("远程帧"),LVCFMT_CENTER,80);
    theListCtrl.InsertColumn(4,_T("扩展帧"),LVCFMT_CENTER,80);
    theListCtrl.InsertColumn(5,_T("帧长度"),LVCFMT_CENTER,65);
    theListCtrl.InsertColumn(6,_T("帧数据"),LVCFMT_CENTER,230);

    for(int idx=0;idx<1000;idx++)
    {
        theListCtrl.InsertItem(idx,_T(" "));
    }

	// TODO: 调用 GetListCtrl() 直接访问 ListView 的列表控件,
	//  从而可以用项填充 ListView。
}


// CCanMonitorView 诊断

#ifdef _DEBUG
void CCanMonitorView::AssertValid() const
{
	CListView::AssertValid();
}

void CCanMonitorView::Dump(CDumpContext& dc) const
{
	CListView::Dump(dc);
}

CCanMonitorDoc* CCanMonitorView::GetDocument() const // 非调试版本是内联的
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CCanMonitorDoc)));
	return (CCanMonitorDoc*)m_pDocument;
}
#endif //_DEBUG


// CCanMonitorView 消息处理程序

void CCanMonitorView::OnCaptureRun()
{

    if(m_menuFlag == 0)
    {
        CanCardDlg theDlg;    
        
        if(theDlg.DoModal() == IDOK)
        {
            CanCardType     = theDlg.m_iCanCardType;
            CanCardIndex    = theDlg.m_iCanCardIndex;
            CanCardPort     = theDlg.m_iCanCardPort;
            CanPortTseg0    = theDlg.m_iCanBitTseg0;
            CanPortTseg1    = theDlg.m_iCanBitTseg1;
            CanPortFltType  = theDlg.m_iCanFltMode;
            CanPortWorkMode = theDlg.m_iCanWorkMode;
            CanPortAcc      = theDlg.m_iCanFltAcc;
            CanPortMask     = theDlg.m_iCanFltMask;
        }
        else
        {
            return ;
        }
        
        m_menuFlag = 1;
        AfxBeginThread(CanSnifferThread,this);
    }
    else
    {
        m_menuFlag = 0;
    }
    // TODO: 在此添加命令处理程序代码
}

void CCanMonitorView::OnUpdateCaptureRun(CCmdUI *pCmdUI)
{
    if(m_menuFlag == 0)
    {
        pCmdUI->SetText(_T("启动(&S)"));
    }
    else
    {
        pCmdUI->SetText(_T("停止(&S)"));
    }
    // TODO: 在此添加命令更新用户界面处理程序代码
}

UINT CanSnifferThread( LPVOID pParam )
{
    CCanMonitorView* pView = (CCanMonitorView*) pParam;
    CListCtrl& theListCtrl = pView->GetListCtrl();

    VCI_CAN_OBJ frameinfo[500];
	VCI_ERR_INFO errinfo;
	VCI_INIT_CONFIG init_config;

    int len = 1;
    CString str;

    init_config.AccCode = CanPortAcc;
    init_config.AccMask = CanPortMask;
    init_config.Filter  = CanPortFltType;
    init_config.Mode    = CanPortWorkMode;
    init_config.Timing0 = CanPortTseg0; 
    init_config.Timing1 = CanPortTseg1;

    if(VCI_OpenDevice(CanCardType,CanCardIndex,0)!=STATUS_OK)
	{
		AfxMessageBox(_T("打开设备失败!"));
		return 0;
	}

    if(VCI_InitCAN(CanCardType,CanCardIndex,CanCardPort,&init_config)!=STATUS_OK) 
	{
		AfxMessageBox(_T("初始化CAN失败!"));
		VCI_CloseDevice(CanCardType,CanCardIndex);
		return 0;
	}

   	if(VCI_ResetCAN(CanCardType,CanCardIndex,CanCardPort)!=1)
	{
		AfxMessageBox(_T("CAN控制器复位失败!"));	
		VCI_CloseDevice(CanCardType,CanCardIndex);
        return 0;
	}

	if(VCI_StartCAN(CanCardType,CanCardIndex,CanCardPort)!=1)
	{
		AfxMessageBox(_T("CAN控制器启动失败!"));	
		VCI_CloseDevice(CanCardType,CanCardIndex);
        return 0;
	}

    while( pView->m_menuFlag == 1 )
    {
        len=VCI_Receive(CanCardType,CanCardIndex,CanCardPort,frameinfo,500,600);
		if(len<=0)
		{
			VCI_ReadErrInfo(CanCardType,CanCardIndex,CanCardPort,&errinfo);
		}
		else
        {
            
            for(int i=0;i<len;i++)
            {
                str.Format(_T("%04d"),pView->m_iIndex);
                theListCtrl.SetItemText(pView->m_iIndex,0,str);

                str.Format(_T("%08x"),frameinfo[i].ID);
                theListCtrl.SetItemText(pView->m_iIndex,1,str);

                if(frameinfo[i].TimeFlag == 0)
                {
                    str.Format(_T("无时间信息"));
                }
                else
                {
                    str.Format(_T("%08x"),frameinfo[i].TimeStamp);
                }
                theListCtrl.SetItemText(pView->m_iIndex,2,str);

                if(frameinfo[i].RemoteFlag == 0)
                {
                    str.Format(_T("数据帧"));
                }
                else
                {
                    str.Format(_T("远程帧"));
                }
                theListCtrl.SetItemText(pView->m_iIndex,3,str);

                if(frameinfo[i].ExternFlag == 0)
                {
                    str.Format(_T("标准帧"));
                }
                else
                {
                    str.Format(_T("扩展帧"));
                }
                theListCtrl.SetItemText(pView->m_iIndex,4,str);

                str.Format(_T("%02d"),frameinfo[i].DataLen);
                theListCtrl.SetItemText(pView->m_iIndex,5,str);

                str.Empty();
                for(int j=0;j<frameinfo[i].DataLen;j++)
                {
                    CString strTmp;
                    strTmp.Format(_T("%02x "),frameinfo[i].Data[j]);
                    str+=strTmp;
                }
                theListCtrl.SetItemText(pView->m_iIndex,6,str);

                pView->m_iIndex ++;
                if(pView->m_iIndex>=1000)pView->m_iIndex = 0;

            }
        }

    }

    VCI_CloseDevice(CanCardType,CanCardIndex);

    return 1;
}

void CCanMonitorView::OnEditClear()
{
    // TODO: 在此添加命令处理程序代码
    CListCtrl& theListCtrl = GetListCtrl();

    for(int i=0;i<1000;i++)
    {
        for(int j=0;j<7;j++)
        {
            theListCtrl.SetItemText(i,j,_T(" "));
        }
    }

    m_iIndex = 0;

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -