#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]))
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)