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

📄 testcandlg.cpp

📁 测试CAN数据的收发
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// TestCanDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestCan.h"
#include "TestCanDlg.h"
#include "D:\WINCE420\PLATFORM\SMDK2410\DRIVERS\CAN\sja1000.h"
//#include "C:\Program Files\Windows CE Tools\wce420\MY2410\Include\Armv4\ceddk.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CTestCanDlg dialog

CTestCanDlg::CTestCanDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CTestCanDlg::IDD, pParent)
{
	//{{AFX_DATA_INIT(CTestCanDlg)
	m_strIdentifier = _T("d0000140");
	m_strSendData = _T("19 78 01 04 20 06 11 30");
	m_strReceiveData = _T("");
	m_uReceiveFrameNum = 0;
	m_uSendFrameNum = 0;
	m_uSendPeriod = 1000;
	m_strBTR0 = _T("20");
	m_strBTR1 = _T("EF");
	DisplayedReceiveFrameNum=0;
	bPortOpen=false;
	m_uSendFailNum = 0;
	bFirstWrite=FALSE;
	//}}AFX_DATA_INIT
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
	//m_hIconOpen=AfxGetApp()->LoadIcon(IDI_ICON_OPEN);
	//m_hIconClose=AfxGetApp()->LoadIcon(IDI_ICON_CLOSE);
}

void CTestCanDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CTestCanDlg)
	DDX_Control(pDX, IDC_CHECK_AUTOCLEARRECEIVE, m_btnAutoClearReceive);
	DDX_Control(pDX, IDC_EDIT_RECEIVEDATA, m_editReceiveData);
	DDX_Control(pDX, IDC_EDIT_SENDDATA, m_editSendData);
	DDX_Control(pDX, IDC_BUTTON_MANUALSEND, m_btnManualSend);
	DDX_Control(pDX, IDC_BUTTON_OPENCLOSEPORT, m_btnOpenClosePort);
	DDX_Control(pDX, IDC_CHECK_PERIODICSEND, m_btnPeriodicSend);
	DDX_Control(pDX, IDC_COMBO_FRAMETYPE, m_comboFrameType);
	DDX_Control(pDX, IDC_COMBO_CANPORT, m_comboCanPort);
	DDX_Text(pDX, IDC_EDIT_ID, m_strIdentifier);
	DDV_MaxChars(pDX, m_strIdentifier, 8);
	DDX_Text(pDX, IDC_EDIT_SENDDATA, m_strSendData);
	DDX_Text(pDX, IDC_EDIT_RECEIVEDATA, m_strReceiveData);
	DDX_Text(pDX, IDC_EDIT_RECEIVEFRAMENUM, m_uReceiveFrameNum);
	DDX_Text(pDX, IDC_EDIT_SENDFRAMENUM, m_uSendFrameNum);
	DDX_Text(pDX, IDC_EDIT_SENDPERIOD, m_uSendPeriod);
	DDX_Text(pDX, IDC_EDIT_BTR0, m_strBTR0);
	DDV_MaxChars(pDX, m_strBTR0, 2);
	DDX_Text(pDX, IDC_EDIT_BTR1, m_strBTR1);
	DDV_MaxChars(pDX, m_strBTR1, 2);
	DDX_Text(pDX, IDC_EDIT_SENDFAILNUM, m_uSendFailNum);
	//}}AFX_DATA_MAP
}

BEGIN_MESSAGE_MAP(CTestCanDlg, CDialog)
	//{{AFX_MSG_MAP(CTestCanDlg)
	ON_BN_CLICKED(IDC_BUTTON_OPENCLOSEPORT, OnButtonOpencloseport)
	ON_BN_CLICKED(IDC_BUTTON_MANUALSEND, OnButtonManualsend)
	ON_CBN_SELCHANGE(IDC_COMBO_FRAMETYPE, OnSelchangeComboFrametype)
	ON_BN_CLICKED(IDC_CHECK_PERIODICSEND, OnCheckPeriodicsend)
	ON_WM_TIMER()
	ON_BN_CLICKED(IDC_BUTTON_CLEARFRAMENUM, OnButtonClearframenum)
	ON_BN_CLICKED(IDC_BUTTON_CLEARRECEIVE, OnButtonClearreceive)
	ON_CBN_SELCHANGE(IDC_COMBO_CANPORT, OnSelchangeComboCanport)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CTestCanDlg message handlers

BOOL CTestCanDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// Set the icon for this dialog.  The framework does this automatically
	//  when the application's main window is not a dialog
	SetIcon(m_hIcon, TRUE);			// Set big icon
	SetIcon(m_hIcon, FALSE);		// Set small icon
	
	CenterWindow(GetDesktopWindow());	// center to the hpc screen

/*	LPCTSTR lpszWallPaper=_T("\\coffee.bmp");
	if(!SystemParametersInfo(SPI_SETDESKWALLPAPER,0,(PVOID)lpszWallPaper,SPIF_UPDATEINIFILE))
	{
		DWORD dwLE=GetLastError();
		ShowWindow(SW_SHOW);
		CString str;
		str.Format(_T("set wall paper error! code=%u"),dwLE);
		AfxMessageBox(str);
	}
	if(!SystemParametersInfo(SPI_SETWORKAREA,0,NULL,SPIF_UPDATEINIFILE))
	{
		DWORD dwLE=GetLastError();
		ShowWindow(SW_SHOW);
		CString str;
		str.Format(_T("set work area error! code=%u"),dwLE);
		AfxMessageBox(str);
	}*/
	// TODO: Add extra initialization here
	m_comboCanPort.SetCurSel(1);
	m_comboFrameType.SetCurSel(1);
	m_btnManualSend.EnableWindow(FALSE);
	m_btnPeriodicSend.EnableWindow(FALSE);
	m_btnAutoClearReceive.SetCheck(1);
	return TRUE;  // return TRUE  unless you set the focus to a control
}

void CTestCanDlg::OnButtonOpencloseport() 
{
	// TODO: Add your control notification handler code here
	if(bPortOpen)
	{
		bPortOpen=false;
		KillTimer(1);
		KillTimer(2);
		CloseHandle(hCanPort);
		m_btnOpenClosePort.SetWindowText(_T("打开"));
		m_btnManualSend.EnableWindow(FALSE);
		m_btnPeriodicSend.SetCheck(0);
		m_btnPeriodicSend.EnableWindow(FALSE);
	}
	else
	{
		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,80,NULL);
	}
}

BYTE CTestCanDlg::GetByteFromHexData(CString str)
{
	BYTE result;
	TCHAR ch1,ch0;
	ch1=str.GetAt(0);
	ch0=str.GetAt(1);

	if((ch1>='0')&&(ch1<='9'))
		result= ch1-0x30;
	else if((ch1>='A')&&(ch1<='F'))
		result=ch1-'A'+10;
	else
		result=ch1-'a'+10;
	result*=16;

	if((ch0>='0')&&(ch0<='9'))
		result+= (ch0-0x30);
	else if((ch0>='A')&&(ch0<='F'))
		result+=(ch0-'A'+10);
	else
		result+=(ch0-'a'+10);

	return result;
}

BOOL CTestCanDlg::JustifyBTR()
{
	int testLength=m_strBTR0.GetLength();
	if(testLength!=2)
		return FALSE;
	testLength=m_strBTR1.GetLength();
	if(testLength!=2)
		return FALSE;
	TCHAR testchar;
	testchar=m_strBTR0.GetAt(0);
	if(!((testchar>='0'&&testchar<='9')||(testchar>='a'&&testchar<='f')||(testchar>='A'&&testchar<='F')))
		return FALSE;
	testchar=m_strBTR0.GetAt(1);
	if(!((testchar>='0'&&testchar<='9')||(testchar>='a'&&testchar<='f')||(testchar>='A'&&testchar<='F')))
		return FALSE;
	testchar=m_strBTR1.GetAt(0);
	if(!((testchar>='0'&&testchar<='9')||(testchar>='a'&&testchar<='f')||(testchar>='A'&&testchar<='F')))
		return FALSE;
	testchar=m_strBTR1.GetAt(1);
	if(!((testchar>='0'&&testchar<='9')||(testchar>='a'&&testchar<='f')||(testchar>='A'&&testchar<='F')))
		return FALSE;
	return TRUE;
}

void CTestCanDlg::OnButtonManualsend() 
{
	// TODO: Add your control notification handler code here
	int count=0;
	UpdateData(TRUE);
	if(!JustifySendData(m_strSendData))
	{
		MessageBox(_T("输入的发送数据作为十六进制序列非法!"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
		UpdateData(FALSE);
		return;
	}
	if(!JustifyIdentifier(m_strIdentifier))
	{
		MessageBox(_T("输入的ID作为十六进制序列非法!"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
		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]=0xc8;
	}
	senddata[1]=identifier[0];
	senddata[2]=identifier[1];
	senddata[3]=identifier[2];
	senddata[4]=identifier[3];
	/*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);
			return;
		}
	}*/
	while(count<30)
	{
		if(WriteFile(hCanPort,senddata,5+BytesOfSendData,&NumberOfBytesWritten,NULL))
		{
			if(NumberOfBytesWritten>4&&NumberOfBytesWritten<14)
			{/*
			 CANREADbuf[0]=0x02;
			 DeviceIoControl(hCanPort,IOCTL_CAN_READ,&CANREADbuf[0],1,&CANREADbuf[1],1,NULL,NULL);
			 if(!(CANREADbuf[1]&0x08))
			 m_uSendFailNum++;
				else*/
				m_uSendFrameNum++;
				UpdateData(FALSE);
				break;
			}
			else if((NumberOfBytesWritten==-1)||(NumberOfBytesWritten==0))
			{
				Sleep(5);
				count++;
				//m_uSendFailNum++;
			}
			//bFirstWrite=TRUE;
			//UpdateData(FALSE);
		}
		else
		{
			Sleep(5);
			count++;
		}
		/*else
		{
		MessageBox(_T("此帧发送失败!"),_T("错误"),MB_OK|MB_ICONEXCLAMATION);
		UpdateData(FALSE);
	}*/
	}
	if(count==30)
	{
		m_uSendFailNum++;
		UpdateData(FALSE);
	}
}

BOOL CTestCanDlg::JustifySendData(CString str)
{
	int i,index=5,InputDataLength=m_strSendData.GetLength();
	BOOL ByteStarted=FALSE,ByteEnded=FALSE;
	CString temp(_T(""));
	DWORD j=0;
	for(i=0;i<InputDataLength;i++)

⌨️ 快捷键说明

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