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

📄 a808mdlg.cpp

📁 显示West4170的波形, 并可读取或设置所有的参数
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			
			if(str=="停止发送")
			{
				SetTimer(1,200,NULL);		//启动定时器,发送数据
				SendData();			//发送数据
			}
		}
	
}

//显示处理:数据从仪表返回后进行的显示处理
void CA808MDlg::DisplayParameter()
{
	
	
	CListBox* plist=(CListBox*)GetDlgItem(IDC_LIST_PARAMETER);
	
	int len=m_pRxdatd.GetSize();				//收到数据的长度
	CString str;
	CString strtemp1,strtemp2,strtemp3;
	char temp;
	CEdit *pEdit=(CEdit*)GetDlgItem(IDC_EDIT_DISPLY_PARAMETER);
	CClientDC dc(this);

	CEdit* pEdit1=(CEdit*)GetDlgItem(IDC_EDIT_FOR_WRITE);
	
	CFont* pOldFont = (CFont*) (dc.SelectObject(&font));
	
	for(int i=0;i<len;i++)
	{			
		temp=m_pRxdatd.GetAt(i);
		str+=temp;
	}
	
	strtemp3=m_pRxdatd.GetAt(3);
	

	if(str.Find("N*")!=-1)				//控制器不按指令动作
	{
		str="没有修改";
	}
	if(str.Find("I*")!=-1)				//这是三类执行数据修改的指令,正常请继续
	{
		m_rxstate=WRITE_FOUR_COMMAND;
		m_shortProcess=true;
	//	up_down=100;				//这是自己定的一个状态。
	//	pEdit1->SetWindowText("come on");
	}
	if(str.Find("]20")!=-1)				//扫描表指令
	{
		strtemp1=str.Mid(6,5);
		strTostr(strtemp1);
		pEdit->SetWindowText(strtemp1);		//在主显示位置显示数据
		strtemp2=str.Mid(11,5);
		strTostr(strtemp2);
		pEdit1->SetWindowText(strtemp2);

		str=strtemp1+':'+strtemp2;
		

	}
	
	if(str.Find("<??>0A*")!=-1)				//新参数超过控制器的允许范围
	{
		str="超上限!";
	}
	else if(str.Find("<??>5A*")!=-1)			//新参数超过控制器的允许范围
	{
		str="超下限!";	
	}
	else if(str.Find("A*")!=-1)				//发收一切正常
	{
		int x=str.Find("A*");
		str=str.Mid(4,x-4);
		strTostr(str);					//转换字符为标准显示
	}


	if(!m_shortProcess)
	{
		
		switch(m_rxstate)
		{
		case WRITE_FOUR_COMMAND:
		case WRITE_PARAMETER:				//在单参数位置显示写参数:成功与否
			pEdit1->SetWindowText(str);		//在单参数位置显示一个参数值,以供写参数时参考
			up_down=0;
			break;
		
		case SINGLE_PARAMETER:
			pEdit1->SetWindowText(str);		//在单参数位置显示一个参数值,以供写参数时参考
			break;
		case LIST_PARAMETER:
			strtemp3=GetParamterFromCommand(strtemp3);
			strtemp3+="=";
			str=strtemp3+str;
			plist->AddString(str);			//在列表中显示数据
			break;
		default:
			
			pEdit->SetFont(&font,TRUE);
			
			pEdit->SetWindowText(str);		//在主显示位置显示数据
			break;
			
		}
	}
	dc.SelectObject(pOldFont);
	UpdateData(FALSE);

	
}

void CA808MDlg::OnTimer(UINT nIDEvent) 
{
	CEdit* pedit=(CEdit*)GetDlgItem(IDC_EDIT_DISPLY_PARAMETER);
	CString num;
	int   number;
	pedit->GetWindowText(num);
	number=atoi((const char*)num);
	if(number<1)
		number=1;
	double dt = ::timeGetTime()/1000.0;

	CButton* pcheck=(CButton*)GetDlgItem(IDC_CHECK_CHARACT);
	//处理不能正常接收的数据
	CListBox* plist=(CListBox*)GetDlgItem(IDC_LIST_ERROR);
	CString str,str1;
	
	switch(nIDEvent)
	{
	case 0:
		
		m_scope.AddValue(dt,number);
		m_scope.SetValue(number);
		m_scope.UpdateCurve();
		
		
		//m_ctrlHistogram.SetPos(number);
		break;
	case 1:
		
		if(m_pRxdatd.GetSize())
		{
			
			for(int i=0;i<m_pRxdatd.GetSize();i++)
			{
				if(pcheck->GetCheck())
				{
					str1.Format("%c",m_pRxdatd.GetAt(i));	//显示字符
				}
				else
				{
					str1.Format("%02x ",m_pRxdatd.GetAt(i));	//显示十六进制并加一空格
				}
				
				str+=str1;
			}
			plist->AddString(str);					//在错误列表中显示不能处理的数据
		}
		if(m_rxstate!=LIST_PARAMETER && !m_shortProcess)
			m_rxstate=MAIN_NUMBER;		//只要不是参数列时,恢复主通信状态
		m_pRxdatd.RemoveAll();			//时间到删除数据,并发送下一轮数据
		m_shortProcess=false;
		
		SendData();
		Beep(3000,30);				//有error时发出提示音
		
		break;
		
	}
	
	
	CDialog::OnTimer(nIDEvent);
}

//组织要发送的数据,
void CA808MDlg::SendData()
{
	CEdit* pEdit=(CEdit*)GetDlgItem(IDC_EDIT_FOR_WRITE1);

	CButton* pButton=(CButton*)GetDlgItem(IDC_BUTTON_READ_PARAMETER);
	
	static n_parameter=0;
	CByteArray hexdata;

	CString strTemp="L";
	//取表号
	CComboBox* pcombo=(CComboBox*)GetDlgItem(IDC_COMBO_METER_INDEX);
	int meterIndex=1+pcombo->GetCurSel();
	CString str;
	int index;
	str.Format("%02d",meterIndex);			//表号
	strTemp+=str;					//L{N}

	//取参数代码
	pcombo=(CComboBox*)GetDlgItem(IDC_COMBO_PARAMETER);
	CString str1;
	CString str2;
	CString temp;
	switch(m_rxstate)
	{
	case WRITE_PARAMETER:
		index=pcombo->GetCurSel();
		pcombo->GetLBText(index,str1);
		if(up_down==1)				//按升
			str2='+';
		else if(up_down==-1)			//按降
			str2='-';
		else					//按写按钮
		{
			
			pEdit->GetWindowText(temp);	//取得要写的字符
			strToData(temp);		//对照表的格式转换成发送的数据格式
			str.Format("%05s",temp);	//格式化成长度5
			str2='#';
			str2+=str;			//这是最终写参数:要是参数可以接受,则进行到下一步:第四类指令
		}
		break;
	case WRITE_FOUR_COMMAND:			//对上面的参数写的继续,修改参数确定
		index=pcombo->GetCurSel();
		pcombo->GetLBText(index,str1);
		str2='I';
		
		break;
	case SINGLE_PARAMETER:
		index=pcombo->GetCurSel();
		pcombo->GetLBText(index,str1);
		str2='?';
		break;
	case LIST_PARAMETER:				//如果正在读参数
		pcombo->GetLBText(n_parameter+1,str1);	//读取参数字符
		str2='?';
		n_parameter++;				//计数递加
		if(n_parameter==m_ParameterNumber-1)	//读完所有参数
		{
			n_parameter=0;			//静态计数归0
			m_rxstate=MAIN_NUMBER;		//复位正在读参数标志
			
			pButton->SetWindowText("读参数");	//显示已完成读参数过程
			
		}
		break;
	default:
		str1='M';
		str2='?';
		break;
	}

	
	strTemp+=str1.Left(1);				//L{N}{P}
	strTemp+=str2;					//L{N}{P}{C}
	strTemp+='*';					//L{N}{P}{C}*组成二类指令
	
	for(int i=0;i<strTemp.GetLength();i++)
		hexdata.Add(strTemp.GetAt(i));


	DispCodeforSend(hexdata);	//显示发送的十六进制


	if(m_ctrlComm.GetPortOpen())	//如果没有打开串口时,防止出错
	m_ctrlComm.SetOutput(COleVariant(hexdata));	

}

//读取参数表
void CA808MDlg::OnButtonReadParameter() 
{
	CComboBox* pcombo=(CComboBox*)GetDlgItem(IDC_COMBO_PARAMETER);	//参数表列表控件
	m_ParameterNumber=pcombo->GetCount();				//取得参数行数
	
	CButton* pButton=(CButton*)GetDlgItem(IDC_BUTTON_READ_PARAMETER);	//本按钮控件
	

		m_rxstate=LIST_PARAMETER;
		pButton->SetWindowText("正在读参数....");		//本按钮并显示提示
		

	CListBox* plist=(CListBox*)GetDlgItem(IDC_LIST_PARAMETER);	//显示参数列表
	int n=plist->GetCount();
	if(n>0)
	{
		for(int i=n-1;i>=0;i--)
		{
			plist->DeleteString(i);				//在读取参数前清除原有的内容
		}
	}
	
	m_shortProcess=true;
}

//写参数按钮动作
void CA808MDlg::OnButtonWriteParameter() 
{
	m_rxstate=WRITE_PARAMETER;
	m_shortProcess=true;
	
}

//参数列表选择参数时,读取其一个参数,以便进行写此参数操作
void CA808MDlg::OnSelchangeComboParameter() 
{
		m_rxstate=SINGLE_PARAMETER;
		m_shortProcess=true;
	
}




//显示发送的数据代码
void CA808MDlg::DispCodeforSend(CByteArray &hexdata)
{
	CButton* pcheck=(CButton*)GetDlgItem(IDC_CHECK_CHARACT);
		
	if(m_rxstate==SINGLE_PARAMETER|| m_rxstate==WRITE_PARAMETER && !m_shortProcess)
	{
		CEdit* p=(CEdit*)GetDlgItem(IDC_EDIT_ADD_VERIFY);
		CString strp;
		CString strtemp;

		for(int i=0;i<hexdata.GetSize();i++)
		{
			if(pcheck->GetCheck())
			{
				strp.Format("%c",hexdata.GetAt(i));
				
			}
			else
			{
				strp.Format("%02x ",hexdata.GetAt(i));
			}
			
			strtemp+=strp;
		}
		
		p->SetWindowText(strtemp);
	}
}



void CA808MDlg::OnDeltaposSpinEditParameter(NMHDR* pNMHDR, LRESULT* pResult) 
{
	NM_UPDOWN* pNMUpDown = (NM_UPDOWN*)pNMHDR;
	// TODO: Add your control notification handler code here
	up_down=pNMUpDown->iDelta;
	m_rxstate=WRITE_PARAMETER;
	m_shortProcess=true;
	*pResult++;
}

//将表3-1:从读出的数据(小数点的位置用一个数表示,放在接收到的字符最后一位)变成可显示的数
void CA808MDlg::strTostr(CString &ton)
{
	CString temp,str;
	char ch;
	int answer=0;
	int k,x,y;
	temp=ton.Left(4);
	ch=ton.GetAt(4);

	answer=atoi((const char*)temp);
	k=atoi(&ch);
	switch(k)
	{
	case 0:
	case 5:			//无小数
		x=answer;
		break;
	case 1:
	case 6:			//一位小数
		x=answer/10;
		y=answer%10;
		break;
	case 2:
	case 7:			//2位小数
		x=answer/100;
		y=answer%100;
		break;
	case 3:
	case 8:			//3位小数
		x=answer/1000;
		y=answer%1000;

	}
	if(k>4)			//大于5是负数
		x=-x;
	if(k==0 ||k==5)
	{
		str.Format("%i",x);
	}
	else
	{
		str.Format("%i.%i",x,y);
	}
	

	ton=str;
}

//转换数据
void CA808MDlg::strToData(CString &str)
{
	int len=str.GetLength();
	int x=0;
	int y=0;


	if(len>6)
	{
		MessageBox("字数太多",NULL,MB_OK);
		return;
	}
	x=str.Find('.');
	if(x==-1)
	{
		y=0;				//最后面应补的字
	}
	else					//有小数点
	{
		y=len-x-1;			//最后面应补的字
		
		CString left=str.Left(x);
		CString righ=str.Right(len-x-1);
		str=left+righ;			//去小数点

	}
	
	
	if(str.GetAt(0)=='-')
	{
		y+=5;				//是负数加上5
		str.Delete(0);			//去掉负号
		
	}

	str+=(char)(y+0x30);

}

CString CA808MDlg::GetCommandFromParameter(CString field)
{
	POSITION pos=NULL;
	int i;
	for(pos=this->commandeName_parameter_list[1].GetHeadPosition(),i=0;pos!=NULL;i++)
	{
		if(field==this->commandeName_parameter_list[1].GetNext(pos))
		{
			return commandeName_parameter_list[0].GetAt(commandeName_parameter_list[0].FindIndex(i));

		}
	}
	return CString("");

}

CString CA808MDlg::GetParamterFromCommand(CString field)
{
	POSITION pos=NULL;
	int i;
	for(pos=this->commandeName_parameter_list[0].GetHeadPosition(),i=0;pos!=NULL;i++)
	{
		if(field==this->commandeName_parameter_list[0].GetNext(pos))
		{
			return commandeName_parameter_list[1].GetAt(commandeName_parameter_list[1].FindIndex(i));
		}
	}
	return CString("");

}

void CA808MDlg::InitCHistogramCtrl()
{
//	CRect rect;
//	GetDlgItem(IDC_STATIC_HISTOGRAM)->GetWindowRect(rect);
	//ScreenToClient(rect);
//	m_ctrlHistogram.Create(WS_VISIBLE | WS_CHILD | WS_TABSTOP, rect, this, 1000);
//	m_ctrlHistogram.SetRange(1, 200);
//	m_ctrlHistogram.SetSpeed(CHistogramCtrl::HIGH_SPEED);
	//m_ctrlHistogram.SetGridsColor(RGB(0, 0, 0));
	//m_ctrlHistogram.SetBkColor(RGB(255, 255, 255));
	//m_ctrlHistogram.SetPen(2, RGB(255, 0, 0));

//	Randomize();
	

}

⌨️ 快捷键说明

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