Mscomm32使用记录
最近需要给一个肌电模块做一个信号接收和看波形的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使用记录相关推荐
- mysql建立联合索引,mysql建立唯一键,mysql如何解决重复记录联合索引
在项目中,常常要用到联合唯一 在一些配置表中,一些列的组合成为一条记录. 比如,在游戏中,游戏的分区和用户id会形成一条记录.(比如,一个qq用户可以在艾欧尼亚.德玛西亚创建两个账号) 添加联 ...
- 实现 连续15签到记录_MySQL和Redis实现用户签到,你喜欢怎么实现?
现在的网站和app开发中,签到是一个很常见的功能 如微博签到送积分,签到排行榜 微博签到 如移动app ,签到送流量等活动, 移动app签到 用户签到是提高用户粘性的有效手段,用的好能事半功倍! 下面 ...
- 记录一次http请求失败的问题分析
问题背景 当前我有一个基于Flask编写的Restful服务,由于业务的需求,我需要将该服务打包成docker 镜像进行离线部署,原始服务的端口是在6661端口进行开启,为了区分,在docker中启动 ...
- Pytorch学习记录-torchtext和Pytorch的实例( 使用神经网络训练Seq2Seq代码)
Pytorch学习记录-torchtext和Pytorch的实例1 0. PyTorch Seq2Seq项目介绍 1. 使用神经网络训练Seq2Seq 1.1 简介,对论文中公式的解读 1.2 数据预 ...
- LeetCode简单题之学生出勤记录 I
题目 给你一个字符串 s 表示一个学生的出勤记录,其中的每个字符用来标记当天的出勤情况(缺勤.迟到.到场).记录中只含下面三种字符: 'A':Absent,缺勤 'L':Late,迟到 'P':Pre ...
- 关于TVM的点滴记录
关于TVM的点滴记录
- MySql数据库Update批量更新与批量更新多条记录的不同值实现方法
批量更新 mysql更新语句很简单,更新一条数据的某个字段,一般这样写: UPDATE mytable SET myfield = 'value' WHERE other_field = 'other ...
- 记录篇,自己在项目中使用过的。
图片选择器,6.0已经适配过,类似qq空间上传 点击打开链接_胡小牧记录 下面是效果图: PictureSelector PhotoPicker 类似qq空间发布心情. 点击打开链接 BubbleSe ...
- HTML5与CSS3权威指南之CSS3学习记录
title: HTML5与CSS3权威指南之CSS3学习记录 toc: true date: 2018-10-14 00:06:09 学习资料--<HTML5与CSS3权威指南>(第3版) ...
最新文章
- java做个简单的登录界面_java一个简单的登录界面制作
- DNS的子域授权和转发机制,view设置
- CNCF 官方大使张磊:什么是云原生?
- [css] 请写出font属性的快捷写法
- 水晶报表常见问题整理之一(20050417)
- php mvc 路由,PHP MVC框架路由学习笔记
- tiny6410裸机编程-----Timer (1)
- [数分提高]2014-2015-2第1教学周第2次课
- html同时用多个css,多类选择器的运用_html/css_WEB-ITnose
- 高校毕业生就业信息管理系统的设计与实现(Spring + Spring MVC +Hibernate)
- JDK-8u131 软件安装教程
- mysql数据库自动停止_解决mysql数据库自动停止方法
- 用场景应用™玩转#冰桶挑战#
- linux vim下自动补全,linux-python在vim下的自动补全功能
- 系统学习机器学习之系统认识
- AI模型也需要资产管理,星环科技推出AI运营平台MLOps星环科技星环科技
- WebAPI_AutoFac(依赖注入)的简单使用
- 旋转角度如何知道是顺时针还是逆时针旋转?(仅供参考,更靠谱的是旋转轴到z轴正半轴上)
- java汉字转拼音(全拼、简拼)
- 罗尔定理_高数_1元微积分