社区
ATL
帖子详情
VC下写的串口通讯程序,长期运行出现接收不到数据的现象。
rzsheng
2009-08-21 02:12:25
用VC写了一个上位机程序,与单片机进行串口通讯,
程序设定参数之后定时发送一个命令给单片机,
单片机则回复一个数据
程序开始运行都还正常,运行一段时间后程序接收不到串口数据,偶尔出现程序呈死锁状,界面无法操作。
请教各位,这大概是什么原因造成的?
多谢了
...全文
478
18
打赏
收藏
VC下写的串口通讯程序,长期运行出现接收不到数据的现象。
用VC写了一个上位机程序,与单片机进行串口通讯, 程序设定参数之后定时发送一个命令给单片机, 单片机则回复一个数据 程序开始运行都还正常,运行一段时间后程序接收不到串口数据,偶尔出现程序呈死锁状,界面无法操作。 请教各位,这大概是什么原因造成的? 多谢了
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
18 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
oneatree
2012-05-20
打赏
举报
回复
我也碰到这个问题
headgulei
2011-02-19
打赏
举报
回复
谢谢
我似乎也碰到了类似问题
不过我是跟PLC通信
很规律的
每隔2个小时就死一次
deng335995
2009-08-24
打赏
举报
回复
程序出现界面死锁问题,可以确定是你的程序的问题,看看你的链表中的数据有没有在处理后删除掉,还有接收部分是的线程你是怎么创建的,你是什么时候读数据的,不会是你自己堵塞了自己吧,帖些代码出来看看.
rzsheng
2009-08-24
打赏
举报
回复
楼上说的有道理,
实验条件有限,我得想办法另找一台电脑来做实验。
rzsheng
2009-08-24
打赏
举报
回复
[Quote=引用 15 楼 glacierful 的回复:]
在接收线程的收数据过程、主线程的处理显示和绘图这两个地方用临界区做个同步。
另外,为什么不直接在接收线程发消息给主窗口来传递数据呢?这样也省了主线程和接收线程在访问全局链表时做同步。
[/Quote]
谢谢提醒,我也在考虑这个问题,用消息来传递数据可能会更好一些。
我先按照这个方法进行修改再测试看看。
glacierful
2009-08-24
打赏
举报
回复
在接收线程的收数据过程、主线程的处理显示和绘图这两个地方用临界区做个同步。
另外,为什么不直接在接收线程发消息给主窗口来传递数据呢?这样也省了主线程和接收线程在访问全局链表时做同步。
ziplj
2009-08-23
打赏
举报
回复
[Quote=引用 10 楼 rzsheng 的回复:]
怀疑是单片机部分,但程序出现界面死锁问题还说明是PC软件有问题。
[/Quote]
如果你的主线程是处理界面 而不处理工作的话 何来死锁??
3L感觉在理
rzsheng
2009-08-23
打赏
举报
回复
多谢楼上各位的回复,
内存泄露问题可能不存在,因为我处理的数据量不大,并且出问题的时候也查了内存情况,PC内存是1G的,
足够我的程序跑上很多天了。
但程序往往在运行数十分钟,或者几个小时就出问题,但也不是一定出问题,
怀疑是单片机部分,但程序出现界面死锁问题还说明是PC软件有问题。
接收部分是用一个线程处理的,收到的数据放进一个全局的链表数据里,主线程是处理界面操作,以及表格和图形数据显示。
当接收线程收到数据后,马上创建链表节点,然后通知主线程开始显示和绘图。
不知道我这个原理是否有问题。
zgl7903
2009-08-23
打赏
举报
回复
那就使用另外一个串口, 模拟单片机和你的程序通讯,
或者就用另外一台电脑监控通讯线上的数据,
看看什么情况下出现死机现象
wencheng2998
2009-08-21
打赏
举报
回复
1、另外来一台电脑,在这台电脑上面用串口精灵来监视,看是不是长时间反应的时候单片机出现问题。
2、第二个可能我觉得是当你写的代码中缓存的数据太多而没有注意释放而导致的。。
ziplj
2009-08-21
打赏
举报
回复
肯定程序有问题
MoXiaoRab
2009-08-21
打赏
举报
回复
看看内存有没有泄露,这种情况比较多,由内存耗尽引起的
churenxh
2009-08-21
打赏
举报
回复
[Quote=引用 4 楼 daviemeng 的回复:]
你看看你的程序的内存是不是一直在增长 当内存都吃了了 就会出现死掉的情况。
当然不排除其他的错误可能,比如你发送的请求超过单片机的处理能力 在开始的时候单片机能处理过来 但是随着时间的推移 未处理请求越来越多 这时你再发请求 可能就等不到单片机的响应 等待这段时间可能出现假死 比如程序有 WaitForMultipleObjects 而且是单线程程序。 还有别的可能就的靠你自己慢慢找了。
附我查内存泄漏的方法:
. 先查是否所有申请内存都释放,包括:
new / new [] ---- delete / delete [] //注意一一对应
malloc ---- free
CoTaskMemAlloc ---- CoTaskMemFree
SysAllocString ---- SysFreeString
SafeArrayCreate ---- SafeArrayDestroy
CreatePen/CreateBrush ---- DeleteObject
GetDC ---- ReleaseDC
ITypeInfo::GetTypeAttr() ---- ITypeInfo::ReleaseTypeAttr()
COleSteamFile::OpenStream,
CreateStream, CreateMemoryStream ---- COleStreamFile::Close()
2. 使用performance察看内存在哪个时段增加后没有释放。在cmd中键入perfmon,就可以打开,至于怎么用上网自己查。
3. 再就是使用一个类CMemorySate,来查看某段代码申请内存后是否释放。这个类很简单自己看看MSDN就能会用。
[/Quote]
楼上很强啊!
楼上说单片机能不能处理过来,你找个其他串口工具测试,就知道是你软件问题,是单片机处理问题
chys3584
2009-08-21
打赏
举报
回复
up
刚刚凉
2009-08-21
打赏
举报
回复
你看看你的程序的内存是不是一直在增长 当内存都吃了了 就会出现死掉的情况。
当然不排除其他的错误可能,比如你发送的请求超过单片机的处理能力 在开始的时候单片机能处理过来 但是随着时间的推移 未处理请求越来越多 这时你再发请求 可能就等不到单片机的响应 等待这段时间可能出现假死 比如程序有 WaitForMultipleObjects 而且是单线程程序。 还有别的可能就的靠你自己慢慢找了。
附我查内存泄漏的方法:
. 先查是否所有申请内存都释放,包括:
new / new [] ---- delete / delete [] //注意一一对应
malloc ---- free
CoTaskMemAlloc ---- CoTaskMemFree
SysAllocString ---- SysFreeString
SafeArrayCreate ---- SafeArrayDestroy
CreatePen/CreateBrush ---- DeleteObject
GetDC ---- ReleaseDC
ITypeInfo::GetTypeAttr() ---- ITypeInfo::ReleaseTypeAttr()
COleSteamFile::OpenStream,
CreateStream, CreateMemoryStream ---- COleStreamFile::Close()
2. 使用performance察看内存在哪个时段增加后没有释放。在cmd中键入perfmon,就可以打开,至于怎么用上网自己查。
3. 再就是使用一个类CMemorySate,来查看某段代码申请内存后是否释放。这个类很简单自己看看MSDN就能会用。
dirdirdir3
2009-08-21
打赏
举报
回复
通讯的频率有没有控制好,通讯的缓存是有限制的........
刚刚凉
2009-08-21
打赏
举报
回复
如果不是内存泄漏
有个相对麻烦的方法可以调试下看看是哪错了:
你把通信过程分成若干个部分 然后每执行完一部分向txt写入这部分完成的标记 这样长期运行 死掉后 你看看txt中的信息 看看是哪部分没执行
不过我觉得很有可能是内存泄漏 因为这种长期运行才出问题的大部分是内存泄漏造成的
刚刚凉
2009-08-21
打赏
举报
回复
看内存情况了吗? 不会是内存泄漏把
串口调试精灵,
VC
编
写
的串口调试
程序
串口调试精灵是
VC
编
写
,
运行
时不需要其它任何文件,完全绿色软件,方便跨平台使用。极好的串口调试
程序
,稳定用于 Win9X/NT 平台,能提高工作效率,使串口调试能够方便透明的进行。它可以在线设置各种通讯速率、...
C#串口介绍以及简单串口通信
程序
设计和实现
周末,没事干,
写
个简单的串口通信工具,也算是本周末曾来过,废话不多,直接到主题 串口介绍 串行接口简称串口,也称串行通信接口或串行通讯接口(通常指COM接口),是采用串行通信方式的扩展接口。(至于再详细...
用
VC
#.NET开发交互式CAD系统
用
VC
#.NET开发交互式CAD系统,包括结合GDI+和OPENGL两种方案。 联系平台客服可开发票。
串口调试说明
串口调试助手源
程序
V1.0或
VC
串口通讯
源
程序
吧, 开始吧: 1.建立项目:打开
VC
++6.0,建立一个基于对话框的MFC应用
程序
SCommTest(与我源代码一致,等会你会方便一点); 2.在项目中插入MSComm控件 选择Project...
com口控件安装.rar
MSComm 控件通过串行端口传输和
接收
数据
,为应用
程序
提供串行通讯功能。MSComm控件在串口编程时非常方便,
程序
员不必去花时间去了解较为复杂的API函数,而且在
VC
、VB、Delphi等语言中均可使用。 Microsoft ...
ATL
3,245
社区成员
48,539
社区内容
发帖
与我相关
我的任务
ATL
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
复制链接
扫一扫
分享
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章