📄 testcandlg.cpp
字号:
// 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 + -