2 tsl5201 tsl5201 于 2013.12.14 18:04 提问

VS2010 MFC 的MSCOMM 控件 的Get_Input()函数读取不到缓存中的数据

各位高手好,小弟在使用VS2010 MFC 的MSCOMM 控件时出现了一个问题:
就是在OnComm函数里调用的Get_Input()函数读取不到缓存中的数据,经过验证,发现当接收区缓存数据不为0时程序能触发OnComm消息,可是当程序运行到Get_Input()函数时,OnComm()函数仿佛就直接从Get_Input()函数返回了,后面的代码也没有运行。同时,由于Get_Input()函数没有读取到缓存中的数据,因此即便我一次只给接收缓存发一个数据,程序也会不断调用OnComm()函数。请问可能的原因是什么?
初始化代码如下:
m_MSComm.Create(NULL,0,CRect(0,0,0,0),this,IDC_MSCOMM1);
if(m_MSComm.get_PortOpen())
m_MSComm.put_PortOpen(FALSE);
m_MSComm.put_CommPort(15); //choose port 3
CString str;
if(!m_MSComm.get_PortOpen()){
m_MSComm.put_PortOpen(TRUE);

}
else
AfxMessageBox("cannot open serial port!");

                  m_MSComm.put_InBufferCount(0);
        m_MSComm.put_OutBufferCount(0);
        m_MSComm.put_Settings("9600,n,8,1");  


        m_MSComm.put_InputMode(1);  
        m_MSComm.put_RThreshold(1); 
        m_MSComm.put_InputLen(0);

OnComm函数代码如下
VARIANT variant_inp;
COleSafeArray safearray_inp;
LONG len,k;
BYTE rxdata[2048];
CString strtemp;
CString str;
if(m_MSComm.get_CommEvent()==2)
{
variant_inp = m_MSComm.get_Input();
m_MSComm.put_InBufferCount(0);
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize();
for(k=0;k<len;k++){
safearray_inp.GetElement(&k,rxdata+k);
}
for(k=0;k<len;k++){
BYTE bt=*(char*)(rxdata+k);
strtemp.Format("%c",bt);
str+=strtemp;
}

    m_MSComm.put_InBufferCount(0);
    MessageBox(str);

}

8个回答

u014049811
u014049811   2014.11.07 21:26

您好,请问这个问题你解决了吗?

我出现了一个问题,就是我单片机一次发送一个数据,然后用一下代码
if(m_MSComm.get_CommEvent()==2)
{
variant_inp = m_MSComm.get_Input();
m_MSComm.put_InBufferCount(0);
safearray_inp = variant_inp;
len = safearray_inp.GetOneDimSize();
for(k=0;k<len;k++){
safearray_inp.GetElement(&k,rxdata+k);
}

这个variant_inp 会一次接受到两个一样的数据。 我是单步调试的,在单片机调试发送一个1, 然后variant_inp 这个参数里面会接受到两个1.
您能解决这个吗?

qq_31127587
qq_31127587   2016.06.13 16:52

你好,get_input函数的问题解决了吗?

kms720
kms720   2016.06.25 13:02

我表示也遇到了相同的问题?请问你是怎么解决的?

qq_35907515
qq_35907515   2016.08.18 20:46

一样的问题,就感觉GetInput()函数根本就没有读取到缓存的数据,或者说缓存里面压根就没有收到数据,楼主解决了吗

liandu123
liandu123   2016.09.13 19:14

我今天也遇到了这个问题 不知道楼主解决了没有

 char str[1024] = { 0 };   
        long k;
        int n; 
        n = m_Mscom.get_InBufferCount(); //这句话正确的运行了 发送几个数就有几个数
        VARIANT InputData = m_Mscom.get_Input(); //读缓冲区    但是这句话下面的语句就不会运行 

        COleSafeArray fs; 
        fs = InputData; //VARIANT型变À量转换为COleSafeArray型变量   
        for(k=0;k<fs.GetOneDimSize();k++) 
            fs.GetElement(&k, str + k); //转换为BYTE型数组   
u012277361
u012277361   2017.02.09 13:00

我表示也遇到了相同的问题?请问你是怎么解决的?

sinat_40146344
sinat_40146344 你好,问题解决了吗?
9 个月之前 回复
qq_33196334
qq_33196334   2017.05.23 12:26

m_MSComm.put_InBufferCount(0); 删了它~~再试试

sinat_40146344
sinat_40146344   2017.10.26 17:41

表示遇到同样的问题,我接了两个USB转串口,但我的只是针对某个串口,换个串口就可以接收了。但是下载的串口助手两个串口都可以正常接收数据。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
MSComm控件的使用方法
作为一个MFC编程的菜鸟,以下内容着重在于自己对MScomm控件的使用流程梳理,以此以便自己忘了时有据可查,由于时间关系,未曾过多考虑代码布局,所以代码略显粗糙,忘各位海涵,若能理解使用即可。 一、进行MSComm32.OCX的注册 在win8.1的环境系统中一般情况下是没有MSComm32.OCX这个Active控件的,所以需要单独注册: 方案一: 安装VC++6.
VS2010如何添加MSCOMM控件
VS2008后,就没有MSCOMM控件了,用户想用只能手动添加 下载MSCOM控件 (百度下载即可)(全名为:mscomm32.ocx) 控件注册 将控件复制到如下路径下: c:\windows\syswow(32为系统) c:\windows\systom32(64位系统) 以管理员身份打开CMD命令,执行如下命令,注册mscomm32.ocx控件: regsvr32 c:\wi
MSCOMM串口控件在VS2010中的使用
1、前言        之前的博客中有一篇关于MSCOMM使用的文章,里面最然给出了例子,但是对MSCOMM的使用介绍的不够。加之,近来又接触了上位机编程方面的东西,遂详细的做点笔记在这里。         MSCOMM控件应用比较广泛的原因主要还是在于它的操作简便性。特别是不需要做很多的代码编写工作就可以实现一些很基础的功能。但是在实际的开发使用时候还是要了解一些基本的MSCOMM属性,这样
VS2010中使用MSComm32.OCX进行MFC串口通信编程(Win8.1)
种情况一般出现在Windows7版本下,这说明MSCOMM32没注册,我们可以选择两种方法去解决,一种方法是当我们安装VC++6.0/VB6.0时,如果选择了ACtiveX控件项(自定义安装),MSComm控件就会自动安装在计算机上了,并在系统文件夹下多了3个文件:Mscomm.srg, Mscomm32.ocx,Mscomm32.dep;另一种方法是下载这三个文件将其放到C/Windows/Sy
MFC清空串口缓冲区
Win32通信API除了提供SetupComm()函数实现初始化的缓冲区控制外,还提供了PurgeComm()函数和FlushFileBuffers()函数来进行缓冲区操作。 PurgeComm()函数的声明如下: BOOL PurgeComm( HANDLE hFile,  // 返回的句柄 DWORD dwFlags  // 执行的动作 ); 参数hFile指向由CreateFil
VS2010中MSCOMM 串口通信控件的注册使用
VS2010本身并不自带MSCOMM控件,因此在Win7、win8/8.1系统中使用VS2010进行串口编程时, 在COM控件一栏中没法找到Microsoft communications control,version 6.0。     网上解决这个问题的文章很多,但尝试了很多种方法都没有解决,原因是很多文章都是没有 具体的给出具体的细节,导致有些操作没法进行。    
VC++ MFC MSCOMM VS2010 手把手学会串口收发 含例程
老习惯,例程链接放在评论一楼。     大部分情况下(毕设,实验室常用设备或传感器的上位机编程,工厂打码机/喷码机上位机编程,自己学习做串口助手的demo,等等90%情况),用到的都是占用一个端口的异步通讯。而这类工作用MSCOMM控件可以很方便的实现,并且在VS下面可以自己做一些定制的工作。     而不少做这类工程的,都不是计算机科班,所以有一份好的教程和跑得通,并且逻辑清楚的完整源码,可
解决VS2010使用mscomm控件无法接收数据的问题
如果你正在使用2010,并且想用mscomm控件,遇到如下问题,那你可以看看这篇文章: 1. 添加了mscomm控件以及对应的控件变量以后发现以前mscomm的成员函数,类似setsettings(),commport(),都不见了 2. 在类向导里添加了消息响应函数OnMscomm之后无法进入。 1. 首先,2010不支持mscomm控件,所以要注册mscomm控件,我看了两篇文章,都按照
在VS2010中如何添加MSCOMM控件,实现串口通讯
http://www.cnblogs.com/zhuxuekui/p/3550939.html
如何在安装部署时实现注册MSComm控件
用MSComm很是方便,但是也得付出代价,那就是在没有注册MSComm控件的PC机上安装时,得注册此控件,网上的资料大部分都是手动注册MSComm控件的方法,但是,不可能每个客户都手动来操作一遍,因此,这种方法在发布时是不可行的,更好的方法是让用户安装程序时让安装程序自动注册MSComm. 注:关于如何手动注册MSComm控件可参考:http://blog.csdn.net/flydream0/