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

📄 tongxundlg.cpp

📁 来自网络的一个串口通信控制电容器的例子
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		if(btnName_closejcq=="合接触器")
		{
			SetDlgItemText(IDC_CLOSEJCQ,"断接触器");
	//		int len=String2Hex(m_strTXData,hexdata);		//此处返回的len可以用于计算发送了多少个十六进制数
			int len=String2Hex("7E E7 7E 58 F3 4D 02 A0 A0 E4 DA 0D ",hexdata);	
	//		m_ctrlComm.SetOutput(COleVariant("7E E7 7E 58 F3 4D 02 A0 A0 E4 DA 0D "));
			m_ctrlComm.SetOutput(COleVariant(hexdata));		//以16进制发送数据
			SetDlgItemText(IDC_EDIT_JCQCLOSUC,"接触器已合上");
		}

		if(btnName_closejcq=="断接触器")
		{
			SetDlgItemText(IDC_CLOSEJCQ,"合接触器");
			int len=String2Hex("7E E7 7E 58 F3 4D 02 0A 0A E4 AE 0D ",hexdata);
			m_ctrlComm.SetOutput(COleVariant(hexdata));			//以16进制发送数据			
	//		m_ctrlComm.SetOutput(COleVariant("7E E7 7E 58 F3 4D 02 0A 0A E4 AE 0D "));
			SetDlgItemText(IDC_EDIT_JCQCLOSUC,"接触器已断开");
		}
		SetTimer(1,500,NULL);
	}//end else
}


//*****************************************************
//以16进制发送数据的格式
//		String2Hex("7E E7 7E 58 F3 4C 02 0D 0D E5 B3 0D ",hexdata);
//		m_ctrlComm.SetOutput(COleVariant(hexdata));			//以16进制发送数据
//定时发送查询命令
void CTongxunDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData(TRUE);
	if(receiving_flag!=1&&m_ctrlComm.GetPortOpen())			//串口打开了,才进行下面的操作	
	{
		CString str="";
		if(m_autoinquire.GetCheck())			//没有正在读缓冲区,且选中自动查询,则隔0.5s发送一次查询命令
		{
			CByteArray hexdata;
			String2Hex("7E E7 7E 58 F3 5C 02 AA 55 0A A8 0D ",hexdata);	
			m_ctrlComm.SetOutput(COleVariant(hexdata));			//以16进制发送数据	//每隔0.5ms发送一次查询命令	
			UpdateData(FALSE);						//更新编辑框内容
		}
//**************************************************************************
//		SetDlgItemText(IDC_EDIT_COMOPSUC,m_strrxdata);		//用IDC向编辑框发送变量显示
//		SetDlgItemText(IDC_EDIT_COMOPSUC,"串口已关闭");		//用IDC向编辑框发送常量显示
//		m_ctrlComm.SetOutput(COleVariant(hexdata));			//用变量向编辑框发送变量显示
//		nbit_dec2str(int dec_data,int nbit_data)			//转换函数的格式
//**************************************************************************
//对查询返回数据进行处理
//
		UpdateData(TRUE);						//读取编辑框数据


		if(rxdata_notdisplay=="")
		{
			SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电前");		//充电机状态
			SetDlgItemText(IDC_EDIT_VCHECK_DATA,"0");			//充电电压
			SetDlgItemText(IDC_EDIT_ICHECK_DATA,"0.0000");		//充电电流
			SetDlgItemText(IDC_EDIT_VSET_DATA,"0");				//设置电压
			SetDlgItemText(IDC_EDIT_MXVCHECK_DATA,"0");			//母线电压
			SetDlgItemText(IDC_EDIT_MXICHECK_DATA,"0.0000");	//母线电流
			SetDlgItemText(IDC_EDIT_JCQSTATE,"闭合");			//接触器状态
		}
		else
		{
			str="";
			int len=rxdata_notdisplay.GetLength();
			if(len>=20)			//若<20,肯定不是查询返回的数据,跳过
			{
				for(int i=0;i<20;i++)
					str+=rxdata_notdisplay[i];

				if(str=="7E E7 7E F3 58 C5 0A")		//不是查询返回的数据,不对显示作修改处理
				{			
					str=nbit_dec2str(bitn_str2dec(rxdata_notdisplay,8)*256+bitn_str2dec(rxdata_notdisplay,9),4);
					SetDlgItemText(IDC_EDIT_VSET_DATA,str);				//设置电压
				//--------------------------------
					str=nbit_dec2str(bitn_str2dec(rxdata_notdisplay,10)*256+bitn_str2dec(rxdata_notdisplay,11),4);
					SetDlgItemText(IDC_EDIT_VCHECK_DATA,str);			//充电电压
				//--------------------------------
					str=nbit_dec2str(bitn_str2dec(rxdata_notdisplay,12)*256+bitn_str2dec(rxdata_notdisplay,13),4);
					SetDlgItemText(IDC_EDIT_MXVCHECK_DATA,str);			//母线电压
				//--------------------------------
					str=nbit_dec2str(bitn_str2dec(rxdata_notdisplay,14)*256+bitn_str2dec(rxdata_notdisplay,15),4);
					SetDlgItemText(IDC_EDIT_MXICHECK_DATA,str);			//母线电流
				//--------------------------------
					char ch1=rxdata_notdisplay[48];
					char ch2=rxdata_notdisplay[49];
					if(ch1=='0'&&ch2=='C')

//					if(rxdata_notdisplay[48]=='0'&&rxdata_notdisplay[49]=='C')
						SetDlgItemText(IDC_EDIT_JCQSTATE,"闭合");		//充电机状态
					else if(rxdata_notdisplay[48]=='C'&&rxdata_notdisplay[49]=='0')
						SetDlgItemText(IDC_EDIT_JCQSTATE,"断开");
					else 
						SetDlgItemText(IDC_EDIT_JCQSTATE,"****");
				//--------------------------------
					if(rxdata_notdisplay[46]=='1'&&rxdata_notdisplay[47]=='A')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电前");		//接触器状态
					else if(rxdata_notdisplay[46]=='2'&&rxdata_notdisplay[47]=='A')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电中");
					else if(rxdata_notdisplay[46]=='3'&&rxdata_notdisplay[47]=='A')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电完毕");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='1')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"输入电压过高");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='2')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"输入电压过低");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='3')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"母线过流");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='4')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电过压");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='5')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"泻能开关未打开");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='6')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"变压器故障");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='7')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电过流");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='8')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"充电中");
					else if(rxdata_notdisplay[46]=='A'&&rxdata_notdisplay[47]=='9')
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"电压闪络");
					else 
						SetDlgItemText(IDC_EDIT_CHARGE_STATE,"****");
				}//end if(str=="7E E7 7E F3 58 5C 0A") 
			}//end if(len>=20)
		}//end else

		UpdateData(FALSE);			//更新编辑框内容
	}//end if(receiving_flag!=1)
		CDialog::OnTimer(nIDEvent);
}



//***********************************************
//清空接收框内容
void CTongxunDlg::OnClearrxdata() 
{
	// TODO: Add your control notification handler code here
	SetDlgItemText(IDC_RXDATA,"");		//设置接收编辑框内容为空
	m_strrxdata="";						//rxdata同时清空,因为接收时是累加接收:m_strrxdata+=strtemp;
	
}


//*********************************************************************
//数据转换程序
//由于这个转换函数的格式限制,在发送框中的十六制字符应该每两个字符之间插入一个空隔
//如:A1 23 45 0B 00 29
//CByteArray是一个动态字节数组,可参看MSDN帮助
int CTongxunDlg::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;
}

//这是一个将字符转换为相应的十六进制值的函数
//好多C语言书上都可以找到
//功能:若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1
char CTongxunDlg::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 CTongxunDlg::string_to_hex(CString str)
{
	return 0;
}



void CTongxunDlg::OnVoltset() 
{
	// TODO: Add your control notification handler code here
	CString vset_txdata,temp="",str="";
	CByteArray hexdata;
	int check_data=0;

	vset_txdata="7E E7 7E 58 F3 3B 03 ";
	UpdateData(TRUE);							//读入编辑框数据

	str=m_vsetdata;
	int len=str.GetLength();
	int str2dex=0;
	for(int i=0;i<len;i++)						//设置电压是以字符串格式读入,将其转换为十进制数据
		str2dex+=(int)(str[i]-48)*(int)pow(10,len-i-1);


	char ch='0';
	vset_txdata+=onehex2string(str2dex/4096);	//设置电压高位的高位:bit4.转成对应的字符
	vset_txdata+=onehex2string(str2dex/256);	//设置电压高位的低位:bit3.转成对应的字符
	vset_txdata+=" ";
	vset_txdata+=onehex2string(str2dex/16);		//设置电压低位的高位:bit2.转成对应的字符
	vset_txdata+=onehex2string(str2dex%16);		//设置电压低位的低位:bit1.转成对应的字符
	vset_txdata+=" 00 ";

	check_data=0x93^str2dex/256;				//异或校验位转成对应的字符
	check_data^=str2dex%256;
	vset_txdata+=twohex2string(check_data);
	vset_txdata+=" ";

	check_data=0x89+str2dex/256;				//和校验位转成对应的字符
	check_data+=str2dex%256;
	check_data%=256;
	vset_txdata+=twohex2string(check_data);

	vset_txdata+="  0D ";							//分5段拼成设置命令

	String2Hex(vset_txdata,hexdata);				//转换成16进制数据
	m_ctrlComm.SetOutput(COleVariant(hexdata));		//发送十六进制数据

	UpdateData(FALSE);								//更新编辑框内容

}


//*****************************************
//将2位16进制数字转换成相对应的字符
/////
CString CTongxunDlg::twohex2string(int hex2str_data=0)
{
	CString str="";
	char ch='0';
	if(hex2str_data/16<10)
		ch=(char)(hex2str_data/16+48);				//数字0-9转成字符0-9
	else
		ch=(char)(hex2str_data/16+55);				//数字10-15转成字符A-F
	str+=ch;

	if(hex2str_data%16<10)
		ch=(char)(hex2str_data%16+48);
	else
		ch=(char)(hex2str_data%16+55);
	str+=ch;
	return str;
}

//*****************************************
//将1位16进制数字转换成相对应的字符
/////
CString CTongxunDlg::onehex2string(int hex2str_data=0)
{
	CString str="";
	char ch='0';
	if(hex2str_data%16<10)
		ch=(char)(hex2str_data%16+48);				//数字0-9转成字符0-9
	else
		ch=(char)(hex2str_data%16+55);				//数字10-15转成字符A-F
	str+=ch;
	return str;
}

//*****************************************
//将字符串中指定位转换成10进制数据
//该程序仅针对形如7E E7 7E 87 99 ……类中间带空格,每个数据是2位16进制 的字符串
/////
int CTongxunDlg::bitn_str2dec(CString str="",int bitn=0)
{
	int bitn_data=0;
	int i=0,j=0;
	int len=str.GetLength();

	for(i=0;i<len;i++)
	{
		
		if(j==bitn-1)
		{
			bitn_data=onehexstr2dec(str[i])*16+onehexstr2dec(str[i+1]);
			break;
		}
		if(str[i]==' ')
			j++;
		
	}
	return bitn_data;
}
//*****************************************
//该程序将一位16进制表示的字符转成对应的10进制数据.如将'e'转成14
/////////
int CTongxunDlg::onehexstr2dec(char ch='0')
{
	int i=0;
	int oneh2d_data=-1;
	if(ch>='0'&&ch<='9')
		oneh2d_data=(int)ch-48;
	else if(ch>='a'&&ch<='f')
		oneh2d_data=(int)ch-87;
	else if(ch>='A'&&ch<='F')
		oneh2d_data=(int)ch-55;
	return oneh2d_data;
}

//**************************************************
//将指定位数的10进制数据转成字符
////////////
CString CTongxunDlg::nbit_dec2str(int dec_data,int nbit_data)
{
	int i=0;
	char ch='0';
	CString str="";
	for(i=0;i<nbit_data;i++)
	{
		str+=(char)(dec_data/pow(10,nbit_data-i-1)+48);
		dec_data%=(int)pow(10,nbit_data-i-1);
	}
	return str;
}

void CTongxunDlg::OnInquire() 
{
	// TODO: Add your control notification handler code here
	
	if(!m_ctrlComm.GetPortOpen())					//若串口没有打开且没有选自动查询,说明是在点手动发送时串口没打开,报错
	{
		if(!m_autoinquire.GetCheck())
			AfxMessageBox("串口未打开,请打开串口!");
		if(m_autoinquire.GetCheck()&&have_warm_flag!=1)	//选中了自动查询,且没报过错,则报错.避免一直报错
		{
			AfxMessageBox("串口未打开,请打开串口!");	//关串口时将定时器关了,就不会连续报错
			have_warm_flag=1;
		}
	}

	else
	{
		KillTimer(1);
		CByteArray hexdata;
		String2Hex("7E E7 7E 58 F3 5C 02 AA 55 0A A8 0D ",hexdata);	
		m_ctrlComm.SetOutput(COleVariant(hexdata));		//以16进制发送数据
		UpdateData(FALSE);								//更新编辑框内容
		SetTimer(1,500,NULL);
	}
	
}

void CTongxunDlg::OnSelchangeChosecom() 
{
	// TODO: Add your control notification handler code here
	have_chosecom_flag=1;
	if(m_ctrlComm.GetPortOpen())					//若串口已打开
	{
		SetDlgItemText(IDC_OPEN_COMPORT,"打开串口");
		m_ctrlComm.SetPortOpen(FALSE);				//关闭串口	
		SetDlgItemText(IDC_EDIT_COMOPSUC,"");
		AfxMessageBox("COM口选择,串口自动关闭,选择好后请重新打开串口!");
	}	
}

void CTongxunDlg::OnSelchangeChosebud() 
{
	// TODO: Add your control notification handler code here
	have_chosebud_flag=1;
	if(m_ctrlComm.GetPortOpen())					//若串口已打开
	{
		SetDlgItemText(IDC_OPEN_COMPORT,"打开串口");
		m_ctrlComm.SetPortOpen(FALSE);				//关闭串口	
		SetDlgItemText(IDC_EDIT_COMOPSUC,"");
		AfxMessageBox("波特率选择,串口自动关闭,选择好后请重新打开串口!");
	}	
	
}

⌨️ 快捷键说明

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