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

    xiaoxiao2022-07-12  148

    从零开始的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的东西如下

    串口调试

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

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

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

    串口代码学习

    学习以下两个 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示意图(右上那个控件实际运行时不显示)

    最新回复(0)