基于VS2010的MFC串口开发

近日,项目上需要一个上位机软件来监控串口,同时进行一些信息处理和显示。笔者之前接触过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);即可。

  • 4
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
VS2010中,我们可以使用MFC(Microsoft Foundation Classes)来编写一个串口调试助手。MFC是Microsoft为开发Windows应用程序提供的一套C++类库,它提供了许多用于简化Windows编程的功能和工具。 首先,我们需要创建一个新的MFC应用程序项目。在创建项目时,选择“SDI(Single Document Interface)”类型,这样我们就可以创建一个包含单个文档视图的应用程序。 接下来,我们需要在应用程序中添加一些控件来实现串口调试的功能。可以添加一个按钮用于打开/关闭串口,一个下拉框用于选择串口号,一个文本框用于显示接收到的数据,以及一个文本框用于发送数据。 在代码中,我们需要包含相关的头文件,如“afxwin.h”和“afxext.h”。然后,在主窗口类中添加成员变量来存储串口的句柄和配置参数。另外,我们还需要添加一些成员函数来处理串口的打开/关闭,接收和发送数据等操作。 打开串口按钮的点击事件处理函数中,我们可以使用Windows API中的“CreateFile”函数来打开串口,并设置相应的配置参数。关闭串口按钮的点击事件处理函数中,我们则可以使用“CloseHandle”函数关闭串口。 在接收数据的函数中,我们可以使用“ReadFile”函数来从串口读取数据,并将接收到的数据显示在文本框中。而发送数据的函数可以使用“WriteFile”函数将数据发送到串口。 除了上述基本功能之外,我们还可以添加一些其他的功能,如清除接收数据的按钮、保存接收数据到文件、发送自定义数据等。 通过以上的步骤,我们就可以在VS2010中使用MFC编写一个基于串口的调试助手了。这个调试助手可以实现打开/关闭串口、接收和发送数据等基本功能,为串口调试提供了便利。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值