最近需要给一个肌电模块做一个信号接收和看波形的GUI,没学过C#也不想用processing之类的工具,想着用mfc做一个

出来。需求是通过串口接收数据。

首先下载Mscomm.ocx和Mscomm.dep两个文件,放入SysWOW64文件夹(32位系统放sys32不用多说)。接着需要以管理员权限进cmd,

命令regsvr32mscomm32.ocx进行注册。可以直接找SysWOW64文件夹下的cmd.exe打开,对win7来说方便一些。

mfc的GUI还是挺好写的。核心是在控件工具箱中右键->选择项->COM组件->MicrosoftCommunications Control勾选后确定

这样,工具箱中就出现了一个小电话

就是我们要用的串口控制控件。拖进对话框里,看着很碍眼,但其实运行时是透明的。给他添加变量,类默认选择CMscomm1。各种读写和打开关闭串口的函数都在这个类里。

CMscomm1中的成员函数分为两类,一类put前缀,一类get前缀。put前缀指发送,设置等主动功能,get指读取,查看等操作。例如put_PortOpen(int n)函数是打开串口COMn(听说n>10会出bug),get_PortOpen()是返回打开的串口号。

重点并不在于CMscomm1的函数怎么用,最坑的地方是读写数据的格式。get_Input()函数读回来的格式是VARIANT,这种神奇的格式可以代表char,string,int,short,long以及他们的一二级指针和数组类型。这大概是为了让c和matlab,python这些类型不强的语言交互吧…但是mfc自己用起来相当智熄。

VARIANT get_Input(){VARIANTresult;InvokeHelper(0x1a,DISPATCH_PROPERTYGET, VT_VARIANT, (void*)&result, NULL);returnresult;
}

因为VARIANT变量不是c标准库中的类型,因此调试的时候会涉及一大堆奇怪的dll(还有各种连接符号服务器…),对我这种渣渣来说基本是没法看懂他的单步过程的。所以格式转换就非常玄学。

VARIANT这种类型,从其定义来看,能看懂他的初衷。他是一个结构体,其中有许多类型的成员变量。大概就是variant.iVal代表对应的short,variant.intVal代表对应的int,variant.cVal代表对应的char等等。

我的目的是将get_Input()的结果转换为CString输出到一个Edit框中,而向PC发串口消息的下位机是以BYTE类型发送的数字(也就是16位ASCII码的二进制电平)。在网上找了一些别人的代码,主要有两种。一种是用safearray进行中继,转换为BYTE数组。

variant_inp= m_ctrlComm.get_Input();safearray_inp = variant_inp;len= safearray_inp.GetOneDimSize();for(k = 0; k < len; k++){safearray_inp.GetElement(&k,&temp);strTemp.Format(_T("%c"),temp);RX_Display+= strTemp;}

但是实际运行时,走到safearray_inp=variant_inp这步之后就直接跳出了,在len=下的断点根本断不到。可能冷门的类型是缺一些调试文件吧。最后RX_Display的监视结果是无法读取。

另一种转换方式稍微靠谱一些

variant_inp= m_ctrlComm.get_Input();char *ch = (char*)(unsigned char*)variant_inp.parray->pvdata;

但是Format转出来,不论是用%d%c%s要不然是一些韩文,奇怪的汉字,要不然就是一串数字(其中有一种可以把发送的第七个BYTE正确传输。。。也就是发送0000004可以收到4)。最后各种组合尝试了一遍,发现这样能够正确传输一个BYTE

variant_inp= m_ctrlComm.get_Input();char*ch = (char*)variant_inp.parray;RX_Display.Format(_T("%s"),ch);

但是这样只能收到一串数,没法满足我发送两位数三位数的需求。最后只能通过订传输协议解决

variant_inp= m_ctrlComm.get_Input();char*ch = (char*)variant_inp.parray;RX_Display.Format(_T("%s"),ch);RX_Display= RX_Display.Mid(RX_Display.Find('<') + 1);RX_Display= RX_Display.Left(RX_Display.Find('>'));

让RX_Display把<>中的数字取出来,但会造成一些数据的丢失。

**1月28日补充:今天打开程序想添加发送功能,结果发现前面改着改着又接不到数据了。折腾了一小时,总算恢复正常。需要补充一条:在使用本文最后给出的方法接收数据时,一定要在串口初始化时,设置put_InputMode(0),也就是用文本方式接收数据,否则接收不到正常的东西。put_InputMode这句也可以不写,默认是文本方式

Mscomm32使用记录相关推荐

  1. mysql建立联合索引,mysql建立唯一键,mysql如何解决重复记录联合索引

    在项目中,常常要用到联合唯一   在一些配置表中,一些列的组合成为一条记录.   比如,在游戏中,游戏的分区和用户id会形成一条记录.(比如,一个qq用户可以在艾欧尼亚.德玛西亚创建两个账号) 添加联 ...

  2. 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?

    现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到排行榜 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面 ...

  3. 记录一次http请求失败的问题分析

    问题背景 当前我有一个基于Flask编写的Restful服务,由于业务的需求,我需要将该服务打包成docker 镜像进行离线部署,原始服务的端口是在6661端口进行开启,为了区分,在docker中启动 ...

  4. Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)

    Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...

  5. LeetCode简单题之学生出勤记录 I

    题目 给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent,缺勤 'L':Late,迟到 'P':Pre ...

  6. 关于TVM的点滴记录

    关于TVM的点滴记录

  7. MySql数据库Update批量更新与批量更新多条记录的不同值实现方法

    批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...

  8. 记录篇,自己在项目中使用过的。

    图片选择器,6.0已经适配过,类似qq空间上传 点击打开链接_胡小牧记录 下面是效果图: PictureSelector PhotoPicker 类似qq空间发布心情. 点击打开链接 BubbleSe ...

  9. HTML5与CSS3权威指南之CSS3学习记录

    title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...

最新文章

  1. java做个简单的登录界面_java一个简单的登录界面制作
  2. DNS的子域授权和转发机制,view设置
  3. CNCF 官方大使张磊:什么是云原生?
  4. [css] 请写出font属性的快捷写法
  5. 水晶报表常见问题整理之一(20050417)
  6. php mvc 路由,PHP MVC框架路由学习笔记
  7. tiny6410裸机编程-----Timer (1)
  8. [数分提高]2014-2015-2第1教学周第2次课
  9. html同时用多个css,多类选择器的运用_html/css_WEB-ITnose
  10. 高校毕业生就业信息管理系统的设计与实现(Spring + Spring MVC +Hibernate)
  11. JDK-8u131 软件安装教程
  12. mysql数据库自动停止_解决mysql数据库自动停止方法
  13. 用场景应用™玩转#冰桶挑战#
  14. linux vim下自动补全,linux-python在vim下的自动补全功能
  15. 系统学习机器学习之系统认识
  16. AI模型也需要资产管理,星环科技推出AI运营平台MLOps星环科技星环科技
  17. WebAPI_AutoFac(依赖注入)的简单使用
  18. 旋转角度如何知道是顺时针还是逆时针旋转?(仅供参考,更靠谱的是旋转轴到z轴正半轴上)
  19. java汉字转拼音(全拼、简拼)
  20. 罗尔定理_高数_1元微积分

热门文章

  1. 开源众包优质开发商计划。坐享100万很easy!
  2. PE基础——PE文件格式分析及修改
  3. vue点击菜单跳转时,背景颜色动态变化
  4. Linux执行后台work相关
  5. Ubuntu离线安装Nvidia显卡驱动
  6. html5可视化编辑器教程,html5可视化编辑器sx html5 vip使用教程(附vip账号)
  7. java小游戏2048实现
  8. 【SEO经验分享】网站分析对SEO优化有什么用
  9. Cubemx串口数据收发基础
  10. 树莓派 4B 下 Linux 系统高级命令行