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

📄 test4gdlg.cpp

📁 用于误码仪测试
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	if(ColorFlag==1)	//给一个背景颜色变化的动作
		ColorFlag=0;
	else	ColorFlag=1;

	float m_fAccErrRate;

	if(nIDEvent == 1)	//连续运行
	{
		unsigned char  tt=ReadByteDevice(0x75);	
		if( tt != 0xB0 )//读VSC8288 芯片ID
		{
			nHardwareReady=0;

			KillTimer(1);

			GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
			GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(TRUE);
			GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);	
			GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(TRUE);	

			MessageBox("误码仪连接失败,请检查!");

			ConnectError=-1;
			return;

		}

		unsigned char temp;
		temp=ReadByteDevice(Addr_RX_STATUS);
		if((temp & 0x80)==0x80)//清CMU_STATUS
		{
		//	GetDlgItem(IDC_EDIT_RX_CONNET)->SetWindowText("Error!");

			ConnectError=1;
			return;
		}
		else
		{
		//	GetDlgItem(IDC_EDIT_RX_CONNET)->SetWindowText("连接正常!");
			ConnectError=0;
		}
		BYTE ErrorCount[4]={0x87,0x65,0x43,0x21};
		ReadDevice(ErrorCount,Addr_PATERR_COUNT,4);//得到当前错误码数
		m_nCurErrNum=(ErrorCount[0]<<24) | (ErrorCount[1]<<16) | (ErrorCount[2]<<8) | ErrorCount[3];

		BYTE nPatchkStatus;
		nPatchkStatus = ReadByteDevice(Addr_PATCHK_STATUS);//得到当前status
		if((nPatchkStatus & 0x10)==0x10)//error count overflow
			AccOverFlow += 0x100000000;				

		ReadByteDevice(Addr_CMU_STATUS);//清CMU_STATUS
		ReadByteDevice(Addr_RX_STATUS);//清RX_STATUS
		ReadByteDevice(Addr_TX_STATUS);//清TX_STATUS
		ReadByteDevice(Addr_FIFO_STATUS);//清FIFO_STATUS	
		ValueTemp=Value_PATCHK_CTRL[nSelCombo];
		WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//start checker=0,	
		ValueTemp=Value_PATGEN_CTRL[nSelCombo];	//disable pattern EN
		WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);//start checker=0,

		m_nAccErrNum +=AccOverFlow + m_nCurErrNum;//累计误码数+=当前误码数
		nAccTransNum += rate[nSelRadio]*1000000000;//传输的总bit数
		m_fAccErrRate= m_nAccErrNum*100.0/nAccTransNum;//计算误码率
		m_strAccErrRate.Format("%3.8f",m_fAccErrRate);   

		UpdateData(FALSE);

		if(bStopRun==1)
			KillTimer(1);		

		//已运行时间的显示
		CurrentTime = CTime::GetCurrentTime();
		CTimeSpan ts = CurrentTime-StartTime;
		LONG totalseconds=ts.GetTotalSeconds();			
		//PastTime=CurrentTime-StartTime;
		CString strHour,strMinute,strSecond;
		int hour,minute,second;
		hour=totalseconds/3600;
		minute=(totalseconds%3600)/60;
		second=(totalseconds%3600)%60;

		strTime.Format("%02d:%02d:%02d",hour,minute,second);
		GetDlgItem(IDC_EDIT_PAST_TIME)->SetWindowText(strTime);	

		if(WorkMode==1)//定时运行模式
		{
			//进度条操作
			m_progress.SetPos((totalseconds*100/TimerSetting));

			if(totalseconds>=TimerSetting)
			{
				//停止运行
				KillTimer(1);

				GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);					
				MessageBox("时间到!");					
				//GetDlgItem(IDC_EDIT_RX_CONNET)->SetWindowText("Stop!");
				GetDlgItem(IDC_EDIT_PAST_TIME)->SetWindowText("00:00");
				ConnectError=-1;

				return;

			}
			
		}
		ValueTemp=Value_PATCHK_CTRL[nSelCombo];
		ValueTemp |= 0x50;
		WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//start=1,启动CHECKER	
		ValueTemp=Value_PATGEN_CTRL[nSelCombo];
		ValueTemp |= 0x10;
		WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);//start=1,启动Generator

	
	}

	
	CDialog::OnTimer(nIDEvent);
}

void CTest4GDlg::OnButtonStart() //定时运行
{
	bStopRun=0;	
	TimerCount=0;
	WorkMode=1;

	if(FlagSetting==0)	
	{
		AfxMessageBox("请先进行设置!");
		return ;
	}
//	GetDlgItem(IDC_EDIT_RX_CONNET)->SetWindowText("Link!");
	ConnectError=0;
	
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);	

	UpdateData(TRUE);
	//码型设置,启动测试
//	int nSelCombo=m_ctrCombo1.GetCurSel();
	unsigned char ValueTemp;

	TimerSetValue=(rate[nSelRadio]*1000000000/16)*m_nTimer;
	//	AfxMessageBox("test!");
	unsigned char ValueTemp2[5];
	ValueTemp2[0]=	TimerSetValue>>32;
	ValueTemp2[1]= TimerSetValue>>24;
	ValueTemp2[2]= TimerSetValue>>16;
	ValueTemp2[3]= TimerSetValue>>8;
	ValueTemp2[4]= TimerSetValue;
	WriteDevice(ValueTemp2,Addr_PATCHK_TIMER_SET,5);//设置Checker时间

	ReadByteDevice(Addr_CMU_STATUS);//清CMU_STATUS
	ReadByteDevice(Addr_RX_STATUS);//清RX_STATUS
	ReadByteDevice(Addr_TX_STATUS);//清TX_STATUS
	ReadByteDevice(Addr_FIFO_STATUS);//清FIFO_STATUS	
	//RESET error count
	
	ValueTemp=Value_PATCHK_CTRL[nSelCombo];
	WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//start=0,启动CHECKER
	ValueTemp |= 0x10;
	WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//start=1,启动CHECKER

	ValueTemp=Value_PATGEN_CTRL[nSelCombo];
	WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);//start=1,启动Generator
	ValueTemp |= 0x10;
	WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);//start=1,启动Generator

	m_nCurErrNum=0;
	m_nAccErrNum=0;
	nAccTransNum=0;


	//n=m_nTimer;
	TimerSetting=m_nTimer;

	StartTime = CTime::GetCurrentTime();

	SetTimer(1,1000,NULL);

	
}

void CTest4GDlg::OnButtonRun() //连续运行
{
	bStopRun=0;	
	AccOverFlow=0;
	WorkMode=0;

	TimerCount=0;

	if(FlagSetting==0)	
	{
		AfxMessageBox("请先进行设置!");
		return ;
	}

	ConnectError=0;
//	GetDlgItem(IDC_EDIT_RX_CONNET)->SetWindowText("Link!");

	GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(FALSE);	
				
	UpdateData(TRUE);		//获取对话框数据
	//码型设置,启动测试

	unsigned char ValueTemp;
	
	TimerSetValue=(rate[nSelRadio]*1000000000/16)*1;//1秒
	//	AfxMessageBox("test!");
	unsigned char ValueTemp2[5];
	ValueTemp2[0]=	TimerSetValue>>32;
	ValueTemp2[1]= TimerSetValue>>24;
	ValueTemp2[2]= TimerSetValue>>16;
	ValueTemp2[3]= TimerSetValue>>8;
	ValueTemp2[4]= TimerSetValue;
	WriteDevice(ValueTemp2,Addr_PATCHK_TIMER_SET,5);//设置Checker时间
	
	ReadByteDevice(Addr_CMU_STATUS);//清CMU_STATUS
	ReadByteDevice(Addr_RX_STATUS);//清RX_STATUS
	ReadByteDevice(Addr_TX_STATUS);//清TX_STATUS
	ReadByteDevice(Addr_FIFO_STATUS);//清FIFO_STATUS	
	
	ValueTemp=Value_PATCHK_CTRL[nSelCombo];
	WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//start=0,不 CHECKER
	ValueTemp |= 0x50;
	WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//start=1,启动CHECKER
	
	ValueTemp=Value_PATGEN_CTRL[nSelCombo];
	WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);//start=0,不启动Generator
	ValueTemp |= 0x10;
	WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);//start=1,启动Generator

	m_nCurErrNum=0;
	m_nAccErrNum=0;
	nAccTransNum=0;	


	StartTime = CTime::GetCurrentTime();

	//n=m_nTimer;
	SetTimer(1,1000,NULL);//1S的定时器


}


void CTest4GDlg::OnButtonStop() 
{
	// TODO: Add your control notification handler code here
	bStopRun=1;

	GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE);
	GetDlgItem(IDC_BUTTON_RUN)->EnableWindow(TRUE);
	GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE);	
	GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(TRUE);	

//	GetDlgItem(IDC_EDIT_RX_CONNET)->SetWindowText("Stop!");
	GetDlgItem(IDC_EDIT_PAST_TIME)->SetWindowText("00:00");
	ConnectError=-1;

	ReadByteDevice(Addr_CMU_STATUS);//清CMU_STATUS
	ReadByteDevice(Addr_RX_STATUS);//清RX_STATUS
	ReadByteDevice(Addr_TX_STATUS);//清TX_STATUS
	ReadByteDevice(Addr_FIFO_STATUS);//清FIFO_STATUS	
	
	ValueTemp=Value_PATCHK_CTRL[nSelCombo];
	WriteByteDevice(ValueTemp,Addr_PATCHK_CTRL);//start checker=0,
	
	ValueTemp=Value_PATGEN_CTRL[nSelCombo];	//disable pattern EN
	WriteByteDevice(ValueTemp,Addr_PATGEN_CTRL);//start checker=0,



}


//这是一个将字符转换为相应的十六进制值的函数
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CTest4GDlg::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);
}
int CTest4GDlg::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;
}

void CTest4GDlg::Int2Hex(unsigned char *s1data,CByteArray &senddata,int len)
{
	unsigned char hexdata;
	senddata.SetSize(len);
	for(int i=0;i<len;i++)
	{
		hexdata=*(s1data+i);
		senddata[i]=(char)hexdata;
	}
}

int CTest4GDlg::Str2Hex(CString str)
{	
	int len = str.GetLength();
	if(len == 2)
	{
		int a= HexChar(str[0]);
		int b =HexChar(str[1]);
		if(a==16 || b==16 )
		{
			MessageBox("输入格式错误!");
			return 256;
		}
		else
		{
			return a*16+b;
			
		}
		
	}
	else
	{
		MessageBox("输入长度应为2!");
		return 256;
	}
}

int CTest4GDlg::Str2Decimal(CString str)
{
	int t1;
	int t = 0;
	int len = str.GetLength();
	for(int i=0;i<len;i++)
	{
		char c = str[i];
		t1 = DecimalChar(c);
		if(t1==10)
		{
			MessageBox("输入格式错误!");
			return 256;
		}
		else
		{
			t = (10*t + t1);
			
		}
	}
	return t;
}

int CTest4GDlg::HexChar(char c)
{
	if((c>='0') && (c<='9'))
		return c-0x30;
	else if((c>='A') && (c<='F'))
		return c-'A'+10;
	else if((c>='a') && (c<='f'))
		return c-'a'+10;
	else
		return 0x10;
}

int CTest4GDlg::DecimalChar(char c)
{
	if((c>='0') && (c<='9'))
		return c-0x30;	
	else
		return 10;
}

int CTest4GDlg::Str2Int(CString str)
{
	int a;
	int m_nHexSel=1; 
	if(m_nHexSel == 0)
	{
		a = Str2Int(str);
	}
	else
	{
		a =Str2Hex(str);
	}
	return a;
}






HBRUSH CTest4GDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{

//	 if ((pWnd==(GetDlgItem(IDC_EDIT_CUR_NUM))) || (pWnd==GetDlgItem(IDC_EDIT_ACC_NUM)))//
	if (pWnd==GetDlgItem(IDC_EDIT_ERROR))//IDC_EDIT_CUR_NUM
	{   
		UpdateData(TRUE);

		if(m_nCurErrNum==0)
		{
			// pDC->SetTextColor(RGB(255,0,0));   
			clr = RGB(0,255,0);
			pDC->SetBkColor(clr); //设置绿色的背景
			m_brMine= ::CreateSolidBrush(clr);
		}
		else
		{
			//pDC->SetBkColor(RGB(250,250,100));   
			clr = RGB(255,0,0);
		//	clr = RGB(255,250,100);
			pDC->SetBkColor(clr); //设置黑色的背景
			m_brMine= ::CreateSolidBrush(clr);		

		}
		 return m_brMine; 
	  }   
	else if(pWnd==GetDlgItem(IDC_EDIT_RX_CONNET))//IDC_EDIT_RX_CONNET
	{
		if(ConnectError==0)
		{
			clr = RGB(0,255,0);
			pDC->SetBkColor(clr); //设置绿色的背景
			m_brMine= ::CreateSolidBrush(clr);

		}
		else if(ConnectError==1)
		{
			clr = RGB(255,0,0);
			pDC->SetBkColor(clr); //设置红色的背景
			m_brMine= ::CreateSolidBrush(clr);		

		}
		else//-1
		{
			clr = RGB(200,200,200);
			pDC->SetBkColor(clr); //设置黄色的背景
			m_brMine= ::CreateSolidBrush(clr);			
		
		}

		 return m_brMine; 		
	
	}

    HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

	// TODO: Return a different brush if the default is not desired
	return hbr;


}


void CTest4GDlg::OnButtonConnect() 
{
	UpdateData(TRUE);
	
	if(m_Com.GetPortOpen())
		m_Com.SetPortOpen(FALSE);
	
	m_Com.SetCommPort(m_nPort);       //选择端口1
	
	if( !m_Com.GetPortOpen())
		m_Com.SetPortOpen(TRUE);	//打开串口
	else
		AfxMessageBox("cannot open serial port");
	
//	MessageBox((LPCSTR)"串口已打开!", "提示", MB_OK);
	m_Com.SetSettings("9600,n,8,1");	
	m_Com.SetHandshaking(0);

	m_Com.SetRThreshold(1);
	//参数1表示每当缓冲区有多于或等于1个字符时将引发一个接收数据的OnComm事件
	m_Com.SetInputMode(1);//0为文本,1为2进制
	m_Com.SetInputLen(0);//设置当前接收区数据长度为0
	m_Com.GetInput();//先预读缓冲区以清除残留数据	

	ColorFlag=1;
	nHardwareReady=0;	

	unsigned char  tt=ReadByteDevice(0x75);

	if( tt != 0xB0 )//读VSC8288 芯片ID
	{
		nHardwareReady=0;
		
		MessageBox("未检测到误码仪,请检查");

		return;

	}
	nHardwareReady=1;

	GetDlgItem(IDC_BUTTON_SETTING)->EnableWindow(TRUE);	
	
}

void CTest4GDlg::OnSelchangeCombo1() //码型被选择
{
	UpdateData(TRUE);
	if(m_nSelCombox==3)//64bit码型
	{

	
	}
	else if(m_nSelCombox==4)//40bit码型
	{
	
	
	}
	
}
/*
void CTest4GDlg::OnButtonWrite() 
{
	UpdateData(TRUE);
	
	BYTE Addrtemp,Datatemp;
	Addrtemp=Str2Hex(m_strAddr);
	Datatemp=Str2Hex(m_strData);
	WriteByteDevice(Datatemp,Addrtemp);//
	
	BYTE temp2;
	temp2 = ReadByteDevice(Addrtemp);
	if(Datatemp==temp2)
		MessageBox("写入成功!");
	else
		MessageBox("写入失败!");	
}

void CTest4GDlg::OnButtonRead() 
{
	UpdateData(TRUE);
	
	BYTE Addrtemp,Datatemp;
	Addrtemp=Str2Hex(m_strAddr);
	Datatemp=ReadByteDevice(Addrtemp);
	CString str;
	str.Format("%02X",Datatemp);
	GetDlgItem(IDC_EDIT_DATA)->SetWindowText(str);
	
}


void CTest4GDlg::OnModeSetting() 
{
	UpdateData(TRUE);
	BYTE datatemp;
	
	datatemp=ReadByteDevice(Addr_MODE_CTRL_0);

	if(m_bRadioMode==0)
	{
		WriteByteDevice(0x18,Addr_MODE_CTRL_0);
		datatemp=ReadByteDevice(Addr_TX_FIFO_CTRL);
		datatemp |=0x20;
		WriteByteDevice(datatemp,Addr_TX_FIFO_CTRL);		

	}
	else
	{
		WriteByteDevice(0xC8,Addr_MODE_CTRL_0);
	}
	
	datatemp=ReadByteDevice(Addr_MODE_CTRL_0);
	
	
}

*/




















⌨️ 快捷键说明

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