码迷,mamicode.com
首页 > 编程语言 > 详细

基于VS2010的MFC串口开发

时间:2016-04-15 22:01:02      阅读:270      评论:0      收藏:0      [点我收藏+]

标签:

近日,项目上需要一个上位机软件来监控串口,同时进行一些信息处理和显示。笔者之前接触过VS的开发,于是边搜索边做,最终完成了项目需求。

下面对开发过程中遇到的问题和关键步骤进行总结。

在整个项目开发过程中参考了如下博文:

http://wenku.baidu.com/link?url=SXkEsiMcpfqhM3IdT5ZZ97aNTmwfO_74dvJoNSWoCp2FIyudzpd1uBSgh2ccFJS6v0bfUaBNeTk--W9W3b9YWt7FloiHeLD6iGHHFewuA8u

1. 串口中断控制

m_mscom.put_CommPort((m_comb1.GetCurSel()+1));  //选择串口

m_mscom.put_InputMode(1);           //设置输入方式为二进制方式

m_mscom.put_Settings(str1);     //波特率为(波特率组á合框)无校验,8数据位,1个停止位

m_mscom.put_InputLen(1024);     //设置当前接收区数据长度为1024

m_mscom.put_RThreshold(1);          //缓冲区一个字符引发事件

m_mscom.put_RTSEnable(1);           //设置RT允许

m_mscom.put_PortOpen(true);     //打开串口

如上,在我的项目中要求是接收6个字符引发中断,故将代码中数字改为6,即:

m_mscom.put_RThreshold(6);          //缓冲区6个字符引发事件

2. 更改初始焦点

在项目开发过程中发现项目运行后,只要按回车键,就会退出。

这个是因为虽然删除了最开始的那个OK确定按键,但是默认初始焦点还是在它上面,故回车键会引发它的事件处理函数,即退出程序。

这里我的处理方法是,在MFC控件界面,ctrl+D,然后界面会变成如下所示:

技术分享

然后,依次点击你想要的焦点顺序。这样再次运行之后,默认的焦点在1上,按tab键可以切换焦点位置。

3. 控件背景色

项目中需要更改控件背景色,执行步骤如下:

首先,在控件界面,右键-->类向导

技术分享

然后,依次选择,消息-->WM_CTLCOLOR-->添加处理程序技术分享

然后在增加的代码里写下如下语句:

HBRUSH C嵌入式物联网系统上位机软件Dlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
HBRUSH hbr = CDialogEx::OnCtlColor(pDC, pWnd, nCtlColor);


pDC->SetBkMode(TRANSPARENT);
HBRUSH B = CreateSolidBrush(RGB(255,0,0));
// TODO:  在此更改 DC 的任何特性
switch (pWnd->GetDlgCtrlID()) 

case IDC_EDIT_Sta1: B = CreateSolidBrush(RGB(255,255,0));
         ……
default: return CDialog::OnCtlColor(pDC,pWnd, nCtlColor);
}
return (HBRUSH) B;
//return hbr;
}

如上,在case语句中便可根据控件的ID来进行颜色的处理。

我这里只更改了控件的背景色,若进行文字色,字体等百度OnctlColor函数即可。

这个函数在系统绘制控件的时候会执行,并更改控件的颜色。假如想要在函数中动态控制控件颜色,则在你需要更改颜色的地方增加如下代码:

CRect rect(25,15,35,40);

InvalidateRect(rect,FALSE);

其作用是更新一个矩形区域内的控件,更新时会调用OnctlColor函数,如此便实现了动态更新控件颜色。另外选择InvalidateRect来进行更新操作的原因是可以避免

更新全部控件时的界面闪烁现象。

4. edit文本框右键菜单的屏蔽

在开发时发现,就算对文本框进行了只读(属性里选择)控制,但是运行时候鼠标选中文本框右键,会弹出一个菜单,里面有复制等一些操作。这个右键菜单是我所不想要的,

于是进行一下步骤类屏蔽这个右键菜单。

在控件界面,右键-->类向导,然后点击添加类右边的选择项,选择MFC类:

技术分享

然后在添加类界面,基类选择CEdit,其余的随便写:

技术分享

这样就继承CEdit类创建了一个新类,然后我们需要重载右键点击事件。

还是在类向导中,选择刚刚创建的类,然后消息-->WM_RBUTTONUP-->添加处理程序技术分享

在重载的OnRButtonUp这个事件处理函数中我们进行如下操作:

void CEDitEx::OnRButtonUp(UINT nFlags, CPoint point)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值

//CEdit::OnRButtonUp(nFlags, point);
}

即将红色部分注释掉。到这就完成了函数的重载工作,接下来将重载过的新类应用到控件中。

选择想要添加变量的文本框,右键-->添加变量

技术分享

点击确定之后,我们找到这个变量的定义的部分(类向导-->成员变量-->编辑代码),如下所示:

private:
CEdit C_Control;

然后我们用刚才新建的类类定义它:

private:

CEDitEX C_Control;

在此运行,发现文本框右键菜单被屏蔽了。

4. 背景色消失

在更改Edit文本框背景色之后,鼠标不断从文本框双方掠过的时候会发生背景色消失的bug。调试之后发现鼠标掠过文本框上方的时候,文本框会变量,即触发了某些事件从而

使文本框变亮,而变亮的操作可能与我们改变背景色的操作有冲突。

这里我的处理办法是将文本框的Disabled属性调为True,这样可以使鼠标掠过的时候不触发事件。

5. 定时器的使用

控件界面-->右键-->类向导-->消息-->WM_TIMER-->添加处理程序

如此便会添加一个定时器到时处理函数,然后

void C嵌入式物联网系统上位机软件Dlg::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
CRect rect(25,15,35,40);
switch(nIDEvent)
{
case 1:if(sta[1]==2){sta[1]=1;m_Edit_Sta1 = "断开连接";UpdateData(false);}break;
case 2:if(sta[2]==2){sta[2]=1;m_Edit_Sta2 = "断开连接";UpdateData(false);}break;
……
default :;
}
InvalidateRect(rect,FALSE);
CDialogEx::OnTimer(nIDEvent);
}

在case语句中可以添加对定时器到时的操作。

在需要开始计时的地方添加:

SetTimer(1,15000,NULL);

如上所示,便添加了一个标号为1,时长为15秒的计时器,15秒之后便会触发OnTimer函数。

6. 更改文本框的值

这个在上面的链接中有介绍到具体操作,就是往文本框添加一个Value类型的变量,而后更改此变量的值,调用UpdateData(false);即可。

基于VS2010的MFC串口开发

标签:

原文地址:http://blog.csdn.net/xing414736597/article/details/51162848

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!