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

📄 serialcommdlg.cpp

📁 一个风扇转速控制的上位机程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:

	return TRUE;
}


void CSerialCommDlg::OnOpenClose() 
{
	// TODO: Add your control notification handler code here

	//如果设备已经打开,那么关闭它
	if(m_COM.GetPortOpen())
	{	
		m_COM.SetPortOpen(FALSE);
		GetDlgItem(IDC_OPEN_CLOSE)->SetWindowText("打开串口");
		m_szStatus="关闭";                          //在下面的状态框中输出当前的串口状态
	}
	else
	{
		//取得用户的设置
		UpdateData(true);

		//获取并设置端口号
		int comNum;                                     //获取组合框当前项的临时变量,下面也通用

//		CString comna;
		char comtemp;
//		comNum=m_ctrlCOMName.GetCurSel();
//		m_ctrlCOMName.GetDlgItemText(comNum,comna);
		comtemp=m_szCOMName.GetAt(3);
		comNum=comtemp-'0';

		m_COM.SetCommPort(comNum);                 //选择com端口号

		//获取校验位
		comNum=m_ctrlParity.GetCurSel();

		CString parityStytle[3]={"n","o","e"};

		CString parity=parityStytle[comNum];
											   
		//如果串口没有打开则打开

		if(!m_COM.GetPortOpen())
		{
			m_COM.SetPortOpen(TRUE);                    //打开串口
			m_szStatus="打开";                          //在下面的状态框中输出当前的串口状态
		}
		else
		{
			AfxMessageBox("串口打开失败!");             //打开失败则输出提示信息
		}

		//串口参数设置
		m_COM.SetSettings(m_szBaud+parity+m_szDataBits+m_szStopBits);   //波特率,校验,数据位,停止位
		m_COM.SetInputMode(1);                                          //1:表示以二进制方式检取数据
		m_COM.SetRThreshold(1);                //参数1表示每当串口接收缓冲区中有多于或等于1个字符时,将引发一个接收数据的OnComm事件
		m_COM.SetInputLen(0);                  //设置当前接收区数据长度为0
		m_COM.GetInput();                      //先预读缓存区,以清除残留数据
		
		//打开后改变按钮的状态	
		if(m_COM.GetPortOpen())
		{
			GetDlgItem(IDC_OPEN_CLOSE)->SetWindowText("关闭串口");
		}
	}
	UpdateData(false);
}

BEGIN_EVENTSINK_MAP(CSerialCommDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CSerialCommDlg)
	ON_EVENT(CSerialCommDlg, IDC_MSCOMM, 1 /* OnComm */, OnOnCommMscomm, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()

void CSerialCommDlg::OnOnCommMscomm() 
{
	// TODO: Add your control notification handler code here
	if(reciflag)
	{
		//读取控件数据
		UpdateData(true);

		//代表控件引发的事件
		switch(m_COM.GetCommEvent())
		{
		case 1://comEvSend   发送数据
			{
				//如有数据要发送
				OnSend();
			}
			break;
		case 2://comEvReceiv   接收数据
			{
				static counti=0;
				int m_iRecvDataCount;
				VARIANT variant_inp;
				COleSafeArray safearray_inp;
				LONG len,k;
				BYTE rxdata[16];              //设置byte数组 An 8-bit integerthat is not signed.
				CString strtemp; 
				static CString show;
				variant_inp=m_COM.GetInput();   //读缓存区
				safearray_inp=variant_inp;       //VARIANT型变量转换为ColeSafeArray型变量 
				len=safearray_inp.GetOneDimSize();     //得到有效数据长度
				for(k=0;k<len;k++)
				{
					safearray_inp.GetElement(&k,rxdata+k);    //转为byte型数组
				}
				for(k=0;k<len;k++)                            //将数组转换为cstring类型
				{
					m_iRecvDataCount;                       //接收数据的总数
					BYTE bt=*(char*)(rxdata+k);               //字符型
					strtemp.Format("%C",bt);                //将字符送入strtemp临时变量中存放
					show+=strtemp;               //加入接收编辑框对应的字符串
	//				if((m_iRecvDataCount>0)&&((m_iRecvDataCount % 16)==0))
	//				{
	///					strtemp.Format("\r\n");
	//					m_szRecvData +=strtemp;
	//				}
	//				UpdateData(FALSE);                        //更新编辑框内容
	//				if((m_iRecvDataCount/16)>=13)
	//				{
	//					m_Recv_Ctrl.SendMessage(EM_SCROLL,SB_LINEDOWN,0);
	//				}
				}
				m_nRecvCount+=len;
				counti+=len;
				if(counti%16==0)
				{
					show.Replace("#V0","转速:");
					show.Replace("#U0","控制量:");
					m_szRecvData+=show+"\r\n";
					this->UpdateData(FALSE);
					
					counti=0;
					CString temp1,temp2;
					show.Delete(0,5);
					show.Delete(5,7);
					show.Remove(';');
					temp1=show.Left(4);
					temp2=show.Right(4);
					WData.PV=atoi((LPCTSTR)temp1);
					WData.MV=atoi((LPCTSTR)temp2);
					WriteDataToFile();
					show="";
				}
			}
			break;
		case 1009://comEventRxParity 事件,奇偶校验错误
			{
				//错误处理代码
				AfxMessageBox("奇偶校验错误,未处理");
			}
			break;
		default:
			break;
		}
		this->UpdateData(FALSE);
	}
	else
	{
		WriteDataToFile();
	}
}

char 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 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 CSerialCommDlg::OnSend() 
{
	// TODO: Add your control notification handler code here
	this->UpdateData(true);
	reciflag=0;
	CString temp1,temp2,temp3;
	temp2="";
	if(m_kp<10)
		temp1.Format("$P00%d;",m_kp);
	else if(m_kp<100 && m_kp>=10)
		temp1.Format("$P0%d;",m_kp);
	else
		temp1.Format("$P%d;",m_kp);
	temp2=temp1;
	temp3=temp2;

	MySendOut(temp3);
	for(int n=0;n<65535;n++){for(int n=0;n<1000;n++){}}
	temp3="";

	if(m_ti<10)
		temp1.Format("$I00%d;",m_ti);
	else if(m_ti<100 && m_ti>=10)
		temp1.Format("$I0%d;",m_ti);
	else
		temp1.Format("$I%d;",m_ti);
	temp2+=temp1;

	temp3+=temp1;
	MySendOut(temp3);
	for(n=0;n<65535;n++){for(int n=0;n<1000;n++){}}
	temp3="";

	if(m_td<10)
		temp1.Format("$D00%d;",m_td);
	else if(m_td<100 && m_td>=10)
		temp1.Format("$D0%d;",m_td);
	else
		temp1.Format("$D%d;",m_td);
	temp2+=temp1;

	temp3+=temp1;
	MySendOut(temp3);
	for(n=0;n<65535;n++){for(int n=0;n<1000;n++){}}
	temp3="";

	m_szSendData+=temp2+"设置控制器\r\n";
	this->UpdateData(FALSE);
	reciflag=1;
}

void CSerialCommDlg::OnClearCount() 
{
	// TODO: Add your control notification handler code here
	m_nSendCount=0;
	m_nRecvCount=0;
	this->UpdateData(false);
	
}

void CSerialCommDlg::OnClearSend() 
{
	// TODO: Add your control notification handler code here
	m_szSendData="";
	this->UpdateData(FALSE);
	
}

void CSerialCommDlg::OnClearRecv() 
{
	// TODO: Add your control notification handler code here
	m_szRecvData="";
	this->UpdateData(FALSE);
	
}

void CSerialCommDlg::OnSetsv() 
{
	reciflag=0;
	this->UpdateData(true);
	CString temp1,temp2;
	temp2="";
	if(m_sv<10)
		temp1.Format("$S00%d;",m_sv);
	else
		temp1.Format("$S0%d;",m_sv);
	temp2=temp1;

	MySendOut(temp2);
	m_szSendData+=temp2+"设置给定\r\n";
	this->UpdateData(FALSE);
	reciflag=1;
}

void CSerialCommDlg::OnReset() 
{
	reciflag=0;
	this->UpdateData(true);
	CString temp1,temp2;
	temp2="";
	temp1="$R000;";
	temp2=temp1;

	MySendOut(temp2);
	m_szSendData+=temp2+"控制器复位\r\n";
	this->UpdateData(FALSE);	
	reciflag=1;
}

void CSerialCommDlg::OnLoopset() 
{
	reciflag=0;
	this->UpdateData(true);
	UINT loopsel;
	loopsel=1-loopsel;
	loopsel=m_ctrl_loop.GetCurSel();
	CString temp1,temp2;
	temp2="";
	temp1.Format("$L00%d;",loopsel);
	temp2=temp1;

	MySendOut(temp2);
	m_szSendData+=temp2+"开环闭环设置\r\n";
	this->UpdateData(FALSE);
	reciflag=1;
}

void CSerialCommDlg::OnInimv() 
{
	reciflag=0;
	this->UpdateData(true);
	CString temp1,temp2;
	temp2="";
	if(m_mv<10)
		temp1.Format("$X00%d;",m_mv);
	else
		temp1.Format("$X0%d;",m_mv);
	temp2=temp1;

	MySendOut(temp2);
	m_szSendData+=temp2+"设置初始控制量\r\n";
	this->UpdateData(FALSE);
	reciflag=1;
}
void CSerialCommDlg::WriteDataToFile()
{
	this->UpdateData(TRUE);
	WData.SV=m_sv;
	WData.T=1;
	CFile File;
	File.Open("D:\\Real.dat",CFile::modeCreate||CFile::modeWrite);
	File.Write(&WData,sizeof(WData));
	File.Close();
}

void CSerialCommDlg::OnAbout() 
{
	// TODO: Add your control notification handler code here
	CAboutDlg dlg; 
	dlg.DoModal();
}

void CSerialCommDlg::OnShowline() 
{
	// TODO: Add your control notification handler code here
	 WinExec("RunFlat.exe", SW_SHOW); 
}
void CSerialCommDlg::MySendOut(CString sendbuff)
{
	CString temp;
	for(int i=1;i<=8;i++)
	{
		temp=sendbuff.Left(1);


	/*	int len;
    CByteArray array;
	len=send.GetLength();
	array.RemoveAll();
	array.SetSize(len);


	for(int i=0;i<len;i++)
		array.SetAt(i, send[i]);
	*/


	if(!m_ctrlSendMode.GetCurSel())                   //以十六进制发送
	{
		CByteArray hexdata;
		//此处返回的len可以用于计算发送了多少个16进制数
		int len=String2Hex(temp,hexdata);
		m_COM.SetOutput(COleVariant(hexdata));        //发送16进制数据
		m_nSendCount +=len;
	}
	else                                                //以ASCII方式发送
	{
		int len=temp.GetLength();
		m_nSendCount +=len;
		m_COM.SetOutput(COleVariant(temp));         //发送数据
	}





		sendbuff.Delete(0);
		for(int n=0;n<65535;n++){for(int n=0;n<1000;n++){}}
	}

}

⌨️ 快捷键说明

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