(转载)用vs2010开发基于VC++的MFC 串口通信一*****两台电脑同一个串口号之间的通信

此文章以visual C++数据采集与串口通信测控应用实战为参考教程

此文章适合VC++串口通信入门

一、页面布局及添加控件

1, 安装好vs2010如图


2, 新建一个基于VC++的MFC项目comm


注意:点击ok,然后next,这时候要将application type改成dialog base,接着next到最后一个对话框是将generated dasses改成CcommDlg,然后finish


4, 将新生成的项目的对话框默认dialog edit删去,如图


5,在对话框中添加两个static text,两个edit text,两个按钮,

成品图如下


6,添加comm控件

    1)在解决方案窗口右击新建的解决方案,点击add->class

     2)选择MFC class from activex control如图


点击add,available activex controls选择microsoft communication controls versions 6.0,然后点确定就行

这时候对话框会出现一个电话图标,可能有一半白边去不了,这时候右击电话图标点击edit control就可以去掉了。

7,同时定义各个控件的类型、ID及相关属性


注:此项目只添加了发送和退出程序按钮

这时候得到了完整的串口通信对话框:


8, 添加成员变量,右击对话框,点击class wizard,点击member variables标签,选中需要添加的id,双击即可添加

依次为下表中的ID添加变量


期间,IDC_MSCOMM1控件在标签中没有,则在生成的对话框中右击comm控件点击add variables即可

9, 为mscomm,两个button添加响应事件,切换到class wizard的virtual function双击控件ID,添加响应事件,默认即可,也可改为自己想要的标题

为comm控件添加响应事件可能双击不了(我就是遇到这种问题),这时候只要右击comm控件图标,点击add event handler即可。如图



这时候基本界面已经布置好了,开始添加代码了。

二、代码添加

1、找到解决方案(solution explorer)的sources files点开,双击其中的mscommDlg.cpp我们的所有代码将添加到这个源文件中

2、进行串口初始化及其他串口设置

将以下代码添加到oninitialdialog函数

m_ctrlcomm.put_CommPort(3);//选择com3口
m_ctrlcomm.put_InputMode(1);//输入方式为二进制方式
m_ctrlcomm.put_InBufferSize(1024);//输入缓冲区大小为1024byte
m_ctrlcomm.put_OutBufferSize(512);//输出缓冲区大小为512byte
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//设置串口参数:9600波特率,无奇偶校验,8个数据位,1个停止位
if(!m_ctrlcomm.get_PortOpen())
    m_ctrlcomm.put_PortOpen(1);//打开串口
m_ctrlcomm.put_RThreshold(1);//每当串口接收缓冲区有多余或等于1个字符时将引发一个接收数据的oncomm事件
m_ctrlcomm.put_InputLen(0);//设置当前接收区数据长度为0
m_ctrlcomm.get_Input();//预读缓冲区以清空残留数据

m_ctrlcomm.put_CommPort(3);//选择com3口
m_ctrlcomm.put_InputMode(1);//输入方式为二进制方式
m_ctrlcomm.put_InBufferSize(1024);//输入缓冲区大小为1024byte
m_ctrlcomm.put_OutBufferSize(512);//输出缓冲区大小为512byte
m_ctrlcomm.put_Settings(_T("9600,n,8,1"));//设置串口参数:9600波特率,无奇偶校验,8个数据位,1个停止位
if(!m_ctrlcomm.get_PortOpen())
    m_ctrlcomm.put_PortOpen(1);//打开串口
m_ctrlcomm.put_RThreshold(1);//每当串口接收缓冲区有多余或等于1个字符时将引发一个接收数据的oncomm事件
m_ctrlcomm.put_InputLen(0);//设置当前接收区数据长度为0
m_ctrlcomm.get_Input();//预读缓冲区以清空残留数据
2、实现发送按钮,退出按钮相应的响应函数

void CmscommDlg::OnBnClickedOk()
{
// TODO: Add your control notification handler code here
CDialogEx::OnOK();
UpdateData(1);//读取编辑框内容
m_ctrlcomm.put_Output(COleVariant(m_strsend));//发送数据
}




void CmscommDlg::OnBnClickedExit()
{
// TODO: Add your control notification handler code here
m_ctrlcomm.put_PortOpen(0);//关闭串口
CDialog::OnCancel();//退出程序
}
3、实现MSComm控件相应的响应函数OnOnCommMsComm1()

VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];//设置byte数组
CString strtemp;
if(m_ctrlcomm.get_CommEvent()==2)//事件2表示接受缓冲区有字符
{
variant_inp=m_ctrlcomm.get_Input();//读缓冲区
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型变量
BYTE bt=*(char *)(rxdata+k);//字符型
strtemp.Format((char) bt);//将字符送入临时变量strtemp存放
m_strreceive+=strtemp;//加入接收编辑框相应字符串
}
}
UpdateData(0);//更新编辑框内容

4、编译运行程序

在调试运行时,必须两台机子同时运行此程序,并且都要开启同一个串口号

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
提供的源码资源涵盖了Java应用等多个领域,每个领域都包含了丰富的实例和项目。这些源码都是基于各自平台的最新技术和标准编写,确保了在对应环境下能够无缝运行。同时,源码中配备了详细的注释和文档,帮助用户快速理解代码结构和实现逻辑。 适用人群: 适合毕业设计、课程设计作业。这些源码资源特别适合大学生群体。无论你是计算机相关专业的学生,还是对其他领域编程感兴趣的学生,这些资源都能为你提供宝贵的学习和实践机会。通过学习和运行这些源码,你可以掌握各平台开发的基础知识,提升编程能力和项目实战经验。 使用场景及目标: 在学习阶段,你可以利用这些源码资源进行课程实践、课外项目或毕业设计。通过分析和运行源码,你将深入了解各平台开发的技术细节和最佳实践,逐步培养起自己的项目开发和问题解决能力。此外,在求职或创业过程中,具备跨平台开发能力的大学生将更具竞争力。 其他说明: 为了确保源码资源的可运行性和易用性,特别注意了以下几点:首先,每份源码都提供了详细的运行环境和依赖说明,确保用户能够轻松搭建起开发环境;其次,源码中的注释和文档都非常完善,方便用户快速上手和理解代码;最后,我会定期更新这些源码资源,以适应各平台技术的最新发展和市场需求。 所有源码均经过严格测试,可以直接运行,可以放心下载使用。有任何使用问题欢迎随时与博主沟通,第一时间进行解答!

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值