各位高手好,小弟在使用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);
}
您好,请问这个问题你解决了吗?
我出现了一个问题,就是我单片机一次发送一个数据,然后用一下代码
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.
您能解决这个吗?
你好,get_input函数的问题解决了吗?
我表示也遇到了相同的问题?请问你是怎么解决的?
一样的问题,就感觉GetInput()函数根本就没有读取到缓存的数据,或者说缓存里面压根就没有收到数据,楼主解决了吗
我今天也遇到了这个问题 不知道楼主解决了没有
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型数组
我表示也遇到了相同的问题?请问你是怎么解决的?
m_MSComm.put_InBufferCount(0); 删了它~~再试试
表示遇到同样的问题,我接了两个USB转串口,但我的只是针对某个串口,换个串口就可以接收了。但是下载的串口助手两个串口都可以正常接收数据。
搞了两天,分享一下我的情况,1.在笔记本(win10不用装USB转串口也能运行)可以正常接收数据,在工控机不可以(两种串口转USB的配件,装了厂家提供的驱动,也装了各种网上的串口转USB驱动),用串口助手能正常接收数据,但VS调试时在m_Mscom.get_Input()跳出程序,单步跟踪运行到oledisp1.cpp,这是VS安装路径下的cpp。2.搜罗网上各种方法没有用,安装各种串口驱动都没用。3.更换win10系统,直接运行自己写的EXE可以正常接收数据。刚开始以为是系统问题,后面再安装另外串口驱动时,发现又出现不能接收数据了,用串口助手没问题,经过最终测试是两串口驱动有冲突,卸载多余的就可以了。