关于串口通信中COleSafearray的问题

关于串口通信中COleSafearray的问题,第1张

#define DIM1

#define LEN9

void CTestDlg::OnTest()

{

BYTE i1vTest[LEN] = {1, 2, 3, 4, 5, 6, 7, 8, 9}

SAFEARRAYBOUND sab[DIM]

sab[0].cElements = LEN

sab[0].lLbound = 0

SAFEARRAY* psa = NULL

psa = SafeArrayCreate(VT_UI1, DIM, sab)

for(long i = 0i <LENi++){

SafeArrayPutElement(psa, &i, &(i1vTest[i]))

}

VARIANT vt

vt.vt = VT_ARRAY|VT_UI1

vt.parray = psa

COleSafeArray sa

sa = vt

DWORD dwLen = sa.GetOneDimSize()

CString str

str.Format("%d", dwLen)

MessageBox(str)

}

---------------------------------------------------------------------------------

我写了这样中让好的一个测试程序,感卖铅觉问题应滑陆该处在你的“第一步”,也就是说,你未必完全正确的从串口缓冲区获得了有效的VARIANT数据。

粗略的看了一下,你的代码没有问题,我怀疑是其他的地方出现了问题。

给你一个我以前写的,模仿串口调试助手用串口控件的方法写的程序,你参考一下吧。

代码已发到你的邮箱。

补充:

接收就是在OnComm() 函数里啊,你的这段代码没有什么问题。

有没有做串口控件的事件映射啊:

BEGIN_EVENTSINK_MAP(CCuteComDlg, CDialog)

ON_EVENT(CCuteComDlg, IDC_MSCOMM1, 1 /* OnComm */, OnComm, VTS_NONE)

END_EVENTSINK_MAP()

如果有的话租简,那接收应该没有问题的。况且即使只有发没有收,那也不会点发送就会出错的。

我发给你的代码你看到了吗,那是标准串口控件的用法,里面收发演示都有的,你详细看一下吧,应该是对你有所帮助的。

有人说是因为祥型亏龚建伟的串口初始化部分代码有问题,才导致了后面的安全数组出现错误。

我一直是使用如下代码进行串口控件的初始化的,已经应用到过很多程序中没有出现过问题,你可以试试:

if(m_ctrlComm.get_PortOpen())

m_ctrlComm.put_PortOpen(FALSE)

m_ctrlComm.put_CommPort(1) //选择com1

//输出方式为二进制方式

m_ctrlComm.put_InputMode(1)//text,binary

//m_ctrlComm.put_InBufferSize(64)

//m_ctrlComm.put_OutBufferSize(512)

m_ctrlComm.put_Settings("9600,n,8,1")//波特率9600,无校验ndo,8个数据位,1个停止位

if( !m_ctrlComm.get_PortOpen())

m_ctrlComm.put_PortOpen(TRUE)//打开串口

m_ctrlComm.put_RThreshold(1)

//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

m_ctrlComm.put_InputLen(0) //设置当前接收区数据长度为0

//0---读接收缓冲区的所有内容

//n---读接收缓冲区的 n 个字符(或二进制码)

m_ctrlComm.get_Input()//先谨神预读缓冲区以清除残留数据

这是VS2008中的代码,在VC6.0中请把函数前缀get_替换为Get、put_替换为Set

如何使用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 = lFirstLBoundi <= lFirstUBoundi++)

{

index[0] = i

for (long j = lSecondLBoundj <= lSecondUBoundj++)

{

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


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12294040.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存