MFC串口程序最小化后自动退出

wangfeng_35 2012-12-18 08:32:05
如题,就是用MFC编的一个从串口读数,往外发送数据的小程序,启动后能运行一段期间,但是最小化后再打开直接自动退出,求问这个是什么引起的。
之前还一运行就退出,后来改了一些顺序就好了,现在这问题不知道什么原因。求前辈们指导下。
...全文
172 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
wangfeng_35 2012-12-21
  • 打赏
  • 举报
回复
还是找不出原因
rxguoblp 2012-12-19
  • 打赏
  • 举报
回复
串口通信程序怎能在Debug模式下无法运行?那如何调试呀?把代码贴出来看看。
wangfeng_35 2012-12-19
  • 打赏
  • 举报
回复
引用 9 楼 rxguoblp 的回复:
串口通信程序怎能在Debug模式下无法运行?那如何调试呀?把代码贴出来看看。
没法调试,直接运行。然后就总自动退出。
wangfeng_35 2012-12-19
  • 打赏
  • 举报
回复

void CMSCommDlg::OnButtonOpenport() 
{
	// TODO: Add your control notification handler code here
	m_bOpenPort=!m_bOpenPort;
	//设定使用的串口号,默认为com1
	m_ComName=m_ctrlComName.GetCurSel()+1;
	
	//设定波特率,默认115200bps
	int index2,index3,index4,index5;
 	index2=m_ctrlBaud.GetCurSel();
	m_ctrlBaud.GetLBText(index2,m_choose);//获得选中的字符串
	m_BaudRate=atoi(m_choose);

	//设定数据位数,默认8位
 	index3=m_ctrlDataBits.GetCurSel();
	m_ctrlDataBits.GetLBText(index3,m_choose);
	m_DataBits=atoi(m_choose);

	
	//校验位,n表示无校验,o为奇校验,e偶校验
 	index4=m_ctrlParity.GetCurSel();
	switch(index4)
	{
	case 0: m_Parity='n';	 
				break;		
	case 1: m_Parity='o';
				break;
	case 2: m_Parity='e';
				break;
	default:
				break;
	}

	//设定停止位
	index5=m_ctrlStopBits.GetCurSel();
	m_ctrlStopBits.GetLBText(index5,m_choose);
	m_StopBits=atoi(m_choose);

	m_strSettings.Format("%d,%c,%d,%d",m_BaudRate,m_Parity,m_DataBits,m_StopBits);//设置波特率,校验位,数据位,停止位
	
	if(m_bOpenPort)//打开串口
	{
		m_Com.SetCommPort(m_ComName);       //选择com口
		m_Com.SetOutBufferCount(0);			//清空发送缓冲区
		m_Com.SetInBufferCount(0);			//清空接收缓冲区
 		m_Com.SetInBufferSize(4096);		//接收缓冲区
 		m_Com.SetOutBufferSize(1024);		//发送缓冲区
		m_Com.SetSettings(m_strSettings);	//设置波特率,校验位,数据位,停止位
		m_Com.SetInputMode(1);				//1:以二进制方式检取数据
		m_Com.SetRThreshold(1);				//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
		m_Com.SetInputLen(0);				//设置当前接收区数据长度为0,表示全部读取
		m_Com.SetPortOpen(TRUE);			//打开串口
		m_Com.GetInput();					//先预读缓冲区以清除残留数据

		m_ctrlOpenPort.SetWindowText("关闭串口");

	}
	else  //关闭串口
	{
		m_ctrlOpenPort.SetWindowText("打开串口");
		m_Com.SetPortOpen(FALSE);//关闭串口
	}
	
}
void CMSCommDlg::OnCustomdrawSliderSpeed(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
	UpdateData(TRUE);
	m_CmdSpeed=m_ctrlSpeed.GetPos();
	m_rps=m_CmdSpeed/500.0;
	m_kmph=m_CmdSpeed*3.14*m_diameter*3.6/500.0;
 	m_rpm=m_rps*60;
 	UpdateData(FALSE); 
 	*pResult = 0;
}


void CMSCommDlg::OnReleasedCaptureSlider(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// TODO: Add your control notification handler code here
//	UpdateData(TRUE);
	m_SendSpeed=m_CmdSpeed;
	m_currentspeed=m_SendSpeed;
	m_currentkph=m_currentspeed*3.14*m_diameter*3.6/500.0;
	UpdateData(FALSE);
	OnSend();
	*pResult = 0;
}

void CMSCommDlg::OnButtonAcc1() 
{
	// TODO: Add your control notification handler code here
//	UpdateData(TRUE);
	if (flag_timer2==TRUE)
	{
		KillTimer(2);
		flag_timer2=FALSE;
	}
	SetTimer(1,3000,NULL);
 	flag_timer1=TRUE;
 		
}

void CMSCommDlg::OnButtonAcc2() 
{
	// TODO: Add your control notification handler code here
//	UpdateData(TRUE);
	if (flag_timer1==TRUE)
	{
		KillTimer(1);
		flag_timer1=FALSE;
	}
	SetTimer(2,3000,NULL);
	flag_timer2=TRUE;
}

void CMSCommDlg::OnTimer(UINT nIDEvent) 
{
	// TODO: Add your message handler code here and/or call default
	UpdateData(TRUE);
	switch(nIDEvent)
	{
	case 1:
		
		if (m_SendSpeed+m_ACCSPEED<20000)
		{
			m_SendSpeed+=m_ACCSPEED;
			m_currentspeed=m_SendSpeed;
			m_currentkph=m_currentspeed*3.14*m_diameter*3.6/500.0;
			UpdateData(FALSE);
			OnSend();		
		} 
		else
		{
			m_SendSpeed=20000;
			m_currentspeed=m_SendSpeed;
			m_currentkph=m_currentspeed*3.14*m_diameter*3.6/500.0;
			UpdateData(FALSE);
			OnSend();
		}
		break;
	case 2:
		
		if (m_SendSpeed-m_ACCSPEED>0)
		{
			m_SendSpeed-=m_ACCSPEED;
			m_currentspeed=m_SendSpeed;
			m_currentkph=m_currentspeed*3.14*m_diameter*3.6/500.0;
			UpdateData(FALSE);
			OnSend();		
		} 
		else
		{
			m_SendSpeed=0;
			m_currentspeed=m_SendSpeed;
			m_currentkph=m_currentspeed*3.14*m_diameter*3.6/500.0;
			UpdateData(FALSE);
			OnSend();
		}
		break;
	 default: 
		 break;

	}


	CDialog::OnTimer(nIDEvent);
}

void CMSCommDlg::OnButtonAccstop() 
{
	// TODO: Add your control notification handler code here
	if (flag_timer1==TRUE)
	{
		KillTimer(1);
		flag_timer1=FALSE;
	}
	if (flag_timer2==TRUE)
	{
		KillTimer(2);
		flag_timer2=FALSE;
	}
}

没用的部分都没贴了。求解答啊。。
hwhaa 2012-12-18
  • 打赏
  • 举报
回复
把代码弄上来看看
wangfeng_35 2012-12-18
  • 打赏
  • 举报
回复
用UpdateData是不是不大保险?有没有可能是它引起的问题?
wangfeng_35 2012-12-18
  • 打赏
  • 举报
回复
引用 5 楼 gdstx 的回复:
内存泄露, 变量不初始化, 句柄没关闭, GDI泄露都可能造成崩溃
变量都初始化了,内存泄漏可能是啥原因?
gdstx 2012-12-18
  • 打赏
  • 举报
回复
内存泄露, 变量不初始化, 句柄没关闭, GDI泄露都可能造成崩溃
wangfeng_35 2012-12-18
  • 打赏
  • 举报
回复
引用 3 楼 tiger9991 的回复:
1.TRACE 2.CFile 记得用宏_LINE_ _FILE_ 返回你代码行数和代码cpp名字
我这程序很奇怪,DEBUG模式下编译链接没错,但就是运行不了,不知道是不是系统问题。 刚查了下TRACE好像只能在DEBUG模式下用。。。 这回岂不悲剧了。
傻X 2012-12-18
  • 打赏
  • 举报
回复
1.TRACE 2.CFile 记得用宏_LINE_ _FILE_ 返回你代码行数和代码cpp名字
wangfeng_35 2012-12-18
  • 打赏
  • 举报
回复
引用 1 楼 tiger9991 的回复:
最好打log日志输出。不然很难定位。 我之前由于系统字体找不到也会无故退出。整你没商量
如何打log日志输出?新人请教下。
傻X 2012-12-18
  • 打赏
  • 举报
回复
最好打log日志输出。不然很难定位。 我之前由于系统字体找不到也会无故退出。整你没商量

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧