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);

}

7个回答

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

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

qq_33196334
qq_33196334   2017.05.23 12:26

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

Csdn user default icon
上传中...
上传图片
插入图片