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

📄 testdlg.cpp

📁 CAN网测试工具的源代码
💻 CPP
📖 第 1 页 / 共 4 页
字号:
			return;		
		}		
	}
	memcpy(&szFrameID[8-m_EditSendFrmID.GetLength()],(LPCTSTR)m_EditSendFrmID,m_EditSendFrmID.GetLength());
	strtodata((unsigned char*)szFrameID,FrameID,4,0);

	datalen=(m_EditSendData.GetLength()+1)/3;
	strcpy(szData,(LPCTSTR)m_EditSendData);
	strtodata((unsigned char*)szData,Data,datalen,1);


	UpdateData(false);
	
	frameinfo.DataLen=datalen;
	memcpy(&frameinfo.Data,Data,datalen);

	frameinfo.RemoteFlag=m_ComboSendFrmFmt.GetCurSel();
	frameinfo.ExternFlag=m_ComboSendFrmType.GetCurSel();
	if(frameinfo.ExternFlag==1)
	{
		frameinfo.ID=((DWORD)FrameID[0]<<24)+((DWORD)FrameID[1]<<16)+((DWORD)FrameID[2]<<8)+
			((DWORD)FrameID[3]);
	}
	else
	{
		frameinfo.ID=((DWORD)FrameID[2]<<8)+((DWORD)FrameID[3]);		
	}
	frameinfo.SendType=0;

	if(VCI_Transmit(m_devtype,m_devind,m_cannum,&frameinfo,1)==1)
	{
		CString tmpstr = "",str = "";
		tmpstr.Format("帧ID:%08x ",frameinfo.ID);
	    str+=tmpstr;
		
		if(frameinfo.RemoteFlag==0)
		{
			str = str + "数据:";

			if(frameinfo.DataLen>8)
				frameinfo.DataLen=8;
			for(int j=0;j<frameinfo.DataLen;j++)
			{
				tmpstr.Format("%02x ",frameinfo.Data[j]);
				str+=tmpstr;
			}

			ShowInfo("已写数据:  " + str,0);
		}		
	}
	else
	{
		ShowInfo("写入失败!",2);		
	}
	
}

void CTestDlg::ShowInfo(CString str, int code)
{
	if(m_ListInfo.GetCount() > 200)
		m_ListInfo.ResetContent();

	m_ListInfo.InsertString(m_ListInfo.GetCount(),str);
	m_ListInfo.SetCurSel(m_ListInfo.GetCount()-1);
}

//-----------------------------------------------------
//参数:
//str:要转换的字符串
//data:储存转换过来的数据串
//len:数据长度
//函数功能:字符串转换为数据串
//-----------------------------------------------------
int CTestDlg::strtodata(unsigned char *str, unsigned char *data,int len,int flag)
{
	unsigned char cTmp=0;
	int i=0;
	for(int j=0;j<len;j++)
	{
		if(chartoint(str[i++],&cTmp))
			return 1;
		data[j]=cTmp;
		if(chartoint(str[i++],&cTmp))
			return 1;
		data[j]=(data[j]<<4)+cTmp;
		if(flag==1)
			i++;
	}
	return 0;
}

//-----------------------------------------------------
//参数:
//chr:要转换的字符
//cint:储存转换过来的数据
//函数功能:字符转换为数据
//-----------------------------------------------------
int CTestDlg::chartoint(unsigned char chr, unsigned char *cint)
{
	unsigned char cTmp;
	cTmp=chr-48;
	if(cTmp>=0&&cTmp<=9)
	{
		*cint=cTmp;
		return 0;
	}
	cTmp=chr-65;
	if(cTmp>=0&&cTmp<=5)
	{
		*cint=(cTmp+10);
		return 0;
	}
	cTmp=chr-97;
	if(cTmp>=0&&cTmp<=5)
	{
		*cint=(cTmp+10);
		return 0;
	}
	return 1;
}

void CTestDlg::SaveFrame(VCI_CAN_OBJ* pFrameinfo,int iSize,CFile* pFile)
{
	m_bufFrame[0] = 0x88;
	unsigned char* pChar;
 	unsigned int iID = 0;
	int i = 0;
	for(i = 0;i < iSize;i++)
	{
		iID = pFrameinfo[i].ID;
		iID = iID << 3;
		pChar = (unsigned char* )&iID;
	    m_bufFrame[1] = *(pChar + 3);
		m_bufFrame[2] = *(pChar + 2);
		m_bufFrame[3] = *(pChar + 1);
		m_bufFrame[4] = *(pChar + 0);

		memcpy(m_bufFrame+5,pFrameinfo[i].Data,8);
        
		pFile->Write(m_bufFrame,13);
	}
}


UINT CTestDlg::ReceiveThread(void *param)
{
	CTestDlg *dlg=(CTestDlg*)param;
	CListBox *box=(CListBox *)dlg->GetDlgItem(IDC_LIST_INFO);
	VCI_CAN_OBJ frameinfo[150];
	VCI_ERR_INFO errinfo;
	int len=1;
	int i=0;
	CString str,tmpstr;

	CFile file;
	CFileException fe;
	CString strTime,strSavePathFileName;
	strTime = dlg->m_timeConnect.Format("%Y%m%d%H%M");
	strTime = strTime + ".dat";
	strSavePathFileName = dlg->m_strAppPath + "\\" + strTime;

	if(dlg->m_bAutoSaveCan)
	{
		if(!file.Open(strSavePathFileName, CFile::modeWrite, &fe))
			file.Open(strSavePathFileName, CFile::modeCreate | CFile::modeWrite, &fe);
		else
			file.SeekToEnd();
	}

	while(1)
	{
		Sleep(1);
		if(dlg->m_connect==0)
			break;
		len=VCI_Receive(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,frameinfo,150,200);
		if(len<=0)
		{
			//注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,
			//千万不能省略这一步(即使你可能不想知道错误码是什么)
			VCI_ReadErrInfo(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,&errinfo);
		}
		else
		{
			dlg->m_iFrameCount = dlg->m_iFrameCount + len;

			if(dlg->m_bAutoSaveCan)
				dlg->SaveFrame(frameinfo,len,&file);

			for(i=0;i<len;i++)
			{
				if(dlg->m_bExtendWindow == false)
				    dlg->AddActCanFrame(frameinfo[i]);


				if(dlg->m_bSourceDataViewEnable)
				{
					str="已收数据:  ";

                    if(dlg->m_ListInfo.m_bShowFrameHead)
					{				
						if(frameinfo[i].TimeFlag==0)
							tmpstr="时间标识:无  ";
						else
							tmpstr.Format("时间标识:%08x ",frameinfo[i].TimeStamp);
						str+=tmpstr;
					}

					tmpstr.Format("帧ID:%08x ",frameinfo[i].ID);
					str+=tmpstr;

                    if(dlg->m_ListInfo.m_bShowFrameHead)
					{
						if(frameinfo[i].RemoteFlag==0)
							tmpstr="数据帧 ";
						else
							tmpstr="远程帧 ";
						str+=tmpstr;

						if(frameinfo[i].ExternFlag==0)
							tmpstr="标准帧 ";
						else
							tmpstr="扩展帧 ";
						str+=tmpstr;
						
						box->InsertString(box->GetCount(),str);
					}
					
					if(frameinfo[i].RemoteFlag==0)
					{
						if(dlg->m_ListInfo.m_bShowFrameHead)
							str = "数据:";
						else
							str = str + "数据:";

						if(frameinfo[i].DataLen>8)
							frameinfo[i].DataLen=8;
						for(int j=0;j<frameinfo[i].DataLen;j++)
						{
							tmpstr.Format("%02x ",frameinfo[i].Data[j]);
							str+=tmpstr;
						}

						box->InsertString(box->GetCount(),str);
					}
				}
			}

			if(dlg->m_bSourceDataViewEnable)
				box->SetCurSel(box->GetCount()-1);
		}
	}

	file.Close();

	return 0;
}

void CTestDlg::OnMenuRefresh() 
{
	// TODO: Add your command handler code here
}

void CTestDlg::GetBaudRateCtrReg(int iBaudRate,UINT &uBTR0,UINT &uBTR1)
{
	switch(iBaudRate)//16M HZ
	{
	case 10000:
		uBTR0=0x31;
		uBTR1=0x1c;
		break;
	case 20000:
		uBTR0=0x18;
		uBTR1=0x1c;
		break;
	case 50000:
		uBTR0=0x09;
		uBTR1=0x1c;
		break;
	case 100000:
		uBTR0=0x04;
		uBTR1=0x1c;
		break;
	case 125000:
		uBTR0=0x03;
		uBTR1=0x1c;
		break;
	case 250000:
		uBTR0=0x01;
		uBTR1=0x1c;
		break;
	case 500000:
		uBTR0=0x00;
		uBTR1=0x1c;
		break;
	case 800000:
		uBTR0=0x00;
		uBTR1=0x16;
		break;
	case 1000000:
		uBTR0=0x00;
		uBTR1=0x14;
		break;
	default:
		break;
	}
}

void CTestDlg::OnButtonClose() 
{
	// TODO: Add your control notification handler code here
	int connect=m_connect;
	m_connect=0;
	Sleep(100);
	if(connect)
		VCI_CloseDevice(m_devtype,m_devind);
	
	DeleteCriticalSection(&m_Section);

	KillTimer(1);
	KillTimer(2);

	m_ArrayActCanFrame.RemoveAll();

	if(m_bProgramDown)
	{
		m_bProgramDown = false;
		Sleep(300);
	}

	WriteConfig();

	CDialog::OnOK();	
}

void CTestDlg::OnButtonAutoAdjust() 
{
	// TODO: Add your control notification handler code here
	if(m_connect==0)
	{
        AfxMessageBox("请先建立网络连接!");
		return;
	}

	EnableWindowRadioNode(false);

	UpdateData(true);
	
	unsigned char *p1,*p2;

	float fStandardVoltage1,fStandardVoltage2;
	int   iStandardValue1,iStandardValue2;

    fStandardVoltage1 = m_fStandardVoltage1;
	fStandardVoltage2 = m_fStandardVoltage2;

    iStandardValue1 = (int)m_fStandardVoltage1;
	iStandardValue2 = (int)m_fStandardVoltage2;

	if(m_bCheckDataType)
	{
		p1 = (unsigned char*)(&fStandardVoltage1);	
		p2 = (unsigned char*)(&fStandardVoltage2);
	}
	else
	{
		p1 = (unsigned char*)(&iStandardValue1);	
		p2 = (unsigned char*)(&iStandardValue2);
	}

	PVCI_CAN_OBJ pFrameinfo = new VCI_CAN_OBJ;

    m_iNodeNo    = m_cmbNodeNo.GetCurSel();
    m_byteNodeNo = m_iNodeNo;

	m_listAdjustMessage.SetCurSel(3);//参数校准请求帧
	pFrameinfo->RemoteFlag = 0;
	pFrameinfo->ExternFlag = 1;
	pFrameinfo->SendType   = 0;
	pFrameinfo->DataLen    = 8;
	pFrameinfo->Header.Reserved1   = 0x00;
	pFrameinfo->Header.Reserved2   = 0xff;
	pFrameinfo->Header.byNodeID    = m_byteNodeNo;
	pFrameinfo->Header.byFuncCode  = REQUEST_MODIFY_PARA;
	pFrameinfo->ID = pFrameinfo->ID>>3;
    pFrameinfo->Data[0] = m_ComboAdChannel.GetCurSel() + 1;
	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(VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1) == 1)
		SDOMessageAddString("已发送参数校准请求帧!");
	else
	{
		SDOMessageAddString("发送参数校准请求帧失败!");
		return;
	}

	if(IDYES != AfxMessageBox("请确定参数值1--已准备?",MB_YESNOCANCEL,0))
		return ;
	
	m_listAdjustMessage.SetCurSel(4);//参数值1消息帧
	pFrameinfo->RemoteFlag = 0;
	pFrameinfo->ExternFlag = 1;
	pFrameinfo->SendType   = 0;
	pFrameinfo->DataLen    = 8;
	pFrameinfo->Header.Reserved1   = 0x00;
	pFrameinfo->Header.Reserved2   = 0xff;
	pFrameinfo->Header.byNodeID    = m_byteNodeNo;
	pFrameinfo->Header.byFuncCode  = SEND_PARA1_DATA;
	pFrameinfo->ID = pFrameinfo->ID>>3;

    pFrameinfo->Data[0] = m_ComboAdChannel.GetCurSel() + 1;
	pFrameinfo->Data[1] = *(p1+0);
	pFrameinfo->Data[2] = *(p1+1);
	pFrameinfo->Data[3] = *(p1+2);
	pFrameinfo->Data[4] = *(p1+3);
	pFrameinfo->Data[5] = 0x00;
	pFrameinfo->Data[6] = 0x00;
	pFrameinfo->Data[7] = 0x00;
	if(VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1) == 1)
		SDOMessageAddString("已发送参数值1消息帧!");
	else
	{
		SDOMessageAddString("发送参数值1消息帧失败!");
		return;
	}

	if(!m_bCheckDataType)
		return;

	if(IDYES != AfxMessageBox("请确定参数值2--已准备?",MB_YESNOCANCEL,0))
		return ;

	m_listAdjustMessage.SetCurSel(5);//参数值2消息帧
	pFrameinfo->RemoteFlag = 0;
	pFrameinfo->ExternFlag = 1;
	pFrameinfo->SendType   = 0;
	pFrameinfo->DataLen    = 8;
	pFrameinfo->Header.Reserved1   = 0x00;
	pFrameinfo->Header.Reserved2   = 0xff;
	pFrameinfo->Header.byNodeID    = m_byteNodeNo;
	pFrameinfo->Header.byFuncCode  = SEND_PARA2_DATA;
	pFrameinfo->ID = pFrameinfo->ID>>3;

    pFrameinfo->Data[0] = m_ComboAdChannel.GetCurSel() + 1;
	pFrameinfo->Data[1] = *(p1+0);
	pFrameinfo->Data[2] = *(p1+1);
	pFrameinfo->Data[3] = *(p1+2);
	pFrameinfo->Data[4] = *(p1+3);
	pFrameinfo->Data[5] = 0x00;
	pFrameinfo->Data[6] = 0x00;
	pFrameinfo->Data[7] = 0x00;
	if(VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1) == 1)
		SDOMessageAddString("已发送参数值2消息帧!");
	else
	{
		SDOMessageAddString("发送参数值2消息帧失败!");
		return;
	}

	delete pFrameinfo;
	pFrameinfo = NULL;
	
	EnableWindowRadioNode(true);
}

void CTestDlg::OnSelectMessage()
{ 
	SetSendFrameIDEdit();
	SetSendDataEdit();
}

void CTestDlg::SetSendFrameIDEdit()
{
	UpdateData(true);

	CString str;
	BYTE byteFuncCode;

    int iCurSelMessage = 0;
	iCurSelMessage = m_listAdjustMessage.GetCurSel();

	switch(iCurSelMessage)
	{
	case 0://故障信息请求帧
		byteFuncCode = REQUEST_FAILURE_INFO;	
		break;
	case 1://程序版本请求帧
		byteFuncCode = REQUEST_SOFT_VER;	
		break;
	case 2://查看参数请求帧
		byteFuncCode = REQUEST_WATCH_PARA;	
		break;
	case 3://参数校准请求帧
		byteFuncCode = REQUEST_MODIFY_PARA;	
		break;
	case 4://校准参数值1消息帧
		byteFuncCode = SEND_PARA1_DATA;	
		break;
	case 5://校准参数值2消息帧
		byteFuncCode = SEND_PARA2_DATA;		
		break;
	case 6://请求节点运行控制
		byteFuncCode = REQUEST_CTRL_NODERUN;		
		break;
	case 7://允许节点运行控制指令
		byteFuncCode = SEND_DATA_CTRL_NODERUN;		
		break;
	case 8://停止节点运行控制指令
		byteFuncCode = SEND_DATA_CTRL_NODERUN;		
		break;
	case 9://重启节点运行控制指令
		byteFuncCode = SEND_DATA_CTRL_NODERUN;		
		break;
	default:
		break;
	}

	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    = m_byteNodeNo;
	pFrameinfo->Header.byFuncCode  = byteFuncCode;
	pFrameinfo->ID = pFrameinfo->ID>>3;
    
    str.Format("%x",pFrameinfo->ID);
	m_EditSendFrmID = str;

	delete pFrameinfo;
	pFrameinfo = NULL;
	
	UpdateData(false);
}


void CTestDlg::SetSendDataEdit()
{
    UpdateData(true);

	CString strAdChannel;
	int iCurSelAdChannel = m_ComboAdChannel.GetCurSel() + 1;
	strAdChannel.Format("%02x",iCurSelAdChannel);

 	int iCurSelMessage = 0;
	iCurSelMessage = m_listAdjustMessage.GetCurSel();

	ConvertVoltageString();

	switch(iCurSelMessage)
	{
	case 0://故障信息请求帧
		m_EditSendData = "00 00 00 00 00 00 00 00 ";	
		break;
	case 1://程序版本请求帧
		m_EditSendData = "00 00 00 00 00 00 00 00 ";	
		break;
	case 2://查看参数请求帧
		m_EditSendData = strAdChannel + " 00 00 00 00 00 00 00";	
		break;
	case 3://参数校准请求帧
		m_EditSendData = strAdChannel + " 00 00 00 00 00 00 00 ";	
		break;
	case 4://校准参数值1消息帧
		m_EditSendData = strAdChannel + " " + m_strSdVoltage1 + " 00 00 00 ";	
		break;
	case 5://校准参数值2消息帧
		m_EditSendData = strAdChannel + " " + m_strSdVoltage2 + " 00 00 00 ";		
		break;
	case 6://请求节点运行控制
		m_EditSendData = "00 00 00 00 00 00 00 00 ";	
		break;
	case 7://允许节点运行控制指令
		m_EditSendData = "01 00 00 00 00 00 00 00 ";		
		break;
	case 8://停止节点运行控制指令
		m_EditSendData = "02 00 00 00 00 00 00 00 ";	
		break;
	case 9://重启节点运行控制指令
		m_EditSendData = "03 00 00 00 00 00 00 00 ";		
		break;
	default:
		break;
	}
	UpdateData(false);
}

void CTestDlg::ConvertVoltageString()
{
	unsigned char *p1,*p2;
	CString str1,str2;

	float fStandardVoltage1,fStandardVoltage2;
	int   iStandardValue1,iStandardValue2;

    fStandardVoltage1 = m_fStandardVoltage1;
	fStandardVoltage2 = m_fStandardVoltage2;

    iStandardValue1 = (int)m_fStandardVoltage1;
	iStandardValue2 = (int)m_fStandardVoltage2;

	if(m_bCheckDataType)
	{
		p1 = (unsigned char*)(&fStandardVoltage1);	
		p2 = (unsigned char*)(&fStandardVoltage2);
	}
	else
	{
		p1 = (unsigned char*)(&iStandardValue1);	
		p2 = (unsigned char*)(&iStandardValue2);

⌨️ 快捷键说明

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