找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 3722|回复: 19

在VS2013下编写基于MSCOMM的MFC串口通讯程序

 火... [复制链接]
  • 打卡等级:即来则安
  • 打卡总天数:29
  • 打卡月天数:1
  • 打卡总奖励:7791
  • 最近打卡:2025-12-13 17:25:16

2540

主题

1355

回帖

2万

积分

管理员

积分
21304
发表于 2021-2-14 22:59:43 | 显示全部楼层 |阅读模式
VS2013,串口程序编写和调试;参照网文,整理。
开发环境: VS2013
串口控件
电脑:win7,32版本
准备:
· 1、下载串口控件:
链接:http://pan.baidu.com/s/1geD2AUf 密码:yfxo
压缩包包含四个文件:MSCOMM.SRG、MSCOMM32.DEP、MSCOMM32.oca、mscomm32.ocx;
解压后拷贝到:
C:\Windows\System32(WIN7、Win8、Win10系统);
C:\WINDOWS\system32(XP系统)。
注意:64位win7、8、10系统还需要将mscomm32.ocx文件复制到C:\Windows\SysWOW64\目录下,否则后面注册会出错。

2、在C:\Windows\System32里找到cmd.exe以管理员身份运行:
Regsvr32 C:\WINDOWS\system32\MSCOMM32.OCX
注册成功如图所示:

3、修改注册表:win+R组合键打开“运行”或者直接在开始菜单里找到“运行”;输入regedit后回车,打开注册表管理器,在其中找到HKEY_CLASSES_ROOT项下的Licenses项,添加主项命名为“4250E830-6AC2-11cf-8ADB-00AA00C00905”,并将键值修改为“kjljvjjjoquqmjjjvpqqkqmqykypoqjquoun”
4、新建MFC工程:在VS 2013中新建一个MFC项目,比如基于对话框的一个项目
5、添加MSComm控件:在对话框上右击选择“打开ActiveX控件”,英文版“InsertActiveX Control”找到Microsoft Communications Control,version 6.0,此时在对话框中出现一个电话一下的按钮,这个就是MSComm控件,软件运行时是看不见的

6、按你需要的,添加对话框控件:
7、在电话控件上添加映射变量;完成后, 在工程中会自动生成mscomm.h 和mscomm.cpp两个文件;
8、在串口控件上右键,添加控件事件处理函数:









11、打开串口按钮回调函数编写:
CString portnums = _T("0");//定义串口编号,默认值串口编号为0
void Cport_demonstrationDlg::OnBnClickedBottonOpen()
{
// TODO: 在此添加控件通知处理程序代码
Edit.GetWindowText(portnums);//获取编辑框中的串口编号
int flag = _ttoi(portnums);//将其转化为数值类型
if (flag)//如果输入的串口编号为正整数,才执行下列命令
{
if (m_mscomm.get_PortOpen())
{
m_mscomm.put_PortOpen(FALSE);
}
m_mscomm.put_CommPort(flag); //选择COM
m_mscomm.put_InBufferSize(1024); //接收缓冲区
m_mscomm.put_OutBufferSize(1024);//发送缓冲区
m_mscomm.put_InputLen(0);//设置当前接收区数据长度为0,表示全部读取
m_mscomm.put_InputMode(1);//以二进制方式读写数据
m_mscomm.put_RThreshold(1);//接收缓冲区有1个及1个以上字符时,将引发接收数据的OnComm
m_mscomm.put_Settings(_T("9600,n,8,1"));//波特率9600无检验位,8个数据位,1个停止

if (!m_mscomm.get_PortOpen())//如果串口没有打开则打开
{
m_mscomm.put_PortOpen(TRUE);//打开串口
AfxMessageBox(_T("串口打开成功"));
}
else
{
m_mscomm.put_OutBufferCount(0);
AfxMessageBox(_T("串口打开失败"));
}
}
else
{
AfxMessageBox(_T("请先输入需要打开串口编号"));
}
}
12、关闭按钮回调函数编写:
void Cport_demonstrationDlg::OnBnClickedBottonClose()
{
// TODO: 在此添加控件通知处理程序代码
m_mscomm.put_PortOpen(FALSE);//关闭串口
AfxMessageBox(_T("串口已关闭"));

}
13、发送数据按钮回调函数实现:
void Cport_demonstrationDlg::OnBnClickedBottonSend()
{
// TODO: 在此添加控件通知处理程序代码
UpdateData(true); //读取编辑框内容
m_mscomm.put_Output(COleVariant(m_EditSend));//发送数据
m_EditSend.Empty(); //发送后清空输入框
UpdateData(false); //更新编辑框内容

}
14、接收数据按钮回调函数编写(写在串口事件处理程序里面):
void Cport_demonstrationDlg::OnCommMscomm1()
{
// TODO: 在此处添加消息处理程序代码
static unsigned int cnt = 0;
VARIANT variant_inp;
COleSafeArray safearray_inp;
long len, k;
unsigned int data[1024] = { 0 };
byte rxdata[1024]; //设置 BYTE 数组
CString strtemp;
if (m_mscomm.get_CommEvent() == 2) //值为 2 表示接收缓冲区内有字符
{
cnt++;
variant_inp = m_mscomm.get_Input(); //读缓冲区消息
safearray_inp = variant_inp; ///变量转换
len = safearray_inp.GetOneDimSize(); //得到有效的数据长度
for (k = 0; k<len; k++)
{
safearray_inp.GetElement(&k, rxdata + k);
}
for (k = 0; k<len; k++) //将数组转换为 CString 型变量
{
strtemp.Format(_T("%c"), *(rxdata + k));
m_EditReceive += strtemp;
CString temp = _T("\r\n"); //换行
m_EditReceive += temp;
}
}
UpdateData(FALSE); //更新编辑框内容
}

工控课堂 www.gkket.com

0

主题

296

回帖

1149

积分

中级会员

积分
1149
发表于 2021-2-15 03:10:57 | 显示全部楼层
加油,加油,不要沉下去,我是最热贴
工控课堂 www.gkket.com

0

主题

98

回帖

428

积分

注册会员

积分
428
发表于 2021-2-15 09:19:18 | 显示全部楼层
好东西一定要看看!
工控课堂 www.gkket.com

0

主题

90

回帖

148

积分

新手上路

积分
148
发表于 2025-11-13 20:37:42 | 显示全部楼层
评论区人才辈出,笑到停不下来😂
工控课堂 www.gkket.com

0

主题

105

回帖

276

积分

注册会员

积分
276
发表于 2025-11-13 21:36:41 | 显示全部楼层
楼主太会说了,字字句句都在理~
工控课堂 www.gkket.com

0

主题

103

回帖

326

积分

注册会员

积分
326
发表于 2025-11-13 22:09:54 | 显示全部楼层
说得对!狠狠赞同,没毛病~
工控课堂 www.gkket.com

0

主题

163

回帖

379

积分

注册会员

积分
379
发表于 2025-11-13 23:51:52 | 显示全部楼层
楼主辛苦啦,期待下一篇分享
工控课堂 www.gkket.com

0

主题

531

回帖

2056

积分

高级会员

积分
2056
发表于 2025-11-14 00:02:22 | 显示全部楼层
楼主太会说了,字字句句都在理
工控课堂 www.gkket.com

0

主题

85

回帖

127

积分

新手上路

积分
127
发表于 2025-11-14 00:11:26 | 显示全部楼层
内容太顶了!疯狂点赞,已默默收藏~
工控课堂 www.gkket.com

0

主题

84

回帖

124

积分

新手上路

积分
124
发表于 2025-11-14 01:17:54 | 显示全部楼层
原来还有这种操作,长见识了!
工控课堂 www.gkket.com
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

站长推荐上一条 /1 下一条

QQ|手机版|免责声明|本站介绍|工控课堂 ( 沪ICP备20008691号-1 )

GMT+8, 2025-12-22 18:57 , Processed in 0.120881 second(s), 26 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表