本人的程序,使用串口接收数据,串口设置如下:
mComDsp.put_InputMode(1);
mComDsp.put_RThreshold(11*gDspCacheNum);
其中:
gDspCacheNum定义为:
enum {
gDspCacheNum = 90
};
mComDsp定义为Windows串口控件对象。串口接收函数如下:
BYTE ch;
if(mComDsp.get_CommEvent()==2)
{
safearray_inp = mComDsp.get_Input();
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
if(gIsMeasuring)
{
try
{
for (k=0;k<len;++k)
safearray_inp.GetElement(&k,mDataFromDSP+k);
}
catch (COleException *pEx)
{
AfxThrowOleDispatchException(1003,
"Unexpected Failure in FastSort method");
pEx->Delete();
} //以下处理mDataFromDSP数组中的数据
if(mCheckFileUseable())
mCacheProc(mDataFromDSP);
else
{
AfxMessageBox("错误!");
mStopOperationSet();
return;
}
}
safearray_inp.Destroy();
}
其中各变量定义如下:
BYTE mDataFromDSP[11*gDspCacheNum];
COleSafeArray safearray_inp;
LONG len;
LONG k;程序有时正常,有时会出错。
本人程序的其他部分用到几个自定义的类,其中封装了CArray数组类,并且自定义了存取函数,就是简单的封装了
GetAt,GetSize等标准函数。
这些封装的自定义类主要用来存储自定义的数据结构对象,并且在程序中会启动一些计时器,计时器中断处理函数OnTimer中会不断的依次取出数组中的自定义对象,另作他用。程序出错时,经常会跳到这几个类对象的获取函数,
比如,有个COperationSet对象mCurOperationSet,
在某处有mCurOperationSet.mAt(n);
错误经常出现在如下的函数处,
OPTSTEP COperationSet::mAt(int i)
{
return mOptSet.GetAt(i);
}其中COperationSet封装了typedef CArray<OPTSTEP,OPTSTEP>。其他封装了CArray数组的类的mAt函数有时也会出错。但是,如果把串口接收函数中的以下代码注释掉,
for (k=0;k<len;++k)
safearray_inp.GetElement(&k,mDataFromDSP+k);
程序就不会崩溃,能够正常运行。程序崩溃的发生还有一种情况,就是当程序正常运行并且接收数据时,如果不断的将程序主界面最小化在最大化,这样就会出现程序崩溃的错误。
并且崩溃发生后,如果选择调试,程序就定位在计时器处理函数OnTimer中上面提到的获取数组中对象的函数调用,如:
OPTSTEP COperationSet::mAt(int i)
{
return mOptSet.GetAt(i);
} 请问各位高人,这有可能是什么原因造成的,大家给点建议啊
mComDsp.put_InputMode(1);
mComDsp.put_RThreshold(11*gDspCacheNum);
其中:
gDspCacheNum定义为:
enum {
gDspCacheNum = 90
};
mComDsp定义为Windows串口控件对象。串口接收函数如下:
BYTE ch;
if(mComDsp.get_CommEvent()==2)
{
safearray_inp = mComDsp.get_Input();
len = safearray_inp.GetOneDimSize(); //得到有效数据长度
if(gIsMeasuring)
{
try
{
for (k=0;k<len;++k)
safearray_inp.GetElement(&k,mDataFromDSP+k);
}
catch (COleException *pEx)
{
AfxThrowOleDispatchException(1003,
"Unexpected Failure in FastSort method");
pEx->Delete();
} //以下处理mDataFromDSP数组中的数据
if(mCheckFileUseable())
mCacheProc(mDataFromDSP);
else
{
AfxMessageBox("错误!");
mStopOperationSet();
return;
}
}
safearray_inp.Destroy();
}
其中各变量定义如下:
BYTE mDataFromDSP[11*gDspCacheNum];
COleSafeArray safearray_inp;
LONG len;
LONG k;程序有时正常,有时会出错。
本人程序的其他部分用到几个自定义的类,其中封装了CArray数组类,并且自定义了存取函数,就是简单的封装了
GetAt,GetSize等标准函数。
这些封装的自定义类主要用来存储自定义的数据结构对象,并且在程序中会启动一些计时器,计时器中断处理函数OnTimer中会不断的依次取出数组中的自定义对象,另作他用。程序出错时,经常会跳到这几个类对象的获取函数,
比如,有个COperationSet对象mCurOperationSet,
在某处有mCurOperationSet.mAt(n);
错误经常出现在如下的函数处,
OPTSTEP COperationSet::mAt(int i)
{
return mOptSet.GetAt(i);
}其中COperationSet封装了typedef CArray<OPTSTEP,OPTSTEP>。其他封装了CArray数组的类的mAt函数有时也会出错。但是,如果把串口接收函数中的以下代码注释掉,
for (k=0;k<len;++k)
safearray_inp.GetElement(&k,mDataFromDSP+k);
程序就不会崩溃,能够正常运行。程序崩溃的发生还有一种情况,就是当程序正常运行并且接收数据时,如果不断的将程序主界面最小化在最大化,这样就会出现程序崩溃的错误。
并且崩溃发生后,如果选择调试,程序就定位在计时器处理函数OnTimer中上面提到的获取数组中对象的函数调用,如:
OPTSTEP COperationSet::mAt(int i)
{
return mOptSet.GetAt(i);
} 请问各位高人,这有可能是什么原因造成的,大家给点建议啊
OPTSTEP COperationSet::mAt(int i)
{
return mOptSet.GetAt(i);
}
你的这个"i"会不会越界? 最好检查一下:
if(i<mOptSet.GetCount()-1 && i>-1)
return mOptSet[i];
return NULL;
for (k=0;k<len;++k)
safearray_inp.GetElement(&k,mDataFromDSP+k);
作用的时候,如果将上边的代码注释嗲掉,就从来不出现程序崩溃的情况可。大家帮帮忙吧,项目急用啊。