⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testdlg.cpp

📁 一个canbus通讯软件源代码
💻 CPP
📖 第 1 页 / 共 3 页
字号:
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 + -