📄 testdlg.cpp
字号:
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;
}
UINT CTestDlg::ReceiveThread(void *param)
{
CTestDlg *dlg=(CTestDlg*)param;
CListBox *box=(CListBox *)dlg->GetDlgItem(IDC_LIST_INFO);
VCI_CAN_OBJ frameinfo[50];
VCI_ERR_INFO errinfo;
int len=1;
int i=0;
CString str,tmpstr,str1,tempstrerro;
CReceiveInfo receiveinfotemp;
DWORD dwordReaderIDtemp,wordtemp;
// u16 A1R ;
// u16 A2R ;
while(1)
{
Sleep(1);
if(dlg->m_connect==0)
break;
len=VCI_Receive(dlg->m_devtype,0,dlg->m_cannum,frameinfo,50,200);
if(len<=0)
{
//注意:如果没有读到数据则必须调用此函数来读取出当前的错误码,
//千万不能省略这一步(即使你可能不想知道错误码是什么)
VCI_ReadErrInfo(dlg->m_devtype,0,dlg->m_cannum,&errinfo);
}
else
{
for(i=0;i<len;i++)
{
// A1R=(u16)frameinfo[i].ID;
// A2R=(u16)(frameinfo[i].ID>>16);
// frameinfo[i].ID = ((A2R >> 2) & 0x07FF) | ((DWORD)A1R << 11) | (((DWORD)A2R & 0x0003) << 27);
wordtemp= frameinfo[i].ID;
dwordReaderIDtemp=wordtemp & 262143;
if (dwordReaderIDtemp==6)//召唤应答处理
{
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;
}
dwordReaderIDtemp=(DWORD)frameinfo[i].ID>>18;
tmpstr.Format("召唤的:%s在%d范围内...............................召唤完成",str,dwordReaderIDtemp);
box->InsertString(box->GetCount(),tmpstr);
}
else if(((dwordReaderIDtemp & 127)==3 || (dwordReaderIDtemp & 127)==5 || (dwordReaderIDtemp & 127)==4) && (dwordReaderIDtemp & 261888)==0)
{ //直接或者缓冲数据应答处理
dlg->m_ReceiveInfoThread.Add(frameinfo[i]);
dlg->m_blNewTag=true;
if ((frameinfo[i].ID>>18)==0)//检测是不是是出错了,如最出错了,记录错误的针信息
{
str="";
str1="";
for(int j=0;j<8;j++)
{
tempstrerro.Format("%02x",frameinfo[i].Data[j]);
str+=tempstrerro;
}
for( j=0;j<3;j++)
{
tempstrerro.Format("%02x",frameinfo[i].Reserved[j]);
str1+=tempstrerro;
}
tmpstr.Format("ID:\t%d\nTimeStamp:\t%d\nTimeFlag:\t%d\nSendType:\t%d\nRemoteFlag:\t%d\n\
ExternFlag:\t%d\nDataLen:\t%d\nData:\t%s\nReserved:\t%s\n",frameinfo[i].ID,frameinfo[i].TimeStamp,
frameinfo[i].TimeFlag,frameinfo[i].SendType,frameinfo[i].RemoteFlag,frameinfo[i].ExternFlag,
frameinfo[i].DataLen,str,str1);
dlg->WriteErroLog(tmpstr);
}
}
else if(dwordReaderIDtemp==8)//应答处理
{
if (frameinfo[i].Data[0]==1)//模式应答处理
{
if (frameinfo[i].Data[1]==1)
tmpstr="缓存模式";
else
tmpstr="直接模式";
wordtemp=(DWORD)frameinfo[i].Data[3];
wordtemp=(wordtemp<<8)+(DWORD)frameinfo[i].Data[2];
str.Format("设备%d的模式为:%s 间隔时间为%d.....................模式设置/读取成功",dlg->m_EditSendFrmID,tmpstr,wordtemp);
box->InsertString(box->GetCount(),str);
}
else if(frameinfo[i].Data[0]==3)//增益应答处理
{
wordtemp=31-(DWORD)frameinfo[i].Data[1];
str.Format("设备:%d的增益为:%d..............................................增益设置/读取成功",dlg->m_EditSendFrmID,wordtemp);
box->InsertString(box->GetCount(),str);
}
}
else
{
str="";
str1="";
for(int j=0;j<8;j++)
{
tempstrerro.Format("%02x",frameinfo[i].Data[j]);
str+=tempstrerro;
}
for( j=0;j<3;j++)
{
tempstrerro.Format("%02x",frameinfo[i].Reserved[j]);
str1+=tempstrerro;
}
tmpstr.Format("ID:\t%d\nTimeStamp:\t%d\nTimeFlag:\t%d\nSendType:\t%d\nRemoteFlag:\t%d\n\
ExternFlag:\t%d\nDataLen:\t%d\nData:\t%s\nReserved:\t%s\n",frameinfo[i].ID,frameinfo[i].TimeStamp,
frameinfo[i].TimeFlag,frameinfo[i].SendType,frameinfo[i].RemoteFlag,frameinfo[i].ExternFlag,
frameinfo[i].DataLen,str,str1);
dlg->WriteErroLog(tmpstr);
}
}
box->SetCurSel(box->GetCount()-1);
}
if (dlg->m_blNewTag)
{
critical_section.Lock();
dlg->TranslateReceiveInfo();
critical_section.Unlock();
}
}
return 0;
}
DWORD CTestDlg::CoverStrToID(CString constrId)
{
unsigned char FrameID[2]={0,0};
unsigned char Data[4];
memset(Data,'0',4);
DWORD dvordtempId=0;
memcpy(&Data[4-constrId.GetLength()],(LPCTSTR)constrId,constrId.GetLength());
strtodata((unsigned char*)Data,FrameID,2,0);
dvordtempId=((DWORD)FrameID[0]<<24)+((DWORD)FrameID[1]<<16);
return dvordtempId;
}
void CTestDlg::OnButtonSetmode()
{
// TODO: Add your control notification handler code here
CDialogSetMode dialogSetMode;
dialogSetMode.m_nSetMode=m_nReaderMode;
dialogSetMode.m_nInterval=m_lgReaderInterval;
if (dialogSetMode.DoModal()==IDOK)
{
m_nReaderMode=dialogSetMode.m_nSetMode;
m_lgReaderInterval=dialogSetMode.m_nInterval;
unsigned char cInterval[8]={0,0,0,0};
if (m_nReaderMode==1)
{
cInterval[1]=1;
}
cInterval[2]=dialogSetMode.m_nInterval;
cInterval[3]=dialogSetMode.m_nInterval>>8;
if(m_connect==0)
return;
VCI_CAN_OBJ frameinfo;
UpdateData(true);
memcpy(&frameinfo.Data,cInterval,8);
frameinfo.DataLen=8;
frameinfo.RemoteFlag=0;
frameinfo.ExternFlag=1;
DWORD dwordFormat=2;
frameinfo.ID=(m_EditSendFrmID<<18)+((DWORD)dwordFormat);
frameinfo.SendType=m_ComboSendType.GetCurSel();
CString strtemp;
if(VCI_Transmit(m_devtype,0,m_cannum,&frameinfo,1)==1)
{
if (m_nReaderMode==1)
{
strtemp.Format("设置:%d为缓存模式请求.....发送成功",m_EditSendFrmID);
}
else
{
strtemp.Format("设置:%d为直接模式请求.....发送成功",m_EditSendFrmID);
}
ShowInfo(strtemp,0);
}
else
{
if (m_nReaderMode==1)
{
strtemp.Format("设置:%d为缓存模式请求.....发送失败",m_EditSendFrmID);
}
else
{
strtemp.Format("设置:%d为直接模式请求.....发送失败",m_EditSendFrmID);
}
ShowInfo(strtemp,0);
}
}
}
void CTestDlg::OnButtonCalltag()
{
// TODO: Add your control notification handler code here
CDialogCallTag dlgCallTag;
dlgCallTag.m_strTagIDCall=m_strTagID;
if (dlgCallTag.DoModal()==IDOK)
{
m_strTagID=dlgCallTag.m_strTagIDCall;
while (m_strTagID.GetLength()!=16)
{
if (dlgCallTag.DoModal()==IDOK)
m_strTagID=dlgCallTag.m_strTagIDCall;
else
break;
}
unsigned char crTagIDSend[16];//={'0','0','0','0','0','0','0,'0'};
unsigned char crtagIDchar[8];
memset(crtagIDchar,0,8);
memset(crTagIDSend,0,16);
VCI_CAN_OBJ frameinfo;
UpdateData(true);
memcpy(&crTagIDSend[16-m_strTagID.GetLength()],(LPCTSTR)m_strTagID,m_strTagID.GetLength());
strtodata(crTagIDSend,crtagIDchar,8,0);
frameinfo.DataLen=8;
memcpy(&frameinfo.Data,crtagIDchar,8);
frameinfo.DataLen=8;
frameinfo.RemoteFlag=0;
frameinfo.ExternFlag=1;
DWORD dwordFormat=1;
frameinfo.ID=(m_EditSendFrmID<<18)+dwordFormat;
frameinfo.SendType=m_ComboSendType.GetCurSel();
CString strtemp;
if(VCI_Transmit(m_devtype,0,m_cannum,&frameinfo,1)==1)
{
strtemp.Format("发出召唤:%s请求.....成功",m_strTagID);
ShowInfo(strtemp,0);
}
else
{
strtemp.Format("发出召唤:%s请求.....失败",m_strTagID);
ShowInfo(strtemp,0);
}
}
}
void CTestDlg::OnButtonReadedata()
{
// TODO: Add your control notification handler code here
if(m_connect==0)
return;
VCI_CAN_OBJ frameinfo;
UpdateData(true);
frameinfo.DataLen=0;
frameinfo.RemoteFlag=0;
frameinfo.ExternFlag=1;
frameinfo.ID=(DWORD)m_EditSendFrmID<<18;//(DWORD)dwordFormat<<3;
frameinfo.SendType=m_ComboSendType.GetCurSel();
CString strtemp;
if(VCI_Transmit(m_devtype,0,m_cannum,&frameinfo,1)==1)
{
strtemp.Format("读取设备:%ld的数据.......发送成功",m_EditSendFrmID);
ShowInfo(strtemp,0);
}
else
{
strtemp.Format("读取设备:%ld的数据.......发送失败",m_EditSendFrmID);
ShowInfo(strtemp,0);
}
}
void CTestDlg::Serialize(CArchive& ar)
{
int tempnctrNum[4];
CArchiveException e;
TRY {
if (ar.IsStoring())
{ // storing code
tempnctrNum[0]=m_ctrBaud.GetCurSel();
tempnctrNum[1]=m_ComboSendType.GetCurSel();
tempnctrNum[2]=m_ComboMode.GetCurSel();
tempnctrNum[3]=m_ctrReaderPlus.GetCurSel();
ar<<m_EditSendFrmID<<m_strTagID<<m_nReaderMode<<m_lgReaderInterval<<tempnctrNum[0]<<tempnctrNum[1]<<tempnctrNum[2]<<tempnctrNum[3]<<m_wordInterval<<m_strConnect_name<<m_wordPollingID.GetSize();
for (int i=0;i<m_wordPollingID.GetSize();i++)
{
ar<<m_wordPollingID.GetAt(i);
}
}
else
{ // loading code
int inttemppollingCount;
DWORD wordtempid;
ar>>m_EditSendFrmID>>m_strTagID>>m_nReaderMode>>m_lgReaderInterval>>tempnctrNum[0]>>tempnctrNum[1]>>tempnctrNum[2]>>tempnctrNum[3]>>m_wordInterval>>m_strConnect_name>>inttemppollingCount;
for (;inttemppollingCount>0;inttemppollingCount--)
{
ar>>wordtempid;
m_wordPollingID.Add(wordtempid);
}
m_ctrBaud.SetCurSel(tempnctrNum[0]);
m_ComboSendType.SetCurSel(tempnctrNum[1]);
m_ComboMode.SetCurSel(tempnctrNum[2]);
m_ctrReaderPlus.SetCurSel(tempnctrNum[3]);
}
}
CATCH (CArchiveException, e)
{
return;
}
END_CATCH
}
static int intReaderID=0;
void CTestDlg::OnTimer(UINT nIDEvent)
{
// TODO: Add your message handler code here and/or call default
switch(nIDEvent)
{
case 1:
{
if (m_blNewTag)
{
CString strtempReader;
// m_ctrTagShow.DeleteAllItems();
// TranslateReceiveInfo();
int j;
for (int i=0;i<m_ReceiveInfo.GetSize();i++)
{
if (m_ctrTagShow.GetItemCount()>i)
{
if (!m_ReceiveInfo[i].m_bShow)
{
continue;
}
}
if (i<m_ctrTagShow.GetItemCount() )
{
strtempReader.Format("%d",m_ReceiveInfo[i].m_lgCount);
m_ctrTagShow.SetItemText(i,3,strtempReader);
strtempReader.Format("%d",m_ReceiveInfo[i].m_nstate);
m_ctrTagShow.SetItemText(i,4,strtempReader);
strtempReader.Format("%d",m_ReceiveInfo[i].m_wordInterval);
m_ctrTagShow.SetItemText(i,5,strtempReader);
strtempReader.Format("%d",m_ReceiveInfo[i].m_wordMin);
m_ctrTagShow.SetItemText(i,6,strtempReader);
strtempReader.Format("%d",m_ReceiveInfo[i].m_wordMax);
m_ctrTagShow.SetItemText(i,7,strtempReader);
strtempReader.Format("%d:%d:%d",m_ReceiveInfo[i].m_tmLastTime.GetHour(),m_ReceiveInfo[i].m_tmLastTime.GetMinute(),m_ReceiveInfo[i].m_tmLastTime.GetSecond());
m_ctrTagShow.SetItemText(i,8,strtempReader);
}
else
{
j=m_ctrTagShow.GetItemCount();
strtempReader.Format("%d",j+1);
m_ctrTagShow.InsertItem(j,strtempReader);//m_ReceiveInfo[i].m_dwordReaderID);
strtempReader.Format("%d",m_ReceiveInfo[i].m_dwordReaderID);
m_ctrTagShow.SetItemText(j,1,strtempReader);//m_ReceiveInfo[i].m_dwordReaderID);
m_ctrTagShow.SetItemText(j,2,m_ReceiveInfo[i].m_strTagID);
strtempReader.Format("%d",m_ReceiveInfo[i].m_lgCount);
m_ctrTagShow.SetItemText(j,3,strtempReader);
strtempReader.Format("%d",m_ReceiveInfo[i].m_nstate);
m_ctrTagShow.SetItemText(j,4,strtempReader);
strtempReader.Format("%d",m_ReceiveInfo[i].m_wordInterval);
m_ctrTagShow.SetItemText(j,5,strtempReader);
strtempReader.Format("%d",m_ReceiveInfo[i].m_wordMin);
m_ctrTagShow.SetItemText(j,6,strtempReader);
strtempReader.Format("%d",m_ReceiveInfo[i].m_wordMax);
m_ctrTagShow.SetItemText(j,7,strtempReader);
strtempReader.Format("%d:%d:%d",m_ReceiveInfo[i].m_tmLastTime.GetHour(),m_ReceiveInfo[i].m_tmLastTime.GetMinute(),m_ReceiveInfo[i].m_tmLastTime.GetSecond());
m_ctrTagShow.SetItemText(j,8,strtempReader);
strtempReader.Format("%d:%d:%d",m_ReceiveInfo[i].m_tmFirstTime.GetHour(),m_ReceiveInfo[i].m_tmFirstTime.GetMinute(),m_ReceiveInfo[i].m_tmFirstTime.GetSecond());
m_ctrTagShow.SetItemText(j,9,strtempReader);
m_ctrTagShow.SetItemData(j,j);
}
m_ReceiveInfo[i].m_bShow=false;
}
}
m_blNewTag=false;
}
break;
case 2:
SetTimer(1,2000,NULL);
KillTimer(2);
break;
case 3:
{
if(m_connect==0)
return;
if (m_wordPollingID.GetSize()<1)
{
OnButStartPolling();
AfxMessageBox("请输入至少一个总线上的结点ID");
KillTimer(3);
return;
}
if(intReaderID>=m_wordPollingID.GetSize())
{
intReaderID=0;
TranslateSQLDate();
initializationSQL();
}
VCI_CAN_OBJ frameinfo;
DWORD wordtempID;
wordtempID=m_wordPollingID.GetAt(intReaderID++);
frameinfo.DataLen=0;
frameinfo.RemoteFlag=0;
frameinfo.ExternFlag=1;
frameinfo.ID=(DWORD)wordtempID<<18;//(DWORD)dwordFormat<<3;
frameinfo.SendType=m_ComboSendType.GetCurSel();
CString strtemp;
if(VCI_Transmit(m_devtype,0,m_cannum,&frameinfo,1)==1)
{
strtemp.Format("读取设备:%ld的数据.......发送成功",wordtempID);
ShowInfo(strtemp,0);
}
else
{
strtemp.Format("读取设备:%ld的数据.......发送失败",wordtempID);
ShowInfo(strtemp,0);
}
}
break;
case 4:
break;
default:
break;
}
CDialog::OnTimer(nIDEvent);
}
void CTestDlg::OnChangeEditSendframeid()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -