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

📄 testcandlg.cpp

📁 测试CAN数据的收发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		TCHAR testchar=m_strSendData.GetAt(i);
		if((testchar!=' ')&&(!(testchar>='0'&&testchar<='9'))&&(!(testchar>='a'&&testchar<='f'))&&(!(testchar>='A'&&testchar<='F')))
			return FALSE;
		if(testchar==' ')
		{
			if(ByteStarted==TRUE)
				return FALSE;
			else
			{
				ByteEnded=FALSE;
				continue;
			}
		}
		else
			if(ByteEnded==TRUE)
				return FALSE;
		temp+=testchar;
		int k=temp.GetLength();
		if(k==1)
		{
			ByteStarted=TRUE;
			ByteEnded=FALSE;
		}
		if(k==2)
		{
			senddata[index++]=GetByteFromHexData(temp);
			j++;
			if(j>8)
				return FALSE;
			temp=_T("");
			ByteEnded=TRUE;
			ByteStarted=FALSE;
		}
	}//FOR
	if(ByteStarted)
		return FALSE;
	BytesOfSendData=j;
	return TRUE;
}

BOOL CTestCanDlg::JustifyIdentifier(CString str)
{
	int i,j=0,inputIDLength=m_strIdentifier.GetLength();
	CString temp(_T(""));
	if(inputIDLength<8)
		return FALSE;
	for(i=0;i<inputIDLength;i++)
	{
		TCHAR testchar=m_strIdentifier.GetAt(i);
		if((!(testchar>='0'&&testchar<='9'))&&(!(testchar>='a'&&testchar<='f'))&&(!(testchar>='A'&&testchar<='F')))
			return FALSE;
		temp+=testchar;
		if(temp.GetLength()==2)
		{
			identifier[j]=GetByteFromHexData(temp);
			j++;
			temp=_T("");
		}
	}
	int k=m_comboFrameType.GetCurSel();
	if(k==0)
		identifier[3]&=0xf8;
	else
	{
		identifier[3]|=0x04;
		identifier[3]&=0xfc;
	}
	return TRUE;
}

void CTestCanDlg::OnSelchangeComboFrametype() 
{
	// TODO: Add your control notification handler code here
	if(m_comboFrameType.GetCurSel()==1)
		m_editSendData.EnableWindow(FALSE);
	else
		m_editSendData.EnableWindow(TRUE);
}

void CTestCanDlg::OnCheckPeriodicsend() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	if(m_btnPeriodicSend.GetCheck()==1)
	{
		if(m_uSendPeriod>10000||m_uSendPeriod<100)
		{
			MessageBox(_T("自动发送周期应在100ms到10000ms之间"),_T("提示"),MB_OK|MB_ICONEXCLAMATION);
			m_btnPeriodicSend.SetCheck(0);
			UpdateData(FALSE);
			return;
		}
		if(!JustifySendData(m_strSendData))
		{
			MessageBox(_T("输入的发送数据作为十六进制序列非法!"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
			m_btnPeriodicSend.SetCheck(0);
			UpdateData(FALSE);
			return;
		}
		if(!JustifyIdentifier(m_strIdentifier))
		{
			MessageBox(_T("输入的ID作为十六进制序列非法!"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
			m_btnPeriodicSend.SetCheck(0);
			UpdateData(FALSE);
			return;
		}
		if(m_comboFrameType.GetCurSel()==0)
		{
			switch(BytesOfSendData)
			{
			case 0:
				senddata[0]=0x80;break;
			case 1:
				senddata[0]=0x81;break;
			case 2:
				senddata[0]=0x82;break;
			case 3:
				senddata[0]=0x83;break;
			case 4:
				senddata[0]=0x84;break;
			case 5:
				senddata[0]=0x85;break;
			case 6:
				senddata[0]=0x86;break;
			case 7:
				senddata[0]=0x87;break;
			case 8:
				senddata[0]=0x88;break;
			}
		}
		else
		{
			BytesOfSendData=0;
			senddata[0]=0xc0;
		}
		senddata[1]=identifier[0];
		senddata[2]=identifier[1];
		senddata[3]=identifier[2];
		senddata[4]=identifier[3];
		SetTimer(2,m_uSendPeriod,NULL);
		m_btnManualSend.EnableWindow(FALSE);
	}
	else
	{
		KillTimer(2);
		m_btnManualSend.EnableWindow(TRUE);
	}
}

void CTestCanDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	if(nIDEvent==2)//write
	{
		if(bFirstWrite)
		{
			CANREADbuf[0]=0x02;
			DeviceIoControl(hCanPort,IOCTL_CAN_READ,&CANREADbuf[0],1,&CANREADbuf[1],1,NULL,NULL);
			if(!(CANREADbuf[1]&0x08))
			{
				m_uSendFailNum++;
				UpdateData(FALSE);
				goto outplace;
			}
		}
		if(WriteFile(hCanPort,senddata,5+BytesOfSendData,&NumberOfBytesWritten,NULL))
		{
			if(NumberOfBytesWritten>4&&NumberOfBytesWritten<14)
				m_uSendFrameNum++;
			//if((NumberOfBytesWritten==0xffffffff)||(NumberOfBytesWritten==0))
			else
				m_uSendFailNum++;
			bFirstWrite=TRUE;
			UpdateData(FALSE);
		}
		else
		{
			m_uSendFailNum++;
			UpdateData(FALSE);
		}
		/*
		m_uSendFrameNum++;
		m_uSendFailNum++;
			UpdateData(FALSE);*/
	}
	if(nIDEvent==1)//read
	{
		if(ReadFile(hCanPort,receivedata,13,&NumberOfBytesRead,NULL))
		{
			if(NumberOfBytesRead>0)
			{
				if(m_btnAutoClearReceive.GetCheck()==1)
				{
					if(DisplayedReceiveFrameNum>99)
					{
						m_strReceiveData=_T("");
						DisplayedReceiveFrameNum=0;
					}
				}
				CString temp(_T(""));
				temp.Format(_T("%.6d"),DisplayedReceiveFrameNum+1);
				m_strReceiveData+=temp;
				m_strReceiveData+=_T("     ");
				if(receivedata[0]&0x40)
					m_strReceiveData+=_T("远程帧");
				else
					m_strReceiveData+=_T("数据帧");

				m_strReceiveData+=_T("     0x");
				_ultot((receivedata[1]&0xf0)>>4,idbyte,16);
				m_strReceiveData+=idbyte;
				_ultot(receivedata[1]&0x0f,idbyte,16);
				m_strReceiveData+=idbyte;
				_ultot((receivedata[2]&0xf0)>>4,idbyte,16);
				m_strReceiveData+=idbyte;
				_ultot(receivedata[2]&0x0f,idbyte,16);
				m_strReceiveData+=idbyte;
				_ultot((receivedata[3]&0xf0)>>4,idbyte,16);
				m_strReceiveData+=idbyte;
				_ultot(receivedata[3]&0x0f,idbyte,16);
				m_strReceiveData+=idbyte;
				_ultot((receivedata[4]&0xf0)>>4,idbyte,16);
				m_strReceiveData+=idbyte;
				_ultot(receivedata[4]&0x08,idbyte,16);
				m_strReceiveData+=idbyte;
				
				if(!(receivedata[0]&0x40))
				{
					m_strReceiveData+=_T("     ");
					unsigned char tempdatabytes=receivedata[0]&0x0f;
					int index=5;
					for(int i=0;i<tempdatabytes;i++)
					{
						_ultot(receivedata[index++],idbyte,16);
						if(_tcslen(idbyte)==1)
							m_strReceiveData+=_T("0");
						m_strReceiveData+=idbyte;
						m_strReceiveData+=_T(" ");
					}
				}
				m_strReceiveData+=_T("\r\n");
				m_uReceiveFrameNum++;
				DisplayedReceiveFrameNum++;
				
				UpdateData(FALSE);
				int length=m_strReceiveData.GetLength();
				m_editReceiveData.SetSel(length,length,FALSE);
			}
		}
	}//if(nIDEvent==1)
outplace:
	CDialog::OnTimer(nIDEvent);
}

void CTestCanDlg::OnButtonClearframenum() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_uSendFrameNum=0;
	m_uReceiveFrameNum=0;
	m_uSendFailNum=0;
	UpdateData(FALSE);
}

void CTestCanDlg::OnButtonClearreceive() 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	DisplayedReceiveFrameNum=0;
	m_strReceiveData=_T("");
	UpdateData(FALSE);
}

void CTestCanDlg::OnSelchangeComboCanport() 
{
	// TODO: Add your control notification handler code here
	if(bPortOpen)
	{
		if(m_btnPeriodicSend.GetCheck()==1)
		{
			int i=m_comboCanPort.GetCurSel();
			if(i==1)
				m_comboCanPort.SetCurSel(0);
			else
				m_comboCanPort.SetCurSel(1);
			
			MessageBox(_T("请先关掉自动发送!"),_T("提示"),MB_OK|MB_ICONEXCLAMATION);
			return;
		}
		KillTimer(1);
		//KillTimer(2);
		CloseHandle(hCanPort);

		UpdateData(TRUE);
		if(!JustifyBTR())
		{
			MessageBox(_T("BTR输入错误!"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
			return;
		}
		int i=m_comboCanPort.GetCurSel();
		m_comboCanPort.GetLBText(i,m_strCanPort);
		hCanPort=CreateFile(m_strCanPort,GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
		if(hCanPort==INVALID_HANDLE_VALUE)
		{
			MessageBox(_T("无法打开此CAN口!"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
			bPortOpen=false;
			m_btnOpenClosePort.SetWindowText(_T("打开"));
			return;
		}
		BTRbuf[0]=GetByteFromHexData(m_strBTR0);
		BTRbuf[1]=GetByteFromHexData(m_strBTR1);
		if(!DeviceIoControl(hCanPort,IOCTL_CAN_SET_BAUDRATE,BTRbuf,sizeof(BTRbuf),NULL,0,NULL,NULL))
		{
			MessageBox(_T("设置波特率出错!"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
			CloseHandle(hCanPort);
			bPortOpen=false;
			m_btnOpenClosePort.SetWindowText(_T("打开"));
			return;
		}
		bPortOpen=true;
		m_btnOpenClosePort.SetWindowText(_T("关闭"));
		m_btnManualSend.EnableWindow(TRUE);
		m_btnPeriodicSend.EnableWindow(TRUE);
		SetTimer(1,50,NULL);
	}
}

⌨️ 快捷键说明

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