程序如下:if (2 == m_DataPort.GetCommEvent())
{
static VARIANT Rec_Data = m_DataPort.GetInput();
int Data_Len = Rec_Data.parray->rgsabound->cElements;
memcpy(CommDataBuff, Rec_Data.parray->pvData, Data_Len);
}
其中m_DataPort为MSCOMM控件在包装类,我在MFC下使用。
注,我肯定不是CommDataBuff数组太小的问题,因为它其实很大,而且我只向串口送了几个字节的数据而已。错误就是读0地址错误,一点调试就跳到memcpy.asm这个文件,里面是memcpy和memove函数的实现代码(汇编)。
我将static VARIANT Rec_Data = m_DataPort.GetInput();
改为VARIANT Rec_Data = m_DataPort.GetInput();
错误没了,但我仍然无法断定就是静态变量的问题,因为有可能是MSCOMM控件无法向静态变量里写值。

解决方案 »

  1.   

    是啊,CommDataBuff就是全局变量啊。
    但是用MSCOMM控件取数的时候,它是将数据放在一个VARIANT型数据里面的,而VARIANT这种数据类型很难以使用,所以我将它的数据拷贝到了CommDataBuff中。
      

  2.   

    我是问为什么静态的不行?将static VARIANT Rec_Data申明成全局变量或是类变量,甚至是局部变量都没问题。
      

  3.   

    同志,你先翻翻书吧,你比我菜多了,坦白讲,希望你不要生气,我没有别的意思。
    “分配固定的存储空间”这句话是对的,但你看看VARIANT的定义吧,数据是放在一个指针里的,就比如:
    static int* p;虽然p的存储空间是固定的,4字节,但它指向的地址里面存放的数据却是完全可变的。
    因为你可以任意的给p赋新的地址,想让它指向哪就指向哪。