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

📄 sampledlg.cpp

📁 凌阳单片机的上位机程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
			m_szCOMName == "COM2")
		{
			m_COM.SetPortOpen(FALSE);		//先关闭
			if (m_szCOMName == "COM1")		m_COM.SetCommPort(1);     			
			if (m_szCOMName == "COM2")		m_COM.SetCommPort(2); 
		}
		else
		{
			::AfxMessageBox("COM端口不对");
			return ;
		}
		
		m_COM.SetPortOpen(TRUE);		//打开串口
		m_szStatus = "打开";
		this->UpdateData(FALSE);
		m_COM.SetSettings(szSetting);			
		m_COM.SetInputMode(1);			//1:表示以二进制方式检取数据
		m_COM.SetRThreshold(1);			//为1表示有一个字符引发一个事件
		m_COM.SetSThreshold(1); 		//参数1表示每当串口接收缓冲区中有
										//多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_COM.SetInputLen(0);			//设置当前接收区数据长度为0
		m_COM.GetInput();				//先预读缓冲区以清除残留数据
	}
	else
	{
		this->UpdateData(TRUE);			//读取内容
	}
}



/////////下拉选择改变时调用SettingChanged()//////////
////////////////////////////////////////////////////
void CSampleDlg::OnSelchangeComName() 
{
	SettingChanged();	
}

void CSampleDlg::OnSelchangeBaud() 
{
	SettingChanged();	
}

void CSampleDlg::OnSelchangeDataBit() 
{
	SettingChanged();	
}

void CSampleDlg::OnSelchangeParity() 
{
	SettingChanged();	
}

void CSampleDlg::OnSelchangeStopBit() 
{
	SettingChanged();
}




//////////////////////定时器函数//////////////
///////////////////////////////////////////////
void CSampleDlg::OnTimer(UINT nIDEvent) 
{
	int dblValue;
	double value;
if(temptemp=="FE"||temptemp=="FF")  //屏蔽FE和FF的干扰
       m_quxian.AppendPoint(0);
else
{
	 dblValue=strHexToInt(temptemp); //将转速转化为整型
	 value=dblValue;                //转化为实型
     m_quxian.AppendPoint(value);  //画图置点
}	
	CDialog::OnTimer(nIDEvent);
}



HBRUSH CSampleDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) 
{
	switch(nCtlColor) {
		case CTLCOLOR_STATIC:
			pDC->SetBkMode(TRANSPARENT);
		case CTLCOLOR_EDIT:
			pDC->SetBkMode(TRANSPARENT);
		case CTLCOLOR_DLG:
			return static_cast<HBRUSH>(m_bkBrush.GetSafeHandle());
	}
	return CDialog::OnCtlColor(pDC, pWnd, nCtlColor);
}



BEGIN_EVENTSINK_MAP(CSampleDlg, CDialog)
    //{{AFX_EVENTSINK_MAP(CSampleDlg)
	ON_EVENT(CSampleDlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
	//}}AFX_EVENTSINK_MAP
END_EVENTSINK_MAP()




/////////////////////////////////////////////////
////////////MSComm控件事件处理函数///////////////
////////////////////////////////////////////////
void CSampleDlg::OnOnCommMscomm1() 
{
	CString temp1=receive();    //调用接收数据函数
	if ((int)::strlen(temp1)==4) //收到数据为4个字节
	{  
		 int i;
		 temptemp="";
        for(i=0;i<=1;i++)
        temptemp+=temp1[i];  //提取前两个字节(电机状态)
	if(temptemp=="EA")
	{
		m_zhuanxiang="正转";
	  m_quxian.AppendPoint(0);
	}
	else if(temptemp=="E9")
	{
		m_zhuanxiang="反转";
       m_quxian.AppendPoint(0);
	   
	   }
		

	UpdateData(FALSE);  //显示电机状态

		temptemp="";
	  
		for(i=2;i<=3;i++)
        temptemp+=temp1[i];//提取后两个字节(转速)
	}
	else
	{	   
	temptemp="";
	temptemp=temp1;
	if(temptemp=="00")
		m_zhuanxiang="停止";
	}
    m_strRXData+=temp1;   
    UpdateData(FALSE); //更新编辑框内容
}

	



/////////////////////////////////////////////////////////////////
//若是在0-F之间的字符,则转换为相应的十六进制字符,否则返回-1////
////////////////////////////////////////////////////////////////
char CSampleDlg::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 CSampleDlg::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 CSampleDlg::comsend(CString  m_sendms)
{
if(m_COM.GetPortOpen())
	{
	   CByteArray hexdata;
       int len=String2Hex(m_sendms,hexdata); //此处返回的len可以用于计算发送了多少个十六进制数
       m_COM.SetOutput(COleVariant(hexdata)); //发送十六进制数
	}
	else 
	{
		::AfxMessageBox("请先打开串行口");
	}
}

/////////////////////////////////////////
//////////接收数据函数/////////////////////
/////////////////////////////////////////
CString CSampleDlg::receive()
{
    VARIANT variant_inp;
    COleSafeArray safearray_inp;
    LONG len,k;
    BYTE rxdata[2048];    //设置BYTE数组 
    CString strtemp;
	CString temp;
    if(m_COM.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符
    {             
        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型数组
		temp="";
        for(k=0;k<len;k++) //将数组转换为Cstring型变量
	
        {
            BYTE bt=*(char*)(rxdata+k); //字符型     
            strtemp.Format("%02X",bt); //将字符以十六进制方式送入临时变量strtemp存放
            temp+=strtemp; //加入接收编辑框对应字符串 	
        }
		
    }
	return temp;
}


///////////////////////////////////////////////////////////////////
////////////////////////////////////延时程序////////////////////////
////////////////////////////////////////////////////////////////////
void CSampleDlg::timedelay(double i)
{
DWORD dwStart = GetTickCount();
DWORD dwEnd = dwStart;
do{     MSG  msg; 
    GetMessage(&msg,NULL,0,0); 
    TranslateMessage(&msg); 
	DispatchMessage(&msg);   
	dwEnd = GetTickCount();  
}
 while((dwEnd-dwStart)<=i);
}






//////////////////////////////////////////////////////////////
//////////////////CString 类型16进制转化为整型////////////////
//////////////////////////////////////////////////////////////
int CSampleDlg::strHexToInt(CString strTemp)
{
int nTemp=0;
for(int i = 0;  i<(int)::strlen(strTemp);  i++)
 {
  int nDecNum;
  switch(strTemp[i])
  {
   case 'a':
   case 'A': nDecNum = 10; break;
   case 'b':
   case 'B': nDecNum = 11; break;
   case 'c':
   case 'C':   nDecNum = 12;   break;
   case 'd':
   case 'D':   nDecNum = 13;   break;
   case 'e':
   case 'E':   nDecNum = 14;   break;
   case 'f':
   case 'F':   nDecNum = 15;   break;
   case '0':
   case '1':
   case '2':
   case '3':
   case '4':
   case '5':
   case '6':
   case '7':
   case '8':
   case '9':    nDecNum = strTemp[i] - '0';     break;
   default:     return 0;   
        }
     nTemp += nDecNum * (int)::pow(16,::strlen(strTemp)-i -1);
 }
 return nTemp;

}


///////////////发送正转命令//////////////
void CSampleDlg::Onzhengzhuan() 
{
	m_quxian.AppendPoint(0);
	comsend("EF");    //发送EF
    timedelay(30);    //延时
	comsend("AA");    //索取转速
	m_zhuanxiang="正转";//设置状态
	UpdateData(FALSE); //更新编辑框内容
	
}


///////////////发送停止命令//////////////
void CSampleDlg::Ontingzhi() 
{
	comsend("EE");//发送EE
    timedelay(30);//延时
	comsend("AA");	//索取转速
    m_zhuanxiang="停止";//设置状态
	UpdateData(FALSE); //更新编辑框内容

}

///////////////发送反转命令//////////////
void CSampleDlg::Onfanzhuan() 
{
    m_quxian.AppendPoint(0);
	comsend("ED");//发送ED
    timedelay(30);//延时
	comsend("AA");//索取转速
	m_zhuanxiang="反转";//设置状态
	UpdateData(FALSE); //更新编辑框内容
	
}

///////////////发送加速命令//////////////
void CSampleDlg::Onjiasu() 
{
	comsend("EB");//发送EB
    timedelay(30);//延时
	comsend("AA");//索取转速	
}

///////////////发送减速命令//////////////
void CSampleDlg::Onjiansu() 
{
	comsend("EC");//发送EC
    timedelay(30);//延时
	comsend("AA");//索取转速
}


////////////端口测试///////////////
void CSampleDlg::Onduankou() 
{
	
	if(m_COM.GetPortOpen())
	{
		::AfxMessageBox("串口工作正常");
	}
	else 
       ::AfxMessageBox("请先设置端口参数");	
}


////////////////发送手动命令//////////////
void CSampleDlg::Onfasong() 
{
   if(m_COM.GetPortOpen())
   { 
	   UpdateData();
	   comsend(m_mingling);
   }
   else 
	   ::AfxMessageBox("请先打开端口");	
}




/////////跳出直流电机参数设置对话框/////////
void CSampleDlg::Ondianjicanshu() 
{
	CMyDlg1 dlg1;
	dlg1.DoModal();	
}


//////////跳出温度控制参数设置对话框//////////
void CSampleDlg::Onweducanshu() 
{
	CMyDlg2 dlg2;
	dlg2.DoModal();	
}




/////////////跳出关于对话框///////////
void CSampleDlg::Onguanyu() 
{
	CAboutDlg about;
	about.DoModal();	
}



//////////退出程序////////////////////
void CSampleDlg::Onlikai() 
{
	DestroyWindow();	
}



/////////直流电机控制反转命令///////////
void CSampleDlg::Onfanzhuan1() 
{
	::AfxMessageBox("请先设置电机参数");	
}


/////////直流电机控制减速命令///////////
void CSampleDlg::Onjiansu1() 
{	
	::AfxMessageBox("请先设置电机参数");	
}


/////////直流电机控制正转命令///////////
void CSampleDlg::Onzhenzhuan1() 
{
	::AfxMessageBox("请先设置电机参数");	
}



/////////直流电机控制停止命令///////////
void CSampleDlg::Ontingzhi1() 
{
	::AfxMessageBox("请先设置电机参数");	
}


/////////直流电机控制加速命令///////////
void CSampleDlg::Onjiasu1() 
{
	::AfxMessageBox("请先设置电机参数");	
}

/////////温度控制降温命令///////////
void CSampleDlg::Onjiangwen1() 
{
	::AfxMessageBox("请先设置温度控制参数");
	
}

/////////温度控制升温命令///////////
void CSampleDlg::Onshenwen1() 
{
	::AfxMessageBox("请先设置温度控制参数");	
}


/////////温度控制升温命令///////////
void CSampleDlg::Onshengwen() 
{
	::AfxMessageBox("请先设置温度控制参数");	
}


/////////温度控制降温命令///////////
void CSampleDlg::Onjiangwen() 
{
	::AfxMessageBox("请先设置温度控制参数");	
}

//////////////////////画图命令///////////////////
/////////////////////////////////////////////////
void CSampleDlg::Onhuatu() 
{
	if(m_zhuangtai==TRUE)     //按钮状态为"画图"
	{
		m_quxian.Reset();  //画图清屏
		SetTimer(1,1000,NULL);//启动定时器画图
	    m_zhuangtai=FALSE;   //设置按钮状态
		GetDlgItem(IDC_huatu)->SetWindowText("停止");//更新按钮名称	
	}
	else
	{
		KillTimer(1);   //关闭定时器
	  m_zhuangtai=TRUE;  //设置按钮状态
	  GetDlgItem(IDC_huatu)->SetWindowText("画图");	//更新按钮状态
	}	
}

⌨️ 快捷键说明

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