📄 test4gdlg.cpp
字号:
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 + -