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