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

📄 commwizarddlg.cpp

📁 模拟cdt子站的通信过程,为通信终端测试提供方便.
💻 CPP
📖 第 1 页 / 共 3 页
字号:
	if(setDlg.DoModal() == IDOK)
	{
		m_nPort = setDlg.nPort;
		m_nTime = setDlg.nTime;
		m_strSettings = setDlg.strSettings;
//		m_strSendString = setDlg.strSendString;
	}
	OpenPort();
	SetTimer(1,SETTIMEAMOUNT,NULL);//时间为SETTIMEAMOUNT=1000毫秒
}

void CCommWizardDlg::OnSelchangeType() 
{
	// TODO: Add your control notification handler code here
//	m_nInputMode = m_ctrlDataType.GetCurSel();
}

void CCommWizardDlg::OnClear() 
{
	// TODO: Add your control notification handler code here
//	m_strReceive = _T("");
	m_strReceive = _T("");
	UpdateData(FALSE);//重新更新文本显示,以字符串m_strReceive
/*	m_EditRecv.SetSel(0,-1);    //全选  
    m_EditRecv.ReplaceSel(m_strReceive);  //填入内容  

    m_EditRecv.ScrollWindow(0,0);    //滚动到插入点  */
//	UpdateData(true);//重新更新文本显示,以字符串m_strReceive
//	int i=0;
}

BEGIN_EVENTSINK_MAP(CCommWizardDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CCommWizardDlg)
	ON_EVENT(CCommWizardDlg, IDC_COMMCTRL, 1 /* OnComm */, OnOnCommCommctrl, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CCommWizardDlg::OnOnCommCommctrl() 
{
	// TODO: Add your control notification handler code here
/*		VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len,k;
	int i;
	BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not signed.
	CString strtemp;*/
	if(bStartTest)
	{
		if(m_Com.GetCommEvent()==2)//接收服务
		{
			FunCdtReServer();
		}
		if(m_Com.GetCommEvent()==1) //发送服务。事件值为1表示发送缓冲区内没有字符,可以填充
		{
			if(!GlSendFrameFlag)//判断上一帧数据是否发送完毕
			{
				fun_make_send_frame();//上一帧数据发送完毕,则重新组帧
				GlSendFrameFlag=true;//置帧数据未发送完毕标志
			}
			FunCdtTrServer();//发送帧数据
		}//end if(m_Com.GetCommEvent()==1) 

//		if(!GlThisPageDispFlag)//本页已显示标记,防止显示的太快
//		{
		//	UpdateData(FALSE);//更新编辑框显示的内容
			m_EditRecv.SetSel(-1,-1);    //将插入光标放在最后  
    m_EditRecv.ReplaceSel(m_strReceive);  //填入内容  

   m_EditRecv.ScrollWindow(0,0);    //滚动到插入点  
   m_strReceive = _T("");
//		}
//		else
	//	{
//			GlThisPageDispFlag=0;
	//	}
	}//end if(bReceive)
	
}

void CCommWizardDlg::OpenPort()
{
	if(m_Com.GetPortOpen())
		m_Com.SetPortOpen(FALSE);

	m_Com.SetCommPort(m_nPort);       //选择com口
	if( !m_Com.GetPortOpen())
		m_Com.SetPortOpen(TRUE);//打开串口
	else
		AfxMessageBox("cannot open serial port");

	m_Com.SetSettings(m_strSettings); //波特率,校验,数据位,停止位
	m_Com.SetRThreshold(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
	m_Com.SetSThreshold(1); //参数1表示每当串口发送缓冲区中空时将引发一个发送数据的OnComm事件
	m_Com.SetInputMode(1);
	m_Com.SetInputLen(0);  //设置当前接收区数据长度为0
	m_Com.GetInput();//先预读缓冲区以清除残留数据
	
}

//DEL void CCommWizardDlg::OnCdtsend() 
//DEL {
//DEL 
//DEL }

void CCommWizardDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
//	OnCdtsend();
/*	//串口通信情况判断计时器
	pub_com_t_cou++;
	//串口未收到网控数据情况判断计时器
	pub_com_nre_t_cou++;
	//串口未收到网控数据情况判断计时及标志
	if(pub_com_nre_t_cou>=10)
	{
		pub_com_ner_error_cou++;
		pub_com_nre_t_cou=0;
	}*/
	GlYxTimeCou++;
	if(GlYxTimeCou>=YXTIMEAMOUNT)//已过了30秒
	{
		GlYxFrameFlag=1;//置遥信组帧时间到标志
		GlYxTimeCou=0;//清遥信发送定时计数器
	}
	GlYmTimeCou++;
	if(GlYmTimeCou>=YMTIMEAMOUNT)//已过了40秒
	{
		GlYmFrameFlag=1;//置遥信组帧时间到标志
		GlYmTimeCou=0;//清遥信发送定时计数器
	}
	CDialog::OnTimer(nIDEvent);
}


int CCommWizardDlg::String2Hex(CString str, CByteArray &senddata)
{
	int hexdata,lowhexdata;
	int hexdatalen=0;
	int len=str.GetLength();
	
	senddata.SetSize(len/2);
	
	for(int i=0;i<len;)
	{
		char lstr,hstr=str[i];
		if(hstr==' ')
		{
			i++;
			continue;
		}
		i++;
		if(i>=len)
			break;
		lstr=str[i];
		hexdata=ConvertHexChar(hstr);
		lowhexdata=ConvertHexChar(lstr);
		if((hexdata==16)||(lowhexdata==16))
			break;
		else 
			hexdata=hexdata*16+lowhexdata;
		i++;
		senddata[hexdatalen]=(char)hexdata;
		hexdatalen++;
	}

	senddata.SetSize(hexdatalen);
	return hexdatalen;
}

//这是一个将字符转换为相应的十六进制值的函数
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CCommWizardDlg::ConvertHexChar(char ch) 
{
	if((ch>='0')&&(ch<='9'))
		return ch-0x30;
	else if((ch>='A')&&(ch<='F'))
		return ch-'A'+10;
	else if((ch>='a')&&(ch<='f'))
		return ch-'a'+10;
	else return (-1);
}


//DEL int CCommWizardDlg::fun_re_data_handle()
//DEL {
//DEL 	int i;
//DEL //	BYTE 
//DEL //	unsigned int re_syn_flag;
//DEL //	pub_re_data_buf[pub_re_data_cou++]=re_data[k];
//DEL 	if(m_nInputMode==2)//部颁规约
//DEL 	{
//DEL 		i=fun_re_dlb_data_handle();
//DEL 	}
//DEL 	else if(m_nInputMode==1)//威盛规约
//DEL 	{
//DEL 		i=fun_re_wsh_data_handle();
//DEL 	}
//DEL 	return i;
//DEL }

void CCommWizardDlg::fun_make_send_frame()
{
	if(GlYxFrameFlag)//组遥信帧时间到
	{
		FunMakeCDTYxFrame();
		GlYxFrameFlag=0;//清遥信组帧时间到标记
		GlYxTimeCou=0;//清遥信定时传送计数器
//		GlSendFrameFlag=1;//置帧数据未发送完毕标志
	}
	else if(GlYmFrameFlag)//组脉冲电度帧时间到
	{
		FunMakeCDTYmFrame();
		GlYmFrameFlag=0;//清电度组帧时间到标记
		GlYmTimeCou=0;//清电度定时传送计数器
//		GlSendFrameFlag=1;//置帧数据未发送完毕标志
	}
	else
	{
		FunMakeCDTYcFrameCycle();//循环组遥测帧(重要遥测、次要遥测、一般遥测)
	//	GlSendFrameFlag=1;//置帧数据未发送完毕标志
	}
}



int CCommWizardDlg::fun_hex_to_array(CByteArray &senddata,unsigned char *Loc_send_data_buf,int Loc_send_data_len)
{
//	int hexdata,lowhexdata;
	int hexdatalen=0;
//	int len=str.GetLength();
	
	senddata.SetSize(Loc_send_data_len);
	
	for(int i=0;i<Loc_send_data_len;i++)
	{
		senddata[hexdatalen]=(char)Loc_send_data_buf[i];
		hexdatalen++;
	}

	senddata.SetSize(hexdatalen);
	return hexdatalen;
}




//程序标志、外部变量、资源初始化
void CCommWizardDlg::FunInitSys()
{
	GlSendFrameFlag=false;
	GlYcFrameCou=1;//置遥测组帧循环计数初值
	GlYxFrameFlag=0;//清遥信组帧时间到标记

	GlYxTimeCou=0;//清遥信定时传送计数器
	pub_send_data_len=0;
	dire_send_long=0;
	CDT_syn_cou=0;
	GlRowCharCou=0;
	GlCDTCharDispCou=0;//清CDT模式字符显示计数
	GlThisPageDispFlag=0;//本页已显示标记
	//测试用发送遥测数据共YCDOTAMOUNT(256)点,数值从0-255
	for(int i=0;i<YCDOTAMOUNT;i++)
	{
		GlYcDataCur[i]=i;
	}
	GlYmTimeCou=0;
	GlYmFrameFlag=0;//清脉冲电度量组帧时间到标记
	//测试用发送电度数据共YMDOTAMOUNT(64)点遥测,数值从0-63
	for(i=0;i<YMDOTAMOUNT;i++)
	{
		GlYmDataCur[i]=i;
	}
	/*
	DisplayrowAmount 100//大于30行清掉本页重新显示
		#define DisplayrowLen  42//每行显示字符数
	*/
	//初始化cedit m_EditRecv
	UINT LocSetEditCharAmount=(DisplayrowAmount+1)*DisplayrowLen*3;
	m_EditRecv.SetLimitText(LocSetEditCharAmount);
}
/*
void CCommWizardDlg::fun_make_p_feng_frame()
{
	unsigned int i,HE_code;
//	unsigned char for_crc_data[6];

	pub_send_data_buf[0]=0x68;
	pub_send_data_buf[1]=pub_re_data_buf[1];
	pub_send_data_buf[2]=pub_re_data_buf[2];
	pub_send_data_buf[3]=pub_re_data_buf[3];
	pub_send_data_buf[4]=pub_re_data_buf[4];
	pub_send_data_buf[5]=pub_re_data_buf[5];
	pub_send_data_buf[6]=pub_re_data_buf[6];
	pub_send_data_buf[7]=0x68;
    pub_send_data_buf[8]=0x81;
    pub_send_data_buf[9]=6;
	pub_send_data_buf[10]=pub_re_data_buf[10];
	pub_send_data_buf[11]=pub_re_data_buf[11];
	pub_send_data_buf[12]=0x03;
	pub_send_data_buf[13]=0x03;
	pub_send_data_buf[14]=0x03;
	pub_send_data_buf[15]=0x03;
	for(i=0;i<4;i++) pub_send_data_buf[i+12]+=0x33;
	HE_code=0;
	for(i=0;i<16;i++) HE_code+=pub_send_data_buf[i];
	pub_send_data_buf[16]=HE_code;			
	pub_send_data_buf[17]=0x16;	
	pub_send_data_len=18;
}
*/

void CCommWizardDlg::FunMakeCDTYxFrame()
{
	 unsigned int t_yx_word,i,j;
	 unsigned char t_frame_temp[6];
//	 unsigned int for_send_direc;
//	 for_send_direc=ex_str_cdt_relax[for_direc_code].this_direc_code;
//	 t_yx_word=(exstr_agree_layer_para+for_direc_code)->agree_union.cdt_agree.cdt_yx_num;
	 t_yx_word=YXDOTAMOUNT/32;//t_yx_word:信息字个数。一个遥信信息字(4个信息字节、一个功能码字节、一个校验字节)可传送32点遥测
	 if(YXDOTAMOUNT%32!=0)
	 {
		 t_yx_word++;
	 }

	 for(i=0;i<6;i++)//同步头
	 {
		 pub_send_data_buf[i]=CDT_syn_array[DireCycle][i];
	 }

	 t_frame_temp[0]=0x71;
	 t_frame_temp[1]=0xf4;
	 t_frame_temp[2]=t_yx_word;
	 t_frame_temp[3]=GlSourAddr;
	 GlSourAddr++;//源站址加1用于测试
	 t_frame_temp[4]=GlAimAddr;
	 t_frame_temp[5]=CRC_check(t_frame_temp,VeriDireCycle);//求本信息字的CRC校验,0:指取CRC正码表;1:指取反码。默认为0
     for(i=0;i<6;i++)//控制字
	 {
		 pub_send_data_buf[i+6]=t_frame_temp[i];
	 }

	 j=0;
	 while(j<t_yx_word)//信息字
		{
		 pub_send_data_buf[(j+2)*6+0]=0xf0+j;
		 for(i=0;i<4;i++)
			{pub_send_data_buf[(j+2)*6+i+1]=GlYxDataCur[j*4+i];
			 }
		 pub_send_data_buf[(j+2)*6+5]=CRC_check(&pub_send_data_buf[(j+2)*6+0],VeriDireCycle);
		 j++;
		 }
	 pub_send_data_len=(t_yx_word+2)*6;
	 dire_send_long=pub_send_data_len;
	 CDT_send_add_cou=0;
}

void CCommWizardDlg::FunMakeCDTYmFrame()
{
	unsigned int t_yx_word,i;
	 unsigned char t_frame_temp[6];
	 unsigned int LocYmVal;
//	 unsigned int for_send_direc;
//	 for_send_direc=ex_str_cdt_relax[for_direc_code].this_direc_code;
//	 t_yx_word=(exstr_agree_layer_para+for_direc_code)->agree_union.cdt_agree.cdt_yx_num;
	 t_yx_word=YMDOTAMOUNT;//t_yx_word:信息字个数。一个遥信信息字(4个信息字节、一个功能码字节、一个校验字节)可传送32点遥测

	 for(i=0;i<6;i++)//同步头
	 {
		 pub_send_data_buf[i]=CDT_syn_array[DireCycle][i];
	 }

	 t_frame_temp[0]=0x71;
	 t_frame_temp[1]=0x85;
	 t_frame_temp[2]=t_yx_word;
	 t_frame_temp[3]=GlSourAddr;
	 GlSourAddr++;//源站址加1用于测试
	 t_frame_temp[4]=GlAimAddr;
	 t_frame_temp[5]=CRC_check(t_frame_temp,VeriDireCycle);//求本信息字的CRC校验,0:指取CRC正码表;1:指取反码。默认为0
     for(i=0;i<6;i++)//控制字
	 {
		 pub_send_data_buf[i+6]=t_frame_temp[i];
	 }

	 unsigned int j=0;
	 while(j<t_yx_word)//信息字
		{
		 pub_send_data_buf[(j+2)*6+0]=0xa0+j;
		 LocYmVal=GlYmDataCur[j];
		 pub_send_data_buf[(j+2)*6+1]=(unsigned char)LocYmVal;
		 LocYmVal=LocYmVal>>8;
		 pub_send_data_buf[(j+2)*6+2]=(unsigned char)LocYmVal;
		 LocYmVal=LocYmVal>>8;
		 pub_send_data_buf[(j+2)*6+3]=(unsigned char)LocYmVal;
		 LocYmVal=LocYmVal>>8;
		 pub_send_data_buf[(j+2)*6+4]=(unsigned char)LocYmVal;

		 pub_send_data_buf[(j+2)*6+5]=CRC_check(&pub_send_data_buf[(j+2)*6+0],VeriDireCycle);
		 j++;
		 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -