解决使用MSComm控件过程中内存溢出的问题

MFC串口通信的两种方法及注意事项 1.基于Active控件的方式(MSComm)         优点是:直接利用控件,在串口有数据到达时,会促发相应的事件响应函数,然后你可以在实践响应函数里,进行数据的读取。         缺点是:数据在发送和接受的过程中VARIANT、   COleSafeArray 类型的转换,显得繁琐。         步骤:        ①插入控件         选择Project菜单下 阅读详情

现在做的一个项目需要实现上位机和单片机的串口通信,为了方便,使用了MSComm控件,但写程序时在处理接收数据遇到了问题,程序可以编译通过,但运行的过程中,程序只要接收到串口发来的数据,就会弹出内存溢出提示错误:in xx.exe(MFCO42D.DLL);0xC0000005,Acess Violation。处理接收数据部分程序如下:

void CDemoDlg::OnOnCommMscomm() 
{
	// TODO: Add your control notification handler code here
	VARIANT variant_inp;
	//COleVariant myVar;
	COleSafeArray safearray_inp;
	long i=0;
	long len;
	char rxdata[200];
	CString tmp;
	switch (m_mscomm.GetCommEvent())
	{
		case 1:
			break;		
		case 2:
		//表示接收缓冲区内有字符
			{
				variant_inp=m_mscomm.GetInput();
				safearray_inp=variant_inp;
				len=safearray_inp.GetOneDimSize(); //问题出在这
				for (i=0;i<len;i++)
				{
					safearray_inp.GetElement(&i,&rxdata[i]);
				}
				rxdata[i]='\0';
			}
			break;
		default:
			break;
	}
}
经过调试,确定问题出在len=safearray_inp.GetOneDimSize()这里。在网上搜了一下,发现不少人在使用MSComm控件时遇到了跟我同样的问题,有些人回复说把使用的MFC动态链接库改为静态的,还有的说把variant_inp=m_mscomm.GetInput()改为variant_inp.Attch(m_mscomm.GetInput())。我照着这些方法都试了还是不行。后来在每周的例会上把这个问题跟一个同事说了一下,他帮我调试了程序,发现variant=m_mscomm.GetInput()这局执行完后,variant里依然是空的,并没有获得串口接收到的字符串,这才造成了内存的泄露。上面的程序基本参照了网上成熟的MSComm控件使用的例子,按说代码不会出错的.后来在CSDN的一篇帖子里搜到可能是mfco42d.dll这个文件的问题,遂到网上重新下载了个mfco42d.dll文件替换原文件。重新编译,程序能运行,发送和接收串口数据都正常。

MFC之CSerialPort类双串口发送接收 MFC之CSerialPort类双串口发送接收 1、 基本框架 添加CSerialPort(.c、.h)文件添加到相应位置。 创建对象和函数 CSerialPort m_SerialPort1, m_SerialPort2; afx_msg LONG CDoublePortDlg::OnComm(WPARAM ch, LPARAM port);//此函数接收到一个字符执行一次 指 阅读详情

相关推荐

本地部署 Bolt.new - 小学生都能轻松搭建AI编程环境

本地部署 Bolt.new - 小学生都能轻松搭建AI编程环境

engchina的专栏 8564

MSComm控件过程内存溢出和GetOneDimSize出错的问题

MSComm控件过程内存溢出和GetOneDimSize出错的问题 现在做的一个项目需要实现上位机和单片机的串口通信,为了方便,使用MSComm控 件,但写程序时在处理接收数据遇到了问题,程序可以编译通过,但运行的过程中,程序只要接收到串口发来的数据,就会弹出内存溢出提示错误:in xx.exe(MFCO42D.DLL);0xC0000005,Acess Violation。处理接收数据部分...

《好好先生》专栏 964

基于逆向工程的中国裁判文书网爬虫技术深度解析

本文详细介绍了中国裁判文书网爬虫的开发过程,涵盖了从基础爬取到高级功能的完整解决方案。逆向工程分析:理解网站的反爬机制和加密逻辑浏览器自动化:使用Playwright模拟真实用户行为参数加密:通过JavaScript执行环境生成加密参数智能调度:控制请求频率,避免被检测错误处理:完善的异常处理和重试机制。

2201_76125261的博客 2116

vb/vb.net开发精粹(5)

VB   制作安装程序时,如何让安装时提示的   界面都是中文? 帮忙看看程序----提示“多步OLE   DB产生错误,请检查每个OLE   DB状态值,没有工作被完成” 谁能帮我看看这段VBS代码 有谁研究过MDIActiveX这个把封装DLL生成MDI子窗体的?或谁精

师以长技以制夷 1120

VC2010_串口调试记录(三)

连续两天调试MSComm控件 无法接收: 现象:safearray_inp=variant_inp;//变量转换 这句话报错 方法:设置控件为二进制模式,而非文本模式 void ERASE::OnCommMscomm1() { // TODO: Add your message handler code here VARIANT variant_inp;//计算机底层传

sunedi561的工作日志 405

串口通信中遇到的问题

VARIANT variant_inp;COleSafeArray safearray_inp;LONG len, k;BYTE rxdata[2048];CString strtemp;if (m_ctrlComm.GetCommEvent()==2)事件值为2表示接收缓冲区内有字符{variant_inp=m_ctrlComm.GetInput();读缓冲区s...

weixin_30337251的博客 263

VC串口控件编程,解决内存不断增加的问题

VC串口控件编程,解决内存不断增加的问题 作者姓名: 王潮杰   如需转载使用请与作者联系  chaojie2003@yahoo.com.cn  开发环境: VC6 Windows 2000 讲解: 很多人在使用VC串口控件编写程序的时候,经常会遇到当串口接受数据量比较大时,从Windows 2000任务管理器里,可以看到

blog of eulota 2168

MSComm控件无法收到数据的解决办法

前一段时间我做了一个项目,其中使用MSComm串口实现PC与机器的通信,一直都是工作正常的,后来忽然有一天,无法接收数据,断点进去看,发现只有发送命令,没有接收数据,用串口工具调试,情况正常,数据能正常返回。肯定是程序问题,但是找不到错误在哪里,百思不得其解,后来查阅资料,发现有可能是mscomm32.ocx的控件可能出问题了,再次注册一下:regsvr32 mscomm32.ocx。结果就可

wjeson的专栏 2004

串口通信编程(1):使用MSComm控件

1、使用MSComm

milanleon的专栏 6313

内存溢出的多种原因及优化方法

openfire 内存报错更改openfire目录下bin/openfire文件cat bin/openfireINSTALL4J_ADD_VM_PARAMS="-Xms8192m -Xmx8192m -XX:+useParallelOldGC -XX:NewRatio=2"添加-XX:+useParallelOldGC -XX:NewRatio=2 参数第一类内存溢出...

weixin_34185364的博客 900

解决VS2010使用mscomm控件无法接收数据的问题【转】

之前有用过VC6的mscomm控件。所以这次也想继续用此控件实现此功能,结果没想到刚一上手还真的绕了不少弯子。主要是因为VC2010下对mscomm控件的添加,以及对控件成员变量的添加有点小繁琐,特此把个人实践的经验写下来以供新人参考。说明一下,本人用的xp+VS2010。 如果你正在使用2010,并且想用mscomm控件,遇到如下问题,那你可以看看这篇文章。 ...

473

VC++串口控件CMSComm接收数据造成CPU占用率不断增加的问题

/4096//设置BYTE数组 An 8-bit integerthat is not signed.总结:在串口读取数据后要调用VariantClear函数清空变量,可以有效防止因为串口读取数据造成的CPU占用率一直增加的问题。//转换为BYTE型数组。if(m_ComData.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符。{ ////////以下你可以根据自己的通信协议加入处理代码。

LaoGaoNo1的博客 784

C# 垃圾回收释放内存

C# 垃圾回收释放内存 #region 内存回收 [DllImport("kernel32.dll", EntryPoint = "SetProcessWorkingSetSize")] public static extern int SetProcessWorkingSetSize(IntPtr process, int minSize, int maxSiz...

diangan0901的博客 302

COleSafeArray

COleSafeArray类是用于处理任意类型和维数的数组的类。 COleSafeArray是从OLE VARIANT结构派生而来的。 OLE SAFEARRAY成员函数在可以通过COleSafeArray来访问,就象是特别为一维的字节数组所设计的一个成员函数集。 #include 请参阅:COleVariant, CRecordset, CDatabase COleSafeArray

qq_37948513的博客 4900

贝壳和鹅卵石图像数据集

贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵石图像数据集贝壳和鹅卵

上一篇: 深入浅出VC++串口编程之基于控件
下一篇: 解决不能添加过多的控件对象
farrellcn
博客等级 码龄17年 55粉丝 48原创
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值