• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 控制台串口程序运行一段时间突然停止不运行了,为什么呢?

控制台串口程序运行一段时间突然停止不运行了,为什么呢?

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了串口控制台,c语言控制台程序,控制台程序,控制台应用程序,c#控制台程序一闪而过等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 控制台串口程序运行一段时间突然停止不运行了,为什么呢?
描述:

#include "stdafx.h"
#include "Comm.h"
#include "Serial.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// The one and only application object
CWinApp theApp;
SerialPort ite;
CString ss;
char lpBuffer[1024]; 
CStringList Data;
HANDLE m_hComm; /* 串口操作句柄 */
HANDLE hCommThread; //全局变量,串口线程
UINT SerialPort1ThreadProcess(HWND hSendWnd);
OVERLAPPED osWrite;
OVERLAPPED osRead; 
using namespace std;
int _tmain(int argc, TCHAR* argv[], TCHAR* envp[])
{
int nRetCode = 0;
    ite.OpenPort();
DWORD threadID;
    hCommThread=CreateThread((LPSECURITY_ATTRIBUTES)NULL,0,
(LPTHREAD_START_ROUTINE)SerialPort1ThreadProcess,
NULL, 0, &threadID);
//::SetThreadPriority(hCommThread,THREAD_PRIORITY_BELOW_NORMAL);
if (hCommThread == NULL)
{ 
::printf("创建串口1处理线程失败"); 
::PostQuitMessage(0); 
} 
// initialize MFC and print and error on failure
// TODO: code your application's behavior here.
// CString strHello;
// strHello.LoadString(IDS_HELLO);
// cout << (LPCTSTR)strHello << endl;
while(1)
{
           Sleep(1);
//    int l=0;
//    l=ss.GetLength();
//    printf("l==========================%d\n",l);
//    ss.Format("%s",lpBuffer);
//    Data.AddHead(ss);
   Data.AddHead("@00RD0000000157*\r");
   while (!Data.IsEmpty())
   {
  printf("发送数据send!\n");
   CString str;
   str=Data.GetHead();
 //             cout <<(LPCTSTR)str << endl;
  Sleep(50);   
  ite.OnSend(str);
              Data.RemoveAll();
   }
   printf("主循环!\n");
   
        }
return nRetCode;
}
UINT SerialPort1ThreadProcess(HWND hSendWnd)
{
while (1)
{
DWORD dwEvtMask=0; //读取的字节数
LPOVERLAPPED os;
memset(&os,0,sizeof(os));
memset(&osRead,0,sizeof(OVERLAPPED)); 
    osRead.Offset=0;   
    osRead.OffsetHigh=0;   
    osRead.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL); 
SetCommMask(m_hComm,EV_RXCHAR|EV_TXEMPTY);//有哪些串口事件需要监视?
    WaitCommEvent(m_hComm,&dwEvtMask,os);//等待串口通信事件的发生
if ((dwEvtMask & EV_RXCHAR)==EV_RXCHAR)
{
   COMSTAT ComStat;
           DWORD dwLength;
   DWORD dwErrorFlags;
           DWORD dwError;
   DWORD dwBytesRead=0;
  
   ClearCommError(m_hComm,&dwErrorFlags,&ComStat);//此句子可以用来确定收到的字节数
     dwLength=ComStat.cbInQue; //上一句算出收到的字节数之后赋给dwLength
   
     if (dwLength>=10)//也许是去掉噪声
   {
    BOOL fReadStat; 
fReadStat=ReadFile(m_hComm,lpBuffer,dwLength,&dwBytesRead,&osRead);
if (!fReadStat)
{
 if (GetLastError()==ERROR_IO_PENDING)
 {  
 while(!GetOverlappedResult(m_hComm,&osRead,&dwBytesRead,TRUE))
 {
 dwError=GetLastError();   
                             if(dwError==ERROR_IO_INCOMPLETE)   
 continue;   
 else
                             {
 //wsprintf(dwError, "<CE-%u>", dwError ) ;
                                 ClearCommError(m_hComm,&dwErrorFlags,&ComStat);
                                 break;
 } 
 }
 }
         else
{
                      dwLength=0;
                      ClearCommError(m_hComm, &dwErrorFlags, &ComStat );
}
}
printf("dwLength==========================%d\n",dwLength);
ss.Format("%s",lpBuffer);
if(ss=="@00RD00123452*\r")
{
printf("返回成功receive!\n");
// cout << (LPCTSTR)ss << endl;
  }
   }
}
printf("进程循环中\n");
}
return TRUE;
} 


解决方案1:

这明显是不断申请内存而且有完没被释放,这么改试试:
while (!Data.IsEmpty())
{
Data.AddHead("@00RD0000000157*\r");
printf("发送数据send!\n");
CString str;
str=Data.GetHead();
 // cout <<(LPCTSTR)str << endl;
Sleep(50);   
ite.OnSend(str);
  Data.RemoveAll();
}
就是把Data.AddHead("@00RD0000000157*\r");这条语句放在while (!Data.IsEmpty())里,因为这条语句是不断在执行,只有Data不为空时才被释放


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 控制台串口程序运行一段时间突然停止不运行了,为什么呢?

相关文章

  • 2017-06-05 我写了个gui的扫描器,但是只要多个扫描线程启动后,界面就不能动了,相应不了用户操作
  • 2017-06-04 ATL项目中怎样建立继承于IUnknown的没有任何实现的基接口?
  • 2017-06-05 一个APIHOOK的问题~
  • 2017-06-05 请高手指点,为什么我的程序启动后界面就会冻结死掉!~~~
  • 2017-06-05 ReadProcessMemory问题:
  • 2017-06-04 ATL中的[out]向外传值总是未空
  • 2017-06-04 在ocx控件中动态取除edit的边框
  • 2017-06-04 怎样写一个基于对话框的ActiveX?
  • 2017-06-05 vector无法使用自定义的类vc++60
  • 2017-06-05 VC中怎样调用COM组件中的函数?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • 现金求助:如何制作MSN各版本的插件
    • 使用WTL库,编译提示“cannotopenincludefile"atlresh"”,这是怎么回事?
    • 请问线程问题
    • 外部程序运行arx代码
    • 求助:DCOM调用安全问题,异机调用返回E_ACCESSDENIED
    • 函数调用的问题!
    • 知道一个线程的名称,通过程序怎么知道是否在运行?
    • IMsTscAx,IMsRdpClient这些接口在哪些头文件里面?
    • 为什么我的com组件用php调用不起来
    • 为什么MFC程序可以只支持ActiveX而不支持Automation?

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有