VC下写的串口通讯程序,长期运行出现接收不到数据的现象。

rzsheng 2009-08-21 02:12:25
用VC写了一个上位机程序,与单片机进行串口通讯,
程序设定参数之后定时发送一个命令给单片机,
单片机则回复一个数据

程序开始运行都还正常,运行一段时间后程序接收不到串口数据,偶尔出现程序呈死锁状,界面无法操作。

请教各位,这大概是什么原因造成的?

多谢了
...全文
478 18 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
看内存情况了吗? 不会是内存泄漏把

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧