从零开始的MFC实现串口输出(MFC初上手+串口上手)

从零开始的MFC实现串口输出

  • 吐槽
  • 环境
  • 配置
  • 学习基本的mfc控件操作,编辑方法
    • 声明变量及绑定
    • 编码
  • 串口
    • 串口调试
  • 串口代码学习

吐槽

本文是一个实际项目的我负责的一小部分,由于投标了甲方没有采取,所以就扔到龙腾杯拿了个一等奖,,当然我们几个学生也就是刚接触,肯定没有别的竞争者做得好,,

环境

使用安装VC++的VS IDE,本人用的VisualStudio2015(需要自定义安装,勾选VC++选项)
本案例使用C++语言
本人有java基础,没有接触过C++
需要面向对象思想以及会基本的使用方法,变量
了解C++ 头文件.h用于声明和定义 .cpp文件用于实现(新建一个看看大概就知道了)

配置

参考Vs2015 com串口编程Mscomm控件导入(基于win7/win10 64位):
https://blog.csdn.net/youxishaonian/article/details/52590316
备注:命令行中 cd(空格)绝对路径(从资源管理器复制即可)
来定位
若出错考虑在syswow64中注册:
https://blog.csdn.net/llllllllll4er5ty/article/details/76798195

学习基本的mfc控件操作,编辑方法

新建的项目(选择对话框)
工具箱中可拖出控件
工具箱没有:视图-工具箱
没有对话框:资源视图-项目-.rc-Dialog-…_DIALOG
对常用的:button edit control static text 尝试,学习,右下角有具体属性框自己试试,,,

声明变量及绑定

建议把控件先放到位
对每个控件,属性中改变ID(命名)
然后
随便哪里右击-类向导,类名选好当前项目名+Dlg的类,-成员变量
其中像长方体的是已经绑定,黑框+的是未绑定,
选择控件,添加变量
注意
变量类型(对于value一定要注意) 你之后用到的值的类型
类别 控制control型还是值value型
设置变量名(随意)
完成以后对于要写代码的控件双击,自动生成方法框架,如果仅仅是文字输入之类不需要操作的框可以不用
一旦完成添加变量或者双击,值或者方法就被声明了,如果要删除需要在.h和.cpp中手动删除

编码

对于每个需要读取、改变MFC界面上的值的方法,都需要用
UpdateData(TRUE);
代码
UpdateData(FALSE);
意思是更新(读取,输出)各个值

串口

串口的硬件得自己买,,
我们用的是一个像u盘两头usb的东西如下
从零开始的MFC实现串口输出(MFC初上手+串口上手)_第1张图片

串口调试

下载串口调试助手和虚拟串口软件
本人用串口调试助手sscom32
可以多开,一个测试发送一个测试接收
以及虚拟串口软件Configure Virtual Serial Port Driver
add pair:本机上加入虚拟串口对,互相发送,接收,建议使用5-16串口号 过小的本机已经使用,大的在调用方法时好像设置不成功
可以在电脑右键管理-设备管理器-端口看到已经使用或者模拟的

测试:
串口调试助手设置好端口,波特率那一列就可以测试了
注意发送有两种,二进制型(Hex代表十六进制,就用它)与string型,同样的文本它们发送不同形态,本例都用hex型
接收的那个窗口打开、取消hex型可以看到其中差别
设置好后输入点什么东西然后发送就行了
(下面图里懒得模拟串口然后再设置了)

从零开始的MFC实现串口输出(MFC初上手+串口上手)_第2张图片

编程应该一边调试一边进行,所有先介绍串口调试。

串口代码学习

学习以下两个
https://blog.csdn.net/liangzhao_jay/article/details/45647229
里面有各种方法
https://blog.csdn.net/u011311985/article/details/51279740
里面有收发数据的方法但是缺少头文件,建议自己开项目在一个一个研究里面方法
本项目只用到了发送,所以没有仔细研究收,也不知道里面表格显示数据是什么操作

以下是设置配置,如果不需要在界面内改变可以在初始化的时候加载

void CButtonSendDlg::makeSure()
{
	if (m_mscomm.get_PortOpen())//如果是打开的,则关闭
	{
		m_mscomm.put_PortOpen(FALSE);
	}
	m_mscomm.put__CommPort(port);//选择串口
	m_mscomm.put_InputLen(0);//设置当前接受去数据长度为0,表示全部读取
	m_mscomm.put_InputMode(1);//以二进制方式读写数据
	m_mscomm.put_RThreshold(1);//接收缓冲区有1个及以上字符时,将响应接收数据事件
	m_mscomm.put_OutBufferSize(2048);
	m_mscomm.put_Settings(_T("115200,n,8,1"));
	//m_mscomm.put_Settings(setting);//波特率、校验位、数据位、停止位
	m_mscomm.put_PortOpen(TRUE);
}

需要设置CByteArray类型的发送数据流
对于数字型数据,进制只是表达方式,其值是不变的
本例,商家给出的数据流是 指令长度固定为20个字节, 二十段每段两个hex型数据,如
实例: E0 F5 02 06 01 00 64 FA 00 00 00 00 00 00 00 00 00 00 00 00;鼠标光标向上移动100 (00 64)个像素点
由于这个类型add方法就是加入两位hex型(多余的会取低位舍弃高位)
所以一个一个加入
本方法中moveX,moveY是十进制位移数据,与编辑框绑定,输入十进制数字确定就移动那么多像素点
上下左右移动中数据流 位移值有四位,上两位用 数值/(16^2) 获得,下两位自动截取

void CButtonSendDlg::OnBnClickedDomove()//先上下移动再左右移动
{
	// TODO: 在此添加控件通知处理程序代码
	UpdateData(TRUE);
	makeSure();
	//上下
	CByteArray my;
	my.Add(0xE0);
	my.Add(0xF5);
	my.Add(0x02);
	my.Add(0x06);
	if (moveY < 0) {
		my.Add(0x01);
		my.Add(-moveY / 256);
		my.Add(-moveY);
	}
	else {
		my.Add(0x02);
		my.Add(moveY / 256);
		my.Add(moveY);
	}
	my.Add(0xFA);
	for (int i = 0; i < 12; i++)
	{
		my.Add(0x00);
	}
	m_mscomm.put_Output(COleVariant(my));

	CByteArray mx;
	mx.Add(0xE0);
	mx.Add(0xF5);
	mx.Add(0x02);
	mx.Add(0x06);
	if (moveX < 0) {
		mx.Add(0x03);
		mx.Add(-moveX / 256);
		mx.Add(-moveX);
	}
	else {
		mx.Add(0x04);
		mx.Add(moveX / 256);
		mx.Add(moveX);
	}
	mx.Add(0xFA);
	for (int i = 0; i < 12; i++)
	{
		mx.Add(0x00);
	}
	m_mscomm.put_Output(COleVariant(mx));
	UpdateData(FALSE);
}

同理,依据商家给的开发资料(输出标准)KM指令集
可以设置模拟鼠标键盘的各种指令,并做成方法(方便调用)
既然是标准IO,买的不同串口设备使用的数据流应该是一样的,应该也可以模拟所有usb输入的东西,甚至可以传文件?

本demo示意图(右上那个控件实际运行时不显示)
从零开始的MFC实现串口输出(MFC初上手+串口上手)_第3张图片

你可能感兴趣的:(MFC,串口输出)