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

📄 testdlg.cpp

📁 CAN网测试工具的源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	SaveArchive<<m_byteIP[1];
	SaveArchive<<m_byteIP[2];
	SaveArchive<<m_byteIP[3];

	SaveArchive<<m_strPathName;

	SaveArchive.Close();
	IniFile.Close();
}

void CTestDlg::OnSelchangeCmbDevtype() 
{
	// TODO: Add your control notification handler code here
	if(m_cmbDevType.GetCurSel() == 0)
		m_devtype = VCI_USBCAN2;
	else if(m_cmbDevType.GetCurSel() == 1)
		m_devtype = VCI_CANETE;

	UpdateUserInputWindow();
}


void CTestDlg::ListFileName(CString strPathName)
{
	this->m_listSelectingFile.ResetContent();
	CFileFind finder;
	BOOL bWorking = finder.FindFile( strPathName +_T("*.hex") );
	while (bWorking)   
	{
		bWorking = finder.FindNextFile();
		if( finder.IsDots() )
				continue;
		if(!finder.IsDirectory())
		{
			CString strFileName = finder.GetFileName();
			this->m_listSelectingFile.AddString(strFileName);
		}
	}
}

void CTestDlg::OnButBrowse() 
{
	// TODO: Add your control notification handler code here
	CSetPathDlg  dlg;
	dlg.m_strSetPath  = m_strPathName;
	if(dlg.DoModal() == IDOK)
	{
		m_strPathName = dlg.m_strSetPath;

	    UpdateData(false);

        ListFileName(m_strPathName);
	}
}

void CTestDlg::AddActCanFrame(VCI_CAN_OBJ canFrame)
{
    VCI_CAN_OBJ canFrameTem[1];

	canFrameTem[0] = canFrame;
	canFrameTem[0].ID = canFrameTem[0].ID<<3;

	if(canFrameTem[0].Header.byNodeID == m_byteNodeNo && canFrameTem[0].Header.byFuncCode >= 128)
	{
		m_ArrayActCanFrame.Add(canFrame);
	}
}

void CTestDlg::OnButProgramdown() 
{
	// TODO: Add your control notification handler code here
    if(m_bProgramDown)
	{
		m_bProgramDown = false;
		SDOMessageAddString("程序下载中断!");
		m_butProgramDown.SetWindowText("程序下载");
		return;
	}
	else
	{
		if(m_connect == 0)
		{
			AfxMessageBox("请先建立网络连接!");
			return;
		}

		if(m_listSelectingFile.GetCurSel() == LB_ERR)
		{
			AfxMessageBox("请先选择要下载的文件!");
			return;
		}
		
		AfxBeginThread(ProgramDownThread,this);
	}
}


UINT CTestDlg::ProcessActFrameThread(void *param)
{
	CTestDlg *dlg=(CTestDlg*)param;
	int iSize = -1;
	VCI_CAN_OBJ frameinfo;
	while(1)
	{
		if(dlg->m_connect==0)
			break;

		if(dlg->m_bExtendWindow == false)
		{
			iSize = dlg->m_ArrayActCanFrame.GetSize();
			if(iSize > 0)
			{
				frameinfo = dlg->m_ArrayActCanFrame.GetAt(iSize-1);
				dlg->ProcessActFrame(frameinfo);
				dlg->m_ArrayActCanFrame.RemoveAt(iSize-1);
			}
		}

		Sleep(100);
	}

	dlg->m_ArrayActCanFrame.RemoveAll();
	return 0;
}

UINT CTestDlg::ProgramDownThread(void *param)
{
	CTestDlg *dlg=(CTestDlg*)param;

	CFile file;
	CFileException fe;
	CString strReadPathFileName,strFileName;
	long int iLengthFile = -1;
	BYTE  byteSendFrameSeial = 0x00;

	bool bIsTest = false;

	dlg->m_listSelectingFile.GetText(dlg->m_listSelectingFile.GetCurSel(),strFileName);
	strReadPathFileName = dlg->m_strPathName +  strFileName;

	if(strFileName == "testdown.hex")
		bIsTest = true;

	if(!file.Open(strReadPathFileName, CFile::modeRead, &fe))
	{
		AfxMessageBox("打开文件失败!");
		file.Close();
		return 0;
	}

	iLengthFile = file.GetLength();
	if(iLengthFile <= 0)
	{
		AfxMessageBox("文件为空!");
		file.Close();
		return 0;
	} 

	unsigned int iSendLengthPre = 6;
	short int iPosProgress = 0;
	short int iFrameSum  = iLengthFile / iSendLengthPre;
	unsigned int iRemainder = iLengthFile % iSendLengthPre;
	dlg->m_progressProgramDown.SetRange(0,iFrameSum);

    dlg->m_iNodeNo = dlg->m_cmbNodeNo.GetCurSel();
    dlg->m_byteNodeNo = dlg->m_iNodeNo;

	PVCI_CAN_OBJ pFrameinfo = new VCI_CAN_OBJ;
	pFrameinfo->RemoteFlag = 0;
	pFrameinfo->ExternFlag = 1;
	pFrameinfo->SendType   = 0;
	pFrameinfo->DataLen    = 8;

	pFrameinfo->Header.Reserved1   = 0x00;
	pFrameinfo->Header.Reserved2   = 0xff;
	pFrameinfo->Header.byNodeID    = dlg->m_byteNodeNo;
	pFrameinfo->Header.byFuncCode  = REQUEST_PROGRAM_DOWN;
	pFrameinfo->ID = pFrameinfo->ID>>3;
	pFrameinfo->Data[0] = dlg->m_byteNodeNo;
	pFrameinfo->Data[1] = 0x00;
	pFrameinfo->Data[2] = 0x00;
	pFrameinfo->Data[3] = 0x00;

	memcpy(&(pFrameinfo->Data[4]),&iLengthFile,4);

	if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) != 1)
	{
		Sleep(100);
        if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) != 1)
			dlg->SDOMessageAddString("请求节点进入升级程序的数据发送失败!");
	}
	else
	{
		dlg->m_listSDOOutMessage.ResetContent();
		CString strMessage;
		strMessage.Format("文件大小为:%.2f K",iLengthFile/1000.0);
		dlg->SDOMessageAddString("请求程序升级," + strMessage);

        dlg->StopAllNodeRun();
		dlg->m_bProgramDown = true;
		dlg->m_butProgramDown.SetWindowText("停止下载");
		dlg->m_butConnect.EnableWindow(false);
		dlg->m_listSelectingFile.EnableWindow(false);
		dlg->m_cmbNodeNo.EnableWindow(false);
		dlg->EnableWindowRadioNode(false);

		if(bIsTest)
			dlg->m_iActFuncCodeProgramDown = ACT_REQUEST_PROGRAM_DOWN;  
		
		bool bFlagActRequestProgramDown = false;
		for(int j = 0;j < 20;j++)
		{
			Sleep(50);
			if(dlg->m_iActFuncCodeProgramDown == ACT_REQUEST_PROGRAM_DOWN)
			{
				bFlagActRequestProgramDown = true;
				break;
			}
		}
		if(!bFlagActRequestProgramDown)
		{
			dlg->SDOMessageAddString("程序升级响应超时,程序下载失败!");
			dlg->m_bProgramDown = false;
		}
	}

	pFrameinfo->Header.Reserved1   = 0x00;
	pFrameinfo->Header.Reserved2   = 0xff;
	pFrameinfo->Header.byNodeID    = dlg->m_byteNodeNo;
	pFrameinfo->Header.byFuncCode  = SEND_DATA_PROGRAM_DOWN;
	pFrameinfo->ID = pFrameinfo->ID>>3;

	if(file.Read(&(pFrameinfo->Data[2]),iSendLengthPre) == iSendLengthPre)
	{
		pFrameinfo->Data[0] = byteSendFrameSeial;
        pFrameinfo->Data[1] = 1;

		if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) == 1)
		{
			byteSendFrameSeial ++;
			iFrameSum --;
			iPosProgress ++;
			dlg->m_progressProgramDown.SetPos(iPosProgress);
		}
		else
		{
			dlg->SDOMessageAddString("发送数据流失败!");
			dlg->SDOMessageAddString("程序下载失败!");
			dlg->m_bProgramDown = false;
		}
	}
	else
	{
		dlg->SDOMessageAddString("文件读取失败!");
		dlg->SDOMessageAddString("程序下载失败!");
		dlg->m_bProgramDown = false;
	}
    
	int iWaitTime = 0;

	if(bIsTest)
	{
		dlg->m_iActFuncCodeProgramDown = ACT_DATA_PROGRAM_DOWN;
		dlg->m_byteActStatusPragramDown = 0;
	}

	while((dlg->m_bProgramDown) && (iFrameSum > 0))
	{ 
		if(dlg->m_connect == 0)
		{
			dlg->m_bProgramDown = false;
			dlg->SDOMessageAddString("网络中断,下载结束!");
			break;
		}


		if(iWaitTime > 20)
		{
            dlg->m_bProgramDown = false;
			dlg->SDOMessageAddString("回应数据流响应超时,程序下载失败!");

			break;
		}

		if(dlg->m_iActFuncCodeProgramDown == ACT_DATA_PROGRAM_DOWN && dlg->m_byteActStatusPragramDown == 0)
		{
			if(file.Read(&(pFrameinfo->Data[2]),iSendLengthPre) == iSendLengthPre)
			{
				pFrameinfo->Data[0] = byteSendFrameSeial;
				pFrameinfo->Data[1] = 1;
				if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) == 1)
				{
					byteSendFrameSeial ++;
					iFrameSum --;
					iPosProgress ++;
					dlg->m_progressProgramDown.SetPos(iPosProgress);

					if(bIsTest)
					{			
						dlg->m_byteActStatusPragramDown = 0x00;
		
					}
					else
					{
						dlg->m_iActFuncCodeProgramDown = 0x00;
						dlg->m_byteActStatusPragramDown= 0xff;
					}						

                    iWaitTime = 0;
										
				}
				else
				{
					dlg->m_bProgramDown = false;
					dlg->SDOMessageAddString("发送数据流失败!");
					dlg->SDOMessageAddString("程序下载失败!");
					break;
				}
			}
			else
			{
				dlg->m_bProgramDown = false;
				dlg->SDOMessageAddString("文件读取失败!");
				dlg->SDOMessageAddString("程序下载失败!");
				break;
			}		
		}
		else if(dlg->m_iActFuncCodeProgramDown == ACT_DATA_PROGRAM_DOWN && dlg->m_byteActStatusPragramDown != 0)
		{
			dlg->m_bProgramDown = false;
			switch(dlg->m_byteActStatusPragramDown)
			{
			case 1:
				dlg->SDOMessageAddString("程序地址溢出,程序下载失败!");
				break;
			case 2:
				dlg->SDOMessageAddString("Flash擦除失败,程序下载失败!");
				break;
			case 3:
				dlg->SDOMessageAddString("编程失败,程序下载失败!");
				break;
			case 4:
				dlg->SDOMessageAddString("程序文件错误,程序下载失败!");
				break;
			default:
				break;
			}
		}
		else
		{
			iWaitTime ++;
		}
		
		Sleep(50);
	}

	if((iRemainder > 0) && (iFrameSum == 0))
	{
        pFrameinfo->Data[0] = 0x00;
	    pFrameinfo->Data[1] = 0x00;
		pFrameinfo->Data[2] = 0x00;
		pFrameinfo->Data[3] = 0x00;
		pFrameinfo->Data[4] = 0x00;
		pFrameinfo->Data[5] = 0x00;
		pFrameinfo->Data[6] = 0x00;
		pFrameinfo->Data[7] = 0x00;
		
		if(file.Read(&(pFrameinfo->Data[2]),iRemainder) == iRemainder)
		{
			pFrameinfo->DataLen    = iRemainder + 2;

            pFrameinfo->Data[0] = byteSendFrameSeial;
            pFrameinfo->Data[1] = 2;
			if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) == 1)
			{
				byteSendFrameSeial ++;
			}
			else
			{
				dlg->m_bProgramDown = false;
				dlg->SDOMessageAddString("发送最后一次数据流失败!");
				dlg->SDOMessageAddString("程序下载失败!");
			}
		}
		else
		{
			dlg->m_bProgramDown = false;
			dlg->SDOMessageAddString("文件最后一次读取失败!");
			dlg->SDOMessageAddString("程序下载失败!");
		}
	}

    
	if(dlg->m_bProgramDown)
		dlg->SDOMessageAddString("程序下载结束!");

	dlg->ResumeAllNodeRun();
	dlg->m_bProgramDown = false;
	dlg->m_butProgramDown.SetWindowText("程序下载");
	
	dlg->m_butConnect.EnableWindow(true);
	dlg->m_listSelectingFile.EnableWindow(true);
	dlg->m_cmbNodeNo.EnableWindow(true);
	dlg->EnableWindowRadioNode(true);

	file.Close();

	delete pFrameinfo;
	pFrameinfo = NULL;

	dlg->m_iActFuncCodeProgramDown = 0x00;

	return 0;
}

void CTestDlg::StopAllNodeRun()
{
    unsigned char i = 0;
	PVCI_CAN_OBJ pFrameinfo = new VCI_CAN_OBJ;
    for(i = 0;i < 256;i++)
	{
		pFrameinfo->RemoteFlag = 0;
		pFrameinfo->ExternFlag = 1;
		pFrameinfo->SendType   = 0;
		pFrameinfo->DataLen    = 8;
		pFrameinfo->Header.Reserved1   = 0x00;
		pFrameinfo->Header.Reserved2   = 0xff;
		pFrameinfo->Header.byNodeID    = i;
		pFrameinfo->Header.byFuncCode  = REQUEST_CTRL_NODERUN;
		pFrameinfo->ID = pFrameinfo->ID>>3;
		pFrameinfo->Data[0] = 0x00;
		pFrameinfo->Data[1] = 0x00;
		pFrameinfo->Data[2] = 0x00;
		pFrameinfo->Data[3] = 0x00;
		pFrameinfo->Data[4] = 0x00;
		pFrameinfo->Data[5] = 0x00;
		pFrameinfo->Data[6] = 0x00;
		pFrameinfo->Data[7] = 0x00;

		VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1);
		Sleep(10);
	}

    for(i = 0;i < 256;i++)
	{
		pFrameinfo->RemoteFlag = 0;
		pFrameinfo->ExternFlag = 1;
		pFrameinfo->SendType   = 0;
		pFrameinfo->DataLen    = 8;
		pFrameinfo->Header.Reserved1   = 0x00;
		pFrameinfo->Header.Reserved2   = 0xff;
		pFrameinfo->Header.byNodeID    = i;
		pFrameinfo->Header.byFuncCode  = SEND_DATA_CTRL_NODERUN;
		pFrameinfo->ID = pFrameinfo->ID>>3;
		pFrameinfo->Data[0] = 0x02;
		pFrameinfo->Data[1] = 0x00;
		pFrameinfo->Data[2] = 0x00;
		pFrameinfo->Data[3] = 0x00;
		pFrameinfo->Data[4] = 0x00;
		pFrameinfo->Data[5] = 0x00;
		pFrameinfo->Data[6] = 0x00;
		pFrameinfo->Data[7] = 0x00;

		VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1);
		Sleep(10);
	}
	delete pFrameinfo;
	pFrameinfo = NULL;
}

void CTestDlg::ResumeAllNodeRun()
{
    unsigned char i = 0;
	PVCI_CAN_OBJ pFrameinfo = new VCI_CAN_OBJ;
    for(i = 0;i < 256;i++)
	{
		pFrameinfo->RemoteFlag = 0;
		pFrameinfo->ExternFlag = 1;
		pFrameinfo->SendType   = 0;
		pFrameinfo->DataLen    = 8;
		pFrameinfo->Header.Reserved1   = 0x00;
		pFrameinfo->Header.Reserved2   = 0xff;
		pFrameinfo->Header.byNodeID    = i;
		pFrameinfo->Header.byFuncCode  = REQUEST_CTRL_NODERUN;
		pFrameinfo->ID = pFrameinfo->ID>>3;
		pFrameinfo->Data[0] = 0x00;
		pFrameinfo->Data[1] = 0x00;
		pFrameinfo->Data[2] = 0x00;
		pFrameinfo->Data[3] = 0x00;
		pFrameinfo->Data[4] = 0x00;
		pFrameinfo->Data[5] = 0x00;
		pFrameinfo->Data[6] = 0x00;
		pFrameinfo->Data[7] = 0x00;

		VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1);
		Sleep(10);
	}

    for(i = 0;i < 256;i++)
	{
		pFrameinfo->RemoteFlag = 0;
		pFrameinfo->ExternFlag = 1;
		pFrameinfo->SendType   = 0;
		pFrameinfo->DataLen    = 8;
		pFrameinfo->Header.Reserved1   = 0x00;
		pFrameinfo->Header.Reserved2   = 0xff;
		pFrameinfo->Header.byNodeID    = i;
		pFrameinfo->Header.byFuncCode  = SEND_DATA_CTRL_NODERUN;
		pFrameinfo->ID = pFrameinfo->ID>>3;
		pFrameinfo->Data[0] = 0x01;
		pFrameinfo->Data[1] = 0x00;
		pFrameinfo->Data[2] = 0x00;
		pFrameinfo->Data[3] = 0x00;
		pFrameinfo->Data[4] = 0x00;
		pFrameinfo->Data[5] = 0x00;
		pFrameinfo->Data[6] = 0x00;
		pFrameinfo->Data[7] = 0x00;

		VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1);
		Sleep(10);
	}
	delete pFrameinfo;
	pFrameinfo = NULL;
}

void CTestDlg::ProcessActFrame(VCI_CAN_OBJ frameinfo)
{
	CString tmpstr = "",str = "";
	CANHeadID canHeadID;
	int j = 0;

    if(frameinfo.RemoteFlag == 0)
		return;

	if(frameinfo.DataLen > 8)
		frameinfo.DataLen = 8;

	canHeadID.CANID = frameinfo.ID;
	canHeadID.CANID = canHeadID.CANID<<3; 

	switch(canHeadID.byFuncCode)
	{
	case ACT_REQUEST_SOFT_VER: 
		for(j = 0;j<frameinfo.DataLen;j++)
		{
			str.Insert(str.GetLength(),frameinfo.Data[j]);
		}
		SDOMessageAddString(str);	
		break;
	case ACT_REQUEST_FAILURE_INFO: 
		for(j = 0;j<frameinfo.DataLen;j++)
		{
			str.Insert(str.GetLength(),frameinfo.Data[j]);
		}
		SDOMessageAddString(str);	
		break;
	case ACT_REQUEST_WATCH_PARA: 
		for(j = 0;j<frameinfo.DataLen;j++)
		{
			str.Insert(str.GetLength(),frameinfo.Data[j]);
		}
		SDOMessageAddString(str);
		break;
	case ACT_REQUEST_CTRL_NODERUN:
		SDOMessageAddString("已进入节点运行控制模式");
		break;
	case SEND_DATA_CTRL_NODERUN:
		if(frameinfo.Data[0] == 0x01)
			SDOMessageAddString("允许节点运行");
		else if(frameinfo.Data[0] == 0x02)
			SDOMessageAddString("停止节点运行");
		else if(frameinfo.Data[0] == 0x03)
			SDOMessageAddString("重新启动节点");
		else
			SDOMessageAddString("非法的节点运行控制回应数据");	
		break;
	case ACT_REQUEST_MODIFY_PARA: 
        SDOMessageAddString("已进入参数修改模式");
		break;
	case ACT_PARA1_DATA: 
		SDOMessageAddString("参数值1接受成功");
		break;
	case ACT_SUCCESS_MODIFY: 
		SDOMessageAddString("修改参数成功");
		break;
	case ACT_REQUEST_PROGRAM_DOWN: 
        SDOMessageAddString("已进入程序升级模式");
		m_iActFuncCodeProgramDown = ACT_REQUEST_PROGRAM_DOWN;
		break;
	case ACT_DATA_PROGRAM_DOWN:			
		tmpstr.Format("帧ID:%08x ",frameinfo.ID);
	    str+=tmpstr;	
		for(j = 0;j<frameinfo.DataLen;j++)
		{
			tmpstr.Format("%02x ",frameinfo.Data[j]);
			str+=tmpstr;
		}
		SDOMessageAddString("程序升级回流数据:" + str);
		m_iActFuncCodeProgramDown = ACT_DATA_PROGRAM_DOWN;
		m_byteActStatusPragramDown = frameinfo.Data[1];	
		break;
	default:
		break;
	}	
}

void CTestDlg::SDOMessageAddString(CString strMessage)
{
	long int iSize = m_listSDOOutMessage.GetCount();
	if(iSize > 200)
		m_listSDOOutMessage.ResetContent();

	m_listSDOOutMessage.AddString(strMessage);
    m_listSDOOutMessage.SetCurSel(iSize - 1);
}

⌨️ 快捷键说明

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