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

VC下写的串口通讯程序,长期运行出现接收不到数据的现象。
用VC写了一个上位机程序,与单片机进行串口通讯,
程序设定参数之后定时发送一个命令给单片机,
单片机则回复一个数据

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

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

多谢了

------解决方案--------------------
看内存情况了吗? 不会是内存泄漏把
------解决方案--------------------
如果不是内存泄漏
有个相对麻烦的方法可以调试下看看是哪错了:
你把通信过程分成若干个部分 然后每执行完一部分向txt写入这部分完成的标记 这样长期运行 死掉后 你看看txt中的信息 看看是哪部分没执行


不过我觉得很有可能是内存泄漏 因为这种长期运行才出问题的大部分是内存泄漏造成的
------解决方案--------------------
通讯的频率有没有控制好,通讯的缓存是有限制的........
------解决方案--------------------
你看看你的程序的内存是不是一直在增长 当内存都吃了了 就会出现死掉的情况。
当然不排除其他的错误可能,比如你发送的请求超过单片机的处理能力 在开始的时候单片机能处理过来 但是随着时间的推移 未处理请求越来越多 这时你再发请求 可能就等不到单片机的响应 等待这段时间可能出现假死 比如程序有 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就能会用。
------解决方案--------------------
探讨
你看看你的程序的内存是不是一直在增长  当内存都吃了了  就会出现死掉的情况。
当然不排除其他的错误可能,比如你发送的请求超过单片机的处理能力  在开始的时候单片机能处理过来  但是随着时间的推移  未处理请求越来越多 这时你再发请求 可能就等不到单片机的响应  等待这段时间可能出现假死 比如程序有 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就能会用。

------解决方案--------------------
看看内存有没有泄露,这种情况比较多,由内存耗尽引起的
------解决方案--------------------
那就使用另外一个串口, 模拟单片机和你的程序通讯, 
或者就用另外一台电脑监控通讯线上的数据, 
看看什么情况下出现死机现象
------解决方案--------------------
程序出现界面死锁问题,可以确定是你的程序的问题,看看你的链表中的数据有没有在处理后删除掉,还有接收部分是的线程你是怎么创建的,你是什么时候读数据的,不会是你自己堵塞了自己吧,帖些代码出来看看.
------解决方案--------------------
在接收线程的收数据过程、主线程的处理显示和绘图这两个地方用临界区做个同步。
另外,为什么不直接在接收线程发消息给主窗口来传递数据呢?这样也省了主线程和接收线程在访问全局链表时做同步。