📄 testdlg.cpp
字号:
return;
}
}
memcpy(&szFrameID[8-m_EditSendFrmID.GetLength()],(LPCTSTR)m_EditSendFrmID,m_EditSendFrmID.GetLength());
strtodata((unsigned char*)szFrameID,FrameID,4,0);
datalen=(m_EditSendData.GetLength()+1)/3;
strcpy(szData,(LPCTSTR)m_EditSendData);
strtodata((unsigned char*)szData,Data,datalen,1);
UpdateData(false);
frameinfo.DataLen=datalen;
memcpy(&frameinfo.Data,Data,datalen);
frameinfo.RemoteFlag=m_ComboSendFrmFmt.GetCurSel();
frameinfo.ExternFlag=m_ComboSendFrmType.GetCurSel();
if(frameinfo.ExternFlag==1)
{
frameinfo.ID=((DWORD)FrameID[0]<<24)+((DWORD)FrameID[1]<<16)+((DWORD)FrameID[2]<<8)+
((DWORD)FrameID[3]);
}
else
{
frameinfo.ID=((DWORD)FrameID[2]<<8)+((DWORD)FrameID[3]);
}
frameinfo.SendType=0;
if(VCI_Transmit(m_devtype,m_devind,m_cannum,&frameinfo,1)==1)
{
CString tmpstr = "",str = "";
tmpstr.Format("帧ID:%08x ",frameinfo.ID);
str+=tmpstr;
if(frameinfo.RemoteFlag==0)
{
str = str + "数据:";
if(frameinfo.DataLen>8)
frameinfo.DataLen=8;
for(int j=0;j<frameinfo.DataLen;j++)
{
tmpstr.Format("%02x ",frameinfo.Data[j]);
str+=tmpstr;
}
ShowInfo("已写数据: " + str,0);
}
}
else
{
ShowInfo("写入失败!",2);
}
}
void CTestDlg::ShowInfo(CString str, int code)
{
if(m_ListInfo.GetCount() > 200)
m_ListInfo.ResetContent();
m_ListInfo.InsertString(m_ListInfo.GetCount(),str);
m_ListInfo.SetCurSel(m_ListInfo.GetCount()-1);
}
//-----------------------------------------------------
//参数:
//str:要转换的字符串
//data:储存转换过来的数据串
//len:数据长度
//函数功能:字符串转换为数据串
//-----------------------------------------------------
int CTestDlg::strtodata(unsigned char *str, unsigned char *data,int len,int flag)
{
unsigned char cTmp=0;
int i=0;
for(int j=0;j<len;j++)
{
if(chartoint(str[i++],&cTmp))
return 1;
data[j]=cTmp;
if(chartoint(str[i++],&cTmp))
return 1;
data[j]=(data[j]<<4)+cTmp;
if(flag==1)
i++;
}
return 0;
}
//-----------------------------------------------------
//参数:
//chr:要转换的字符
//cint:储存转换过来的数据
//函数功能:字符转换为数据
//-----------------------------------------------------
int CTestDlg::chartoint(unsigned char chr, unsigned char *cint)
{
unsigned char cTmp;
cTmp=chr-48;
if(cTmp>=0&&cTmp<=9)
{
*cint=cTmp;
return 0;
}
cTmp=chr-65;
if(cTmp>=0&&cTmp<=5)
{
*cint=(cTmp+10);
return 0;
}
cTmp=chr-97;
if(cTmp>=0&&cTmp<=5)
{
*cint=(cTmp+10);
return 0;
}
return 1;
}
void CTestDlg::SaveFrame(VCI_CAN_OBJ* pFrameinfo,int iSize,CFile* pFile)
{
m_bufFrame[0] = 0x88;
unsigned char* pChar;
unsigned int iID = 0;
int i = 0;
for(i = 0;i < iSize;i++)
{
iID = pFrameinfo[i].ID;
iID = iID << 3;
pChar = (unsigned char* )&iID;
m_bufFrame[1] = *(pChar + 3);
m_bufFrame[2] = *(pChar + 2);
m_bufFrame[3] = *(pChar + 1);
m_bufFrame[4] = *(pChar + 0);
memcpy(m_bufFrame+5,pFrameinfo[i].Data,8);
pFile->Write(m_bufFrame,13);
}
}
UINT CTestDlg::ReceiveThread(void *param)
{
CTestDlg *dlg=(CTestDlg*)param;
CListBox *box=(CListBox *)dlg->GetDlgItem(IDC_LIST_INFO);
VCI_CAN_OBJ frameinfo[150];
VCI_ERR_INFO errinfo;
int len=1;
int i=0;
CString str,tmpstr;
CFile file;
CFileException fe;
CString strTime,strSavePathFileName;
strTime = dlg->m_timeConnect.Format("%Y%m%d%H%M");
strTime = strTime + ".dat";
strSavePathFileName = dlg->m_strAppPath + "\\" + strTime;
if(dlg->m_bAutoSaveCan)
{
if(!file.Open(strSavePathFileName, CFile::modeWrite, &fe))
file.Open(strSavePathFileName, CFile::modeCreate | CFile::modeWrite, &fe);
else
file.SeekToEnd();
}
while(1)
{
Sleep(1);
if(dlg->m_connect==0)
break;
len=VCI_Receive(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,frameinfo,150,200);
if(len<=0)
{
//注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,
//千万不能省略这一步(即使你可能不想知道错误码是什么)
VCI_ReadErrInfo(dlg->m_devtype,dlg->m_devind,dlg->m_cannum,&errinfo);
}
else
{
dlg->m_iFrameCount = dlg->m_iFrameCount + len;
if(dlg->m_bAutoSaveCan)
dlg->SaveFrame(frameinfo,len,&file);
for(i=0;i<len;i++)
{
if(dlg->m_bExtendWindow == false)
dlg->AddActCanFrame(frameinfo[i]);
if(dlg->m_bSourceDataViewEnable)
{
str="已收数据: ";
if(dlg->m_ListInfo.m_bShowFrameHead)
{
if(frameinfo[i].TimeFlag==0)
tmpstr="时间标识:无 ";
else
tmpstr.Format("时间标识:%08x ",frameinfo[i].TimeStamp);
str+=tmpstr;
}
tmpstr.Format("帧ID:%08x ",frameinfo[i].ID);
str+=tmpstr;
if(dlg->m_ListInfo.m_bShowFrameHead)
{
if(frameinfo[i].RemoteFlag==0)
tmpstr="数据帧 ";
else
tmpstr="远程帧 ";
str+=tmpstr;
if(frameinfo[i].ExternFlag==0)
tmpstr="标准帧 ";
else
tmpstr="扩展帧 ";
str+=tmpstr;
box->InsertString(box->GetCount(),str);
}
if(frameinfo[i].RemoteFlag==0)
{
if(dlg->m_ListInfo.m_bShowFrameHead)
str = "数据:";
else
str = str + "数据:";
if(frameinfo[i].DataLen>8)
frameinfo[i].DataLen=8;
for(int j=0;j<frameinfo[i].DataLen;j++)
{
tmpstr.Format("%02x ",frameinfo[i].Data[j]);
str+=tmpstr;
}
box->InsertString(box->GetCount(),str);
}
}
}
if(dlg->m_bSourceDataViewEnable)
box->SetCurSel(box->GetCount()-1);
}
}
file.Close();
return 0;
}
void CTestDlg::OnMenuRefresh()
{
// TODO: Add your command handler code here
}
void CTestDlg::GetBaudRateCtrReg(int iBaudRate,UINT &uBTR0,UINT &uBTR1)
{
switch(iBaudRate)//16M HZ
{
case 10000:
uBTR0=0x31;
uBTR1=0x1c;
break;
case 20000:
uBTR0=0x18;
uBTR1=0x1c;
break;
case 50000:
uBTR0=0x09;
uBTR1=0x1c;
break;
case 100000:
uBTR0=0x04;
uBTR1=0x1c;
break;
case 125000:
uBTR0=0x03;
uBTR1=0x1c;
break;
case 250000:
uBTR0=0x01;
uBTR1=0x1c;
break;
case 500000:
uBTR0=0x00;
uBTR1=0x1c;
break;
case 800000:
uBTR0=0x00;
uBTR1=0x16;
break;
case 1000000:
uBTR0=0x00;
uBTR1=0x14;
break;
default:
break;
}
}
void CTestDlg::OnButtonClose()
{
// TODO: Add your control notification handler code here
int connect=m_connect;
m_connect=0;
Sleep(100);
if(connect)
VCI_CloseDevice(m_devtype,m_devind);
DeleteCriticalSection(&m_Section);
KillTimer(1);
KillTimer(2);
m_ArrayActCanFrame.RemoveAll();
if(m_bProgramDown)
{
m_bProgramDown = false;
Sleep(300);
}
WriteConfig();
CDialog::OnOK();
}
void CTestDlg::OnButtonAutoAdjust()
{
// TODO: Add your control notification handler code here
if(m_connect==0)
{
AfxMessageBox("请先建立网络连接!");
return;
}
EnableWindowRadioNode(false);
UpdateData(true);
unsigned char *p1,*p2;
float fStandardVoltage1,fStandardVoltage2;
int iStandardValue1,iStandardValue2;
fStandardVoltage1 = m_fStandardVoltage1;
fStandardVoltage2 = m_fStandardVoltage2;
iStandardValue1 = (int)m_fStandardVoltage1;
iStandardValue2 = (int)m_fStandardVoltage2;
if(m_bCheckDataType)
{
p1 = (unsigned char*)(&fStandardVoltage1);
p2 = (unsigned char*)(&fStandardVoltage2);
}
else
{
p1 = (unsigned char*)(&iStandardValue1);
p2 = (unsigned char*)(&iStandardValue2);
}
PVCI_CAN_OBJ pFrameinfo = new VCI_CAN_OBJ;
m_iNodeNo = m_cmbNodeNo.GetCurSel();
m_byteNodeNo = m_iNodeNo;
m_listAdjustMessage.SetCurSel(3);//参数校准请求帧
pFrameinfo->RemoteFlag = 0;
pFrameinfo->ExternFlag = 1;
pFrameinfo->SendType = 0;
pFrameinfo->DataLen = 8;
pFrameinfo->Header.Reserved1 = 0x00;
pFrameinfo->Header.Reserved2 = 0xff;
pFrameinfo->Header.byNodeID = m_byteNodeNo;
pFrameinfo->Header.byFuncCode = REQUEST_MODIFY_PARA;
pFrameinfo->ID = pFrameinfo->ID>>3;
pFrameinfo->Data[0] = m_ComboAdChannel.GetCurSel() + 1;
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(VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1) == 1)
SDOMessageAddString("已发送参数校准请求帧!");
else
{
SDOMessageAddString("发送参数校准请求帧失败!");
return;
}
if(IDYES != AfxMessageBox("请确定参数值1--已准备?",MB_YESNOCANCEL,0))
return ;
m_listAdjustMessage.SetCurSel(4);//参数值1消息帧
pFrameinfo->RemoteFlag = 0;
pFrameinfo->ExternFlag = 1;
pFrameinfo->SendType = 0;
pFrameinfo->DataLen = 8;
pFrameinfo->Header.Reserved1 = 0x00;
pFrameinfo->Header.Reserved2 = 0xff;
pFrameinfo->Header.byNodeID = m_byteNodeNo;
pFrameinfo->Header.byFuncCode = SEND_PARA1_DATA;
pFrameinfo->ID = pFrameinfo->ID>>3;
pFrameinfo->Data[0] = m_ComboAdChannel.GetCurSel() + 1;
pFrameinfo->Data[1] = *(p1+0);
pFrameinfo->Data[2] = *(p1+1);
pFrameinfo->Data[3] = *(p1+2);
pFrameinfo->Data[4] = *(p1+3);
pFrameinfo->Data[5] = 0x00;
pFrameinfo->Data[6] = 0x00;
pFrameinfo->Data[7] = 0x00;
if(VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1) == 1)
SDOMessageAddString("已发送参数值1消息帧!");
else
{
SDOMessageAddString("发送参数值1消息帧失败!");
return;
}
if(!m_bCheckDataType)
return;
if(IDYES != AfxMessageBox("请确定参数值2--已准备?",MB_YESNOCANCEL,0))
return ;
m_listAdjustMessage.SetCurSel(5);//参数值2消息帧
pFrameinfo->RemoteFlag = 0;
pFrameinfo->ExternFlag = 1;
pFrameinfo->SendType = 0;
pFrameinfo->DataLen = 8;
pFrameinfo->Header.Reserved1 = 0x00;
pFrameinfo->Header.Reserved2 = 0xff;
pFrameinfo->Header.byNodeID = m_byteNodeNo;
pFrameinfo->Header.byFuncCode = SEND_PARA2_DATA;
pFrameinfo->ID = pFrameinfo->ID>>3;
pFrameinfo->Data[0] = m_ComboAdChannel.GetCurSel() + 1;
pFrameinfo->Data[1] = *(p1+0);
pFrameinfo->Data[2] = *(p1+1);
pFrameinfo->Data[3] = *(p1+2);
pFrameinfo->Data[4] = *(p1+3);
pFrameinfo->Data[5] = 0x00;
pFrameinfo->Data[6] = 0x00;
pFrameinfo->Data[7] = 0x00;
if(VCI_Transmit(m_devtype,m_devind,m_cannum,pFrameinfo,1) == 1)
SDOMessageAddString("已发送参数值2消息帧!");
else
{
SDOMessageAddString("发送参数值2消息帧失败!");
return;
}
delete pFrameinfo;
pFrameinfo = NULL;
EnableWindowRadioNode(true);
}
void CTestDlg::OnSelectMessage()
{
SetSendFrameIDEdit();
SetSendDataEdit();
}
void CTestDlg::SetSendFrameIDEdit()
{
UpdateData(true);
CString str;
BYTE byteFuncCode;
int iCurSelMessage = 0;
iCurSelMessage = m_listAdjustMessage.GetCurSel();
switch(iCurSelMessage)
{
case 0://故障信息请求帧
byteFuncCode = REQUEST_FAILURE_INFO;
break;
case 1://程序版本请求帧
byteFuncCode = REQUEST_SOFT_VER;
break;
case 2://查看参数请求帧
byteFuncCode = REQUEST_WATCH_PARA;
break;
case 3://参数校准请求帧
byteFuncCode = REQUEST_MODIFY_PARA;
break;
case 4://校准参数值1消息帧
byteFuncCode = SEND_PARA1_DATA;
break;
case 5://校准参数值2消息帧
byteFuncCode = SEND_PARA2_DATA;
break;
case 6://请求节点运行控制
byteFuncCode = REQUEST_CTRL_NODERUN;
break;
case 7://允许节点运行控制指令
byteFuncCode = SEND_DATA_CTRL_NODERUN;
break;
case 8://停止节点运行控制指令
byteFuncCode = SEND_DATA_CTRL_NODERUN;
break;
case 9://重启节点运行控制指令
byteFuncCode = SEND_DATA_CTRL_NODERUN;
break;
default:
break;
}
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 = m_byteNodeNo;
pFrameinfo->Header.byFuncCode = byteFuncCode;
pFrameinfo->ID = pFrameinfo->ID>>3;
str.Format("%x",pFrameinfo->ID);
m_EditSendFrmID = str;
delete pFrameinfo;
pFrameinfo = NULL;
UpdateData(false);
}
void CTestDlg::SetSendDataEdit()
{
UpdateData(true);
CString strAdChannel;
int iCurSelAdChannel = m_ComboAdChannel.GetCurSel() + 1;
strAdChannel.Format("%02x",iCurSelAdChannel);
int iCurSelMessage = 0;
iCurSelMessage = m_listAdjustMessage.GetCurSel();
ConvertVoltageString();
switch(iCurSelMessage)
{
case 0://故障信息请求帧
m_EditSendData = "00 00 00 00 00 00 00 00 ";
break;
case 1://程序版本请求帧
m_EditSendData = "00 00 00 00 00 00 00 00 ";
break;
case 2://查看参数请求帧
m_EditSendData = strAdChannel + " 00 00 00 00 00 00 00";
break;
case 3://参数校准请求帧
m_EditSendData = strAdChannel + " 00 00 00 00 00 00 00 ";
break;
case 4://校准参数值1消息帧
m_EditSendData = strAdChannel + " " + m_strSdVoltage1 + " 00 00 00 ";
break;
case 5://校准参数值2消息帧
m_EditSendData = strAdChannel + " " + m_strSdVoltage2 + " 00 00 00 ";
break;
case 6://请求节点运行控制
m_EditSendData = "00 00 00 00 00 00 00 00 ";
break;
case 7://允许节点运行控制指令
m_EditSendData = "01 00 00 00 00 00 00 00 ";
break;
case 8://停止节点运行控制指令
m_EditSendData = "02 00 00 00 00 00 00 00 ";
break;
case 9://重启节点运行控制指令
m_EditSendData = "03 00 00 00 00 00 00 00 ";
break;
default:
break;
}
UpdateData(false);
}
void CTestDlg::ConvertVoltageString()
{
unsigned char *p1,*p2;
CString str1,str2;
float fStandardVoltage1,fStandardVoltage2;
int iStandardValue1,iStandardValue2;
fStandardVoltage1 = m_fStandardVoltage1;
fStandardVoltage2 = m_fStandardVoltage2;
iStandardValue1 = (int)m_fStandardVoltage1;
iStandardValue2 = (int)m_fStandardVoltage2;
if(m_bCheckDataType)
{
p1 = (unsigned char*)(&fStandardVoltage1);
p2 = (unsigned char*)(&fStandardVoltage2);
}
else
{
p1 = (unsigned char*)(&iStandardValue1);
p2 = (unsigned char*)(&iStandardValue2);
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -