MFC VS2017 串口 MScomm控件 用法

开始

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#include "CMSComm.h"

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

常规界面

在这里插入图片描述

IDC_EDIT_RXDATA()                          CString m_sRXDATA;

IDC_EDIT_TXDATA()                          CString m_sTXDATA;

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

SerialMscommTestDlg.h:

// SerialMscommTestDlg.h: 头文件
//

#pragma once
#include "CMSComm.h"

// CSerialMscommTestDlg 对话框
class CSerialMscommTestDlg : public CDialogEx
{
// 构造
public:
	CSerialMscommTestDlg(CWnd* pParent = nullptr);	// 标准构造函数

// 对话框数据
#ifdef AFX_DESIGN_TIME
	enum { IDD = IDD_SERIALMSCOMMTEST_DIALOG };
#endif

	protected:
	virtual void DoDataExchange(CDataExchange* pDX);	// DDX/DDV 支持


// 实现
protected:
	HICON m_hIcon;

	// 生成的消息映射函数
	virtual BOOL OnInitDialog();
	afx_msg void OnPaint();
	afx_msg HCURSOR OnQueryDragIcon();
	DECLARE_MESSAGE_MAP()
public:
	CMSComm m_mscomm;
	CComboBox m_comboCom;
	CString m_sRXDATA;
	CString m_sTXDATA;
	afx_msg void OnBnClickedBtnCleanUp();
	afx_msg void OnBnClickedBtnSend();
	afx_msg void OnBnClickedBtnOpen();
	DECLARE_EVENTSINK_MAP()
	void OnOncommMscomm1();
};

SerialMscommTestDlg.cpp

// SerialMscommTestDlg.cpp: 实现文件
//

#include "stdafx.h"
#include "SerialMscommTest.h"
#include "SerialMscommTestDlg.h"
#include "afxdialogex.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CSerialMscommTestDlg 对话框



CSerialMscommTestDlg::CSerialMscommTestDlg(CWnd* pParent /*=nullptr*/)
	: CDialogEx(IDD_SERIALMSCOMMTEST_DIALOG, pParent)
	, m_sRXDATA(_T(""))
	, m_sTXDATA(_T(""))
{
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}

void CSerialMscommTestDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialogEx::DoDataExchange(pDX);
	DDX_Control(pDX, IDC_MSCOMM1, m_mscomm);
	DDX_Control(pDX, IDC_COMBO_COM, m_comboCom);
	DDX_Text(pDX, IDC_EDIT_RXDATA, m_sRXDATA);
	DDX_Text(pDX, IDC_EDIT_TXDATA, m_sTXDATA);
}

BEGIN_MESSAGE_MAP(CSerialMscommTestDlg, CDialogEx)
	ON_WM_PAINT()
	ON_WM_QUERYDRAGICON()
	ON_BN_CLICKED(IDC_BTN_CLEAN_UP, &CSerialMscommTestDlg::OnBnClickedBtnCleanUp)
	ON_BN_CLICKED(IDC_BTN_SEND, &CSerialMscommTestDlg::OnBnClickedBtnSend)	
	ON_BN_CLICKED(IDC_BTN_OPEN, &CSerialMscommTestDlg::OnBnClickedBtnOpen)
END_MESSAGE_MAP()


// CSerialMscommTestDlg 消息处理程序

BOOL CSerialMscommTestDlg::OnInitDialog()
{
	CDialogEx::OnInitDialog();

	// 设置此对话框的图标。  当应用程序主窗口不是对话框时,框架将自动
	//  执行此操作
	SetIcon(m_hIcon, TRUE);			// 设置大图标
	SetIcon(m_hIcon, FALSE);		// 设置小图标

	// TODO: 在此添加额外的初始化代码

	return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE
}

// 如果向对话框添加最小化按钮,则需要下面的代码
//  来绘制该图标。  对于使用文档/视图模型的 MFC 应用程序,
//  这将由框架自动完成。

void CSerialMscommTestDlg::OnPaint()
{
	if (IsIconic())
	{
		CPaintDC dc(this); // 用于绘制的设备上下文

		SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0);

		// 使图标在工作区矩形中居中
		int cxIcon = GetSystemMetrics(SM_CXICON);
		int cyIcon = GetSystemMetrics(SM_CYICON);
		CRect rect;
		GetClientRect(&rect);
		int x = (rect.Width() - cxIcon + 1) / 2;
		int y = (rect.Height() - cyIcon + 1) / 2;

		// 绘制图标
		dc.DrawIcon(x, y, m_hIcon);
	}
	else
	{
		CDialogEx::OnPaint();
	}
}

//当用户拖动最小化窗口时系统调用此函数取得光标
//显示。
HCURSOR CSerialMscommTestDlg::OnQueryDragIcon()
{
	return static_cast<HCURSOR>(m_hIcon);
}



void CSerialMscommTestDlg::OnBnClickedBtnCleanUp()
{
	// TODO: 在此添加控件通知处理程序代码

}


void CSerialMscommTestDlg::OnBnClickedBtnSend()
{
	// TODO: 在此添加控件通知处理程序代码

	UpdateData(TRUE);
	m_mscomm.put_Output(COleVariant(m_sTXDATA));//发送数据
}



void CSerialMscommTestDlg::OnBnClickedBtnOpen()
{
	// TODO: 在此添加控件通知处理程序代码

	if (m_mscomm.get_PortOpen())
	{
		m_mscomm.put_PortOpen(FALSE);
	}
	m_mscomm.put_CommPort(2);				//选择com2,可以根据具体情况更改
	m_mscomm.put_InBufferSize(1024);			//设置输入缓冲区的大小,Bytes
	m_mscomm.put_OutBufferSize(1024);		//设置输出缓冲区的大小,Bytes
	m_mscomm.put_Settings(_T("9600,n,8,1")); //波特率9600,无校验,8个数据位,停止位1
	m_mscomm.put_InputMode(1);				//1:表示以二进制方式检索数据
	m_mscomm.put_RThreshold(1);				//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件
	m_mscomm.put_InputLen(0);				//设置当前接收区长度是0
	if (!m_mscomm.get_PortOpen())
	{
		m_mscomm.put_PortOpen(TRUE);
	}
	else
	{
		AfxMessageBox(_T("Can not open serial port!"));
	}
	m_mscomm.get_Input();					//先预读缓冲区以清除残留数据
	UpdateData(FALSE);
	
}
BEGIN_EVENTSINK_MAP(CSerialMscommTestDlg, CDialogEx)
	ON_EVENT(CSerialMscommTestDlg, IDC_MSCOMM1, 1, CSerialMscommTestDlg::OnOncommMscomm1, VTS_NONE)
END_EVENTSINK_MAP()


void CSerialMscommTestDlg::OnOncommMscomm1()
{
	// TODO: 在此处添加消息处理程序代码
	VARIANT variant_inp;
	COleSafeArray safearray_inp;
	LONG len, k;
	BYTE rxdata[2048];
	CString strtemp;
	if (m_mscomm.get_CommEvent() == 2)		//事件值为2表示缓冲区内有字符
	{
		variant_inp = m_mscomm.get_Input();	//读缓冲区
		safearray_inp = variant_inp;		//VARIANT型变量转换为ColeSafeArray型变量
		//len = safearray_inp.GetDim();		//得到有效数据长度
		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(_T("%c"), bt);	//将字符送入临时变量strtemp存放
			m_sRXDATA += strtemp;			//接收到的数据放到编辑框对应的变量中
		}
	}
	SetDlgItemText(IDC_EDIT_RXDATA, m_sRXDATA);

}

测试

vspd
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

20160426 VC++(VS2013)串口编程图文教程(MSComm的使用)
https://blog.youkuaiyun.com/KevinHuang2088/article/details/51249858

虚拟串口 vspd

https://www.eltima.com/vspd-post-download.html

在这里插入图片描述

visual studio vs2017 建立工程

最后COCX m_Mscomm;
需要改为CMSComm m_Mscomm;

最后DDX_Control(pDX, IDC_MSCOMM_UART, DISPID(), m_Mscomm);
需要改为DDX_Control(pDX, IDC_MSCOMM_UART, m_Mscomm);

https://blog.youkuaiyun.com/PlayingYY/article/details/104431743

1

将此文件放置到默认的执行目录即可。以WIN7 64位为例放置在C:\WINDOWS\syswow64,然后执行注册指令。

Regsvr32 C:\WINDOWS\syswow64\MSCOMM32.OCX
需要注意的是,默认的库最多只能支持的串口号为0x10, 通过修改MSCOMM32.OCX,可以改为0xFF的上限
修改位置为找到 "3f 66 3D 10 "改为"3f 66 3D ff "即可。
在这里插入图片描述

源码:

https://download.youkuaiyun.com/download/wowocpp/34664453

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值