首页编程colesafearray,关于串口通信中COleSafearray的问题,怎么解决

colesafearray,关于串口通信中COleSafearray的问题,怎么解决

编程之家2023-11-0671次浏览

尊敬的读者,colesafearray和关于串口通信中COleSafearray的问题,怎么解决是当前备受关注的话题,但许多人对其仍存在疑惑。在本篇文章中,我将为你提供清晰的解释和深入的分析,希望能满足你的求知欲望。

colesafearray,关于串口通信中COleSafearray的问题,怎么解决

关于串口通信中COleSafearray的问题,怎么解决

其实前面已经问过了,不过不能问题补充,所以再发一次

答到的,其实加起来就是120+70分了,大家帮帮忙啊

在编一个串口通信程序,因为刚上手,所以是按着龚建伟书的第一章改写的。

在处理接收数据的函数中

void CSerTestDlg::OnComm()

{

colesafearray,关于串口通信中COleSafearray的问题,怎么解决

VARIANT variant_inp;

COleSafeArray safearray_inp;

LONG len,k;

BYTE rxdata[2048];

CString strtemp;

if(m_ctrlComm.GetCommEvent()==2)

colesafearray,关于串口通信中COleSafearray的问题,怎么解决

{

variant_inp=m_ctrlComm.GetInput();//第一步

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

{

char bt=*(char*)(rxdata+k);

strtemp.Format("%c",bt);

m_strEditRXData+=strtemp;

UpdateData(FALSE);

}

}

}

我用debug查看,第一步的结果是对的,数据放入到我定义的缓冲区variant_inp中

第二步弹出错误框,但忽略后safearray_inp也接收到数据

第三步又弹出错误框,但忽略后得到的有效数据长度len是一个负数。

结果后面就一直错下去了。

请教一下大家是不是safearray_inp=variant_inp;出了什么问题,怎么改?

ps:进一步调试后我发现似乎是COleSafeArray这个结构的问题

不单只是safearray_inp=variant_inp的问题

第二步改为 safearray_inp.Attach( variant_inp)还是要报错。忽略后,

我即使手动把len=safearray_inp.GetOneDimSize()

改为len=70

在下面的程序中safearray_inp.GetElement(&k,rxdata+k)还是要报错。

也就是说凡是涉及safearray_inp的都会出错。

我想请教一下为什么,望不吝赐教

ps:我试用了下面这种方法,但还是死在Safearray上

void CSerTestDlg::OnComm()

{

COleVariant varInput;

COleSafeArray safearray_inp;

LONG lLen= 0;

LONG i= 0;

BYTE rxdata[2048];//设置BYTE数组 An 8-bIT integerthat is not signed.

//注意:设置接收数据

if(2== m_ctrlComm.GetCommEvent())//事件值为2表示接收缓冲区内有字符

{

varInput.Attach(m_ctrlComm.GetInput());//读缓冲区

safearray_inp= varInput;//VARIANT型变量转换为ColeSafeArray型变量

lLen= safearray_inp.GetOneDimSize();//得到有效数据长度

for(i= 0; i< lLen; i++)

{

safearray_inp.GetElement(&i, rxdata+i);//转换为 BYTE型数组

}

m_strEditRXData+=(char*)rxdata;

UpdateData(FALSE);//更新编辑框内容

}

怎么使用COleSafeArray实现二维数组将字符串写入excel

如何使用COleSafeArray实现二维数组将字符串写入excel

// VARTYPE vt= VT_BSTR;/*数组元素的类型,string*/

VARTYPE vt= VT_I4;/*数组元素的类型,long*/

SAFEARRAYBOUND sabWrite[2];/*用于定义数组的维数和下标的起始值*/

sabWrite[0].cElements= 1;

sabWrite[0].lLbound= 0;

sabWrite[1].cElements= 3;

sabWrite[1].lLbound= 0;

COleSafeArray olesaWrite;

olesaWrite.Create(vt, sizeof(sabWrite)/sizeof(SAFEARRAYBOUND), sabWrite);

/*通过指向数组的指针来对二维数组的元素进行间接赋值*/

long(*pArray)[2]= NULL;

olesaWrite.AccessData((void**)&pArray);

memset(pArray, 0, sabWrite[0].cElements* sabWrite[1].cElements* sizeof(long));

/*释放指向数组的指针*/

olesaWrite.UnaccessData();

pArray= NULL;

/*对二维数组的元素进行逐个赋值*/

long index[2]={0, 0};

long lFirstLBound= 0;

long lFirstUBound= 0;

long lSecondLBound= 0;

long lSecondUBound= 0;

olesaWrite.GetLBound(1,&lFirstLBound);

olesaWrite.GetUBound(1,&lFirstUBound);

olesaWrite.GetLBound(2,&lSecondLBound);

olesaWrite.GetUBound(2,&lSecondUBound);

for(long i= lFirstLBound; i<= lFirstUBound; i++)

{

index[0]= i;

for(long j= lSecondLBound; j<= lSecondUBound; j++)

{

index[1]= j;

long lElement= str[j];

//CString lElement= ch;

olesaWrite.PutElement(index,&lElement);

}

}

/*把ColesaWritefeArray变量转换为VARIANT,并写入到Excel表格中*/

VARIANT varWrite=(VARIANT)olesaWrite;

range.put_Value2(varWrite);

这样能将输入的整形写入excel,当变成VT_BSTR报内存不足,求指导如何修改

------解决方案--------------------

可以通过另外一种写法,

CRange write_range= start_range.get_Offset(COleVariant((long)7),COleVariant((long)j));

write_range.put_Value2((COleVariant)(str[j]));

文章分享结束,colesafearray和关于串口通信中COleSafearray的问题,怎么解决的答案你都知道了吗?欢迎再次光临本站哦!

float 计算机上的float指的是什么意思百度站长(百度站长平台是做什么用的)