📄 testdlg.cpp
字号:
SaveArchive<<m_byteIP[1];
SaveArchive<<m_byteIP[2];
SaveArchive<<m_byteIP[3];
SaveArchive<<m_strPathName;
SaveArchive.Close();
IniFile.Close();
}
void CTestDlg::OnSelchangeCmbDevtype()
{
// TODO: Add your control notification handler code here
if(m_cmbDevType.GetCurSel() == 0)
m_devtype = VCI_USBCAN2;
else if(m_cmbDevType.GetCurSel() == 1)
m_devtype = VCI_CANETE;
UpdateUserInputWindow();
}
void CTestDlg::ListFileName(CString strPathName)
{
this->m_listSelectingFile.ResetContent();
CFileFind finder;
BOOL bWorking = finder.FindFile( strPathName +_T("*.hex") );
while (bWorking)
{
bWorking = finder.FindNextFile();
if( finder.IsDots() )
continue;
if(!finder.IsDirectory())
{
CString strFileName = finder.GetFileName();
this->m_listSelectingFile.AddString(strFileName);
}
}
}
void CTestDlg::OnButBrowse()
{
// TODO: Add your control notification handler code here
CSetPathDlg dlg;
dlg.m_strSetPath = m_strPathName;
if(dlg.DoModal() == IDOK)
{
m_strPathName = dlg.m_strSetPath;
UpdateData(false);
ListFileName(m_strPathName);
}
}
void CTestDlg::AddActCanFrame(VCI_CAN_OBJ canFrame)
{
VCI_CAN_OBJ canFrameTem[1];
canFrameTem[0] = canFrame;
canFrameTem[0].ID = canFrameTem[0].ID<<3;
if(canFrameTem[0].Header.byNodeID == m_byteNodeNo && canFrameTem[0].Header.byFuncCode >= 128)
{
m_ArrayActCanFrame.Add(canFrame);
}
}
void CTestDlg::OnButProgramdown()
{
// TODO: Add your control notification handler code here
if(m_bProgramDown)
{
m_bProgramDown = false;
SDOMessageAddString("程序下载中断!");
m_butProgramDown.SetWindowText("程序下载");
return;
}
else
{
if(m_connect == 0)
{
AfxMessageBox("请先建立网络连接!");
return;
}
if(m_listSelectingFile.GetCurSel() == LB_ERR)
{
AfxMessageBox("请先选择要下载的文件!");
return;
}
AfxBeginThread(ProgramDownThread,this);
}
}
UINT CTestDlg::ProcessActFrameThread(void *param)
{
CTestDlg *dlg=(CTestDlg*)param;
int iSize = -1;
VCI_CAN_OBJ frameinfo;
while(1)
{
if(dlg->m_connect==0)
break;
if(dlg->m_bExtendWindow == false)
{
iSize = dlg->m_ArrayActCanFrame.GetSize();
if(iSize > 0)
{
frameinfo = dlg->m_ArrayActCanFrame.GetAt(iSize-1);
dlg->ProcessActFrame(frameinfo);
dlg->m_ArrayActCanFrame.RemoveAt(iSize-1);
}
}
Sleep(100);
}
dlg->m_ArrayActCanFrame.RemoveAll();
return 0;
}
UINT CTestDlg::ProgramDownThread(void *param)
{
CTestDlg *dlg=(CTestDlg*)param;
CFile file;
CFileException fe;
CString strReadPathFileName,strFileName;
long int iLengthFile = -1;
BYTE byteSendFrameSeial = 0x00;
bool bIsTest = false;
dlg->m_listSelectingFile.GetText(dlg->m_listSelectingFile.GetCurSel(),strFileName);
strReadPathFileName = dlg->m_strPathName + strFileName;
if(strFileName == "testdown.hex")
bIsTest = true;
if(!file.Open(strReadPathFileName, CFile::modeRead, &fe))
{
AfxMessageBox("打开文件失败!");
file.Close();
return 0;
}
iLengthFile = file.GetLength();
if(iLengthFile <= 0)
{
AfxMessageBox("文件为空!");
file.Close();
return 0;
}
unsigned int iSendLengthPre = 6;
short int iPosProgress = 0;
short int iFrameSum = iLengthFile / iSendLengthPre;
unsigned int iRemainder = iLengthFile % iSendLengthPre;
dlg->m_progressProgramDown.SetRange(0,iFrameSum);
dlg->m_iNodeNo = dlg->m_cmbNodeNo.GetCurSel();
dlg->m_byteNodeNo = dlg->m_iNodeNo;
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 = dlg->m_byteNodeNo;
pFrameinfo->Header.byFuncCode = REQUEST_PROGRAM_DOWN;
pFrameinfo->ID = pFrameinfo->ID>>3;
pFrameinfo->Data[0] = dlg->m_byteNodeNo;
pFrameinfo->Data[1] = 0x00;
pFrameinfo->Data[2] = 0x00;
pFrameinfo->Data[3] = 0x00;
memcpy(&(pFrameinfo->Data[4]),&iLengthFile,4);
if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) != 1)
{
Sleep(100);
if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) != 1)
dlg->SDOMessageAddString("请求节点进入升级程序的数据发送失败!");
}
else
{
dlg->m_listSDOOutMessage.ResetContent();
CString strMessage;
strMessage.Format("文件大小为:%.2f K",iLengthFile/1000.0);
dlg->SDOMessageAddString("请求程序升级," + strMessage);
dlg->StopAllNodeRun();
dlg->m_bProgramDown = true;
dlg->m_butProgramDown.SetWindowText("停止下载");
dlg->m_butConnect.EnableWindow(false);
dlg->m_listSelectingFile.EnableWindow(false);
dlg->m_cmbNodeNo.EnableWindow(false);
dlg->EnableWindowRadioNode(false);
if(bIsTest)
dlg->m_iActFuncCodeProgramDown = ACT_REQUEST_PROGRAM_DOWN;
bool bFlagActRequestProgramDown = false;
for(int j = 0;j < 20;j++)
{
Sleep(50);
if(dlg->m_iActFuncCodeProgramDown == ACT_REQUEST_PROGRAM_DOWN)
{
bFlagActRequestProgramDown = true;
break;
}
}
if(!bFlagActRequestProgramDown)
{
dlg->SDOMessageAddString("程序升级响应超时,程序下载失败!");
dlg->m_bProgramDown = false;
}
}
pFrameinfo->Header.Reserved1 = 0x00;
pFrameinfo->Header.Reserved2 = 0xff;
pFrameinfo->Header.byNodeID = dlg->m_byteNodeNo;
pFrameinfo->Header.byFuncCode = SEND_DATA_PROGRAM_DOWN;
pFrameinfo->ID = pFrameinfo->ID>>3;
if(file.Read(&(pFrameinfo->Data[2]),iSendLengthPre) == iSendLengthPre)
{
pFrameinfo->Data[0] = byteSendFrameSeial;
pFrameinfo->Data[1] = 1;
if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) == 1)
{
byteSendFrameSeial ++;
iFrameSum --;
iPosProgress ++;
dlg->m_progressProgramDown.SetPos(iPosProgress);
}
else
{
dlg->SDOMessageAddString("发送数据流失败!");
dlg->SDOMessageAddString("程序下载失败!");
dlg->m_bProgramDown = false;
}
}
else
{
dlg->SDOMessageAddString("文件读取失败!");
dlg->SDOMessageAddString("程序下载失败!");
dlg->m_bProgramDown = false;
}
int iWaitTime = 0;
if(bIsTest)
{
dlg->m_iActFuncCodeProgramDown = ACT_DATA_PROGRAM_DOWN;
dlg->m_byteActStatusPragramDown = 0;
}
while((dlg->m_bProgramDown) && (iFrameSum > 0))
{
if(dlg->m_connect == 0)
{
dlg->m_bProgramDown = false;
dlg->SDOMessageAddString("网络中断,下载结束!");
break;
}
if(iWaitTime > 20)
{
dlg->m_bProgramDown = false;
dlg->SDOMessageAddString("回应数据流响应超时,程序下载失败!");
break;
}
if(dlg->m_iActFuncCodeProgramDown == ACT_DATA_PROGRAM_DOWN && dlg->m_byteActStatusPragramDown == 0)
{
if(file.Read(&(pFrameinfo->Data[2]),iSendLengthPre) == iSendLengthPre)
{
pFrameinfo->Data[0] = byteSendFrameSeial;
pFrameinfo->Data[1] = 1;
if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) == 1)
{
byteSendFrameSeial ++;
iFrameSum --;
iPosProgress ++;
dlg->m_progressProgramDown.SetPos(iPosProgress);
if(bIsTest)
{
dlg->m_byteActStatusPragramDown = 0x00;
}
else
{
dlg->m_iActFuncCodeProgramDown = 0x00;
dlg->m_byteActStatusPragramDown= 0xff;
}
iWaitTime = 0;
}
else
{
dlg->m_bProgramDown = false;
dlg->SDOMessageAddString("发送数据流失败!");
dlg->SDOMessageAddString("程序下载失败!");
break;
}
}
else
{
dlg->m_bProgramDown = false;
dlg->SDOMessageAddString("文件读取失败!");
dlg->SDOMessageAddString("程序下载失败!");
break;
}
}
else if(dlg->m_iActFuncCodeProgramDown == ACT_DATA_PROGRAM_DOWN && dlg->m_byteActStatusPragramDown != 0)
{
dlg->m_bProgramDown = false;
switch(dlg->m_byteActStatusPragramDown)
{
case 1:
dlg->SDOMessageAddString("程序地址溢出,程序下载失败!");
break;
case 2:
dlg->SDOMessageAddString("Flash擦除失败,程序下载失败!");
break;
case 3:
dlg->SDOMessageAddString("编程失败,程序下载失败!");
break;
case 4:
dlg->SDOMessageAddString("程序文件错误,程序下载失败!");
break;
default:
break;
}
}
else
{
iWaitTime ++;
}
Sleep(50);
}
if((iRemainder > 0) && (iFrameSum == 0))
{
pFrameinfo->Data[0] = 0x00;
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(file.Read(&(pFrameinfo->Data[2]),iRemainder) == iRemainder)
{
pFrameinfo->DataLen = iRemainder + 2;
pFrameinfo->Data[0] = byteSendFrameSeial;
pFrameinfo->Data[1] = 2;
if(VCI_Transmit(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,pFrameinfo,1) == 1)
{
byteSendFrameSeial ++;
}
else
{
dlg->m_bProgramDown = false;
dlg->SDOMessageAddString("发送最后一次数据流失败!");
dlg->SDOMessageAddString("程序下载失败!");
}
}
else
{
dlg->m_bProgramDown = false;
dlg->SDOMessageAddString("文件最后一次读取失败!");
dlg->SDOMessageAddString("程序下载失败!");
}
}
if(dlg->m_bProgramDown)
dlg->SDOMessageAddString("程序下载结束!");
dlg->ResumeAllNodeRun();
dlg->m_bProgramDown = false;
dlg->m_butProgramDown.SetWindowText("程序下载");
dlg->m_butConnect.EnableWindow(true);
dlg->m_listSelectingFile.EnableWindow(true);
dlg->m_cmbNodeNo.EnableWindow(true);
dlg->EnableWindowRadioNode(true);
file.Close();
delete pFrameinfo;
pFrameinfo = NULL;
dlg->m_iActFuncCodeProgramDown = 0x00;
return 0;
}
void CTestDlg::StopAllNodeRun()
{
unsigned char i = 0;
PVCI_CAN_OBJ pFrameinfo = new VCI_CAN_OBJ;
for(i = 0;i < 256;i++)
{
pFrameinfo->RemoteFlag = 0;
pFrameinfo->ExternFlag = 1;
pFrameinfo->SendType = 0;
pFrameinfo->DataLen = 8;
pFrameinfo->Header.Reserved1 = 0x00;
pFrameinfo->Header.Reserved2 = 0xff;
pFrameinfo->Header.byNodeID = i;
pFrameinfo->Header.byFuncCode = REQUEST_CTRL_NODERUN;
pFrameinfo->ID = pFrameinfo->ID>>3;
pFrameinfo->Data[0] = 0x00;
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;
VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1);
Sleep(10);
}
for(i = 0;i < 256;i++)
{
pFrameinfo->RemoteFlag = 0;
pFrameinfo->ExternFlag = 1;
pFrameinfo->SendType = 0;
pFrameinfo->DataLen = 8;
pFrameinfo->Header.Reserved1 = 0x00;
pFrameinfo->Header.Reserved2 = 0xff;
pFrameinfo->Header.byNodeID = i;
pFrameinfo->Header.byFuncCode = SEND_DATA_CTRL_NODERUN;
pFrameinfo->ID = pFrameinfo->ID>>3;
pFrameinfo->Data[0] = 0x02;
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;
VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1);
Sleep(10);
}
delete pFrameinfo;
pFrameinfo = NULL;
}
void CTestDlg::ResumeAllNodeRun()
{
unsigned char i = 0;
PVCI_CAN_OBJ pFrameinfo = new VCI_CAN_OBJ;
for(i = 0;i < 256;i++)
{
pFrameinfo->RemoteFlag = 0;
pFrameinfo->ExternFlag = 1;
pFrameinfo->SendType = 0;
pFrameinfo->DataLen = 8;
pFrameinfo->Header.Reserved1 = 0x00;
pFrameinfo->Header.Reserved2 = 0xff;
pFrameinfo->Header.byNodeID = i;
pFrameinfo->Header.byFuncCode = REQUEST_CTRL_NODERUN;
pFrameinfo->ID = pFrameinfo->ID>>3;
pFrameinfo->Data[0] = 0x00;
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;
VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1);
Sleep(10);
}
for(i = 0;i < 256;i++)
{
pFrameinfo->RemoteFlag = 0;
pFrameinfo->ExternFlag = 1;
pFrameinfo->SendType = 0;
pFrameinfo->DataLen = 8;
pFrameinfo->Header.Reserved1 = 0x00;
pFrameinfo->Header.Reserved2 = 0xff;
pFrameinfo->Header.byNodeID = i;
pFrameinfo->Header.byFuncCode = SEND_DATA_CTRL_NODERUN;
pFrameinfo->ID = pFrameinfo->ID>>3;
pFrameinfo->Data[0] = 0x01;
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;
VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1);
Sleep(10);
}
delete pFrameinfo;
pFrameinfo = NULL;
}
void CTestDlg::ProcessActFrame(VCI_CAN_OBJ frameinfo)
{
CString tmpstr = "",str = "";
CANHeadID canHeadID;
int j = 0;
if(frameinfo.RemoteFlag == 0)
return;
if(frameinfo.DataLen > 8)
frameinfo.DataLen = 8;
canHeadID.CANID = frameinfo.ID;
canHeadID.CANID = canHeadID.CANID<<3;
switch(canHeadID.byFuncCode)
{
case ACT_REQUEST_SOFT_VER:
for(j = 0;j<frameinfo.DataLen;j++)
{
str.Insert(str.GetLength(),frameinfo.Data[j]);
}
SDOMessageAddString(str);
break;
case ACT_REQUEST_FAILURE_INFO:
for(j = 0;j<frameinfo.DataLen;j++)
{
str.Insert(str.GetLength(),frameinfo.Data[j]);
}
SDOMessageAddString(str);
break;
case ACT_REQUEST_WATCH_PARA:
for(j = 0;j<frameinfo.DataLen;j++)
{
str.Insert(str.GetLength(),frameinfo.Data[j]);
}
SDOMessageAddString(str);
break;
case ACT_REQUEST_CTRL_NODERUN:
SDOMessageAddString("已进入节点运行控制模式");
break;
case SEND_DATA_CTRL_NODERUN:
if(frameinfo.Data[0] == 0x01)
SDOMessageAddString("允许节点运行");
else if(frameinfo.Data[0] == 0x02)
SDOMessageAddString("停止节点运行");
else if(frameinfo.Data[0] == 0x03)
SDOMessageAddString("重新启动节点");
else
SDOMessageAddString("非法的节点运行控制回应数据");
break;
case ACT_REQUEST_MODIFY_PARA:
SDOMessageAddString("已进入参数修改模式");
break;
case ACT_PARA1_DATA:
SDOMessageAddString("参数值1接受成功");
break;
case ACT_SUCCESS_MODIFY:
SDOMessageAddString("修改参数成功");
break;
case ACT_REQUEST_PROGRAM_DOWN:
SDOMessageAddString("已进入程序升级模式");
m_iActFuncCodeProgramDown = ACT_REQUEST_PROGRAM_DOWN;
break;
case ACT_DATA_PROGRAM_DOWN:
tmpstr.Format("帧ID:%08x ",frameinfo.ID);
str+=tmpstr;
for(j = 0;j<frameinfo.DataLen;j++)
{
tmpstr.Format("%02x ",frameinfo.Data[j]);
str+=tmpstr;
}
SDOMessageAddString("程序升级回流数据:" + str);
m_iActFuncCodeProgramDown = ACT_DATA_PROGRAM_DOWN;
m_byteActStatusPragramDown = frameinfo.Data[1];
break;
default:
break;
}
}
void CTestDlg::SDOMessageAddString(CString strMessage)
{
long int iSize = m_listSDOOutMessage.GetCount();
if(iSize > 200)
m_listSDOOutMessage.ResetContent();
m_listSDOOutMessage.AddString(strMessage);
m_listSDOOutMessage.SetCurSel(iSize - 1);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -