本人的程序,使用串口接收数据,串口设置如下:
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);
} 请问各位高人,这有可能是什么原因造成的,大家给点建议啊

解决方案 »

  1.   

    http://download.csdn.net/source/207188
      

  2.   

    你的代码问题可能就出现在自己封装的CArray里面了, 例如
    OPTSTEP COperationSet::mAt(int i)
    {
    return mOptSet.GetAt(i);
    }
    你的这个"i"会不会越界? 最好检查一下:
    if(i<mOptSet.GetCount()-1 && i>-1)
     return mOptSet[i];
    return NULL;
      

  3.   

    好像是越界了,说是访问了非法地址,可是,这都是在代码行
    for (k=0;k<len;++k)
    safearray_inp.GetElement(&k,mDataFromDSP+k); 
    作用的时候,如果将上边的代码注释嗲掉,就从来不出现程序崩溃的情况可。大家帮帮忙吧,项目急用啊。
      

  4.   

    在mCacheProc(mDataFromDSP);中不知做了什么处理,估计与与出错的COperationSet等有关;因为你在注释掉接收数据后,mDataFromDSP也没有数据,mCacheProc()的执行肯肯定不一样。也有可能mCacheProc()的代码与COperationSet等无关,但由于mCacheProc()执行出错,程序非法修改了内存的其它数据,而这些数据恰好是COperationSet等会用到的。总之,可以考虑不注释接收数据的代码,而到mCacheProc()里面,再注释代码,进一步定位出错的地方。