⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 comreadthread.cpp

📁 用多线程技术编写串行通信协议
💻 CPP
字号:
// comreadthread.cpp
#include "StdAfx.h"
#include "Resource.h"
#include "comreadthread.h"
#include "MainFrm.h"
#include "comdebugDoc.h"
#include "comdebugView.h"

UINT comreadthread(LPVOID pParam)
{
	

	DWORD nbyte=0;
	COMMTIMEOUTS	timeout;
	unsigned char inbuff[1024];
	DWORD dwerrormask;
	COMSTAT comstat;
	CString recascstr;
	int inbyte,la=0	,allrecevie=0,recascline=0;

	CMainFrame *mainframe=(CMainFrame *)pParam;
	CComdebugView *pcomdebugview=(CComdebugView *)mainframe->GetActiveView();
	CComdebugDoc *pcomdebugdoc=(CComdebugDoc *)pcomdebugview->GetDocument();
	if(!(mainframe->lpcommprop->dwProvCapabilities&PCF_INTTIMEOUTS))
	   { 
		 AfxMessageBox("Can't set interval timeouts");//,NULL,MB_OK);
	     AfxEndThread(0); 
		} 
	::GetCommTimeouts(mainframe->hcomm,&timeout);
	timeout.ReadTotalTimeoutMultiplier=5;
	timeout.ReadTotalTimeoutConstant=5000;
	::SetCommTimeouts(mainframe->hcomm,&timeout);//设置超时
	while(mainframe->readendflag)
	{
		ClearCommError(mainframe->hcomm,&dwerrormask,&comstat);
		if(dwerrormask)
		{
			mainframe->MessageBox("串口发生错误");
			return 0;
		}
		if(comstat.cbInQue)
		{	
			inbyte=comstat.cbInQue;
		}
		else
		{
			continue;
		}
   		if(!::ReadFile(mainframe->hcomm,inbuff,inbyte,&nbyte,NULL))//读端口
		{
			mainframe->MessageBox( "接收错误");
			return 0;
		}
		else
		{
		  if(nbyte)
		  { 
			  unsigned int i;
			  CString convertstr;
			  if(la==0)
			  { 
				  pcomdebugdoc->inputdata+="*HEX code-!";
				  la++;
			  }

			  for(i=0;i<nbyte;i++)
			  {	
				  allrecevie++;
				  if(!isgraph(inbuff[i]))
				  recascstr+='?';
				  else 
				  recascstr+=inbuff[i];
				  convertstr.Format("%x",inbuff[i]/16);
				  convertstr.MakeUpper();
				  pcomdebugdoc->inputdata+=convertstr;
				  convertstr.Format("%x",inbuff[i]%16);
				  convertstr.MakeUpper();
				  pcomdebugdoc->inputdata+=convertstr;
				  pcomdebugdoc->inputdata+=' ';
				  if(allrecevie%16==0)
				  {
					  pcomdebugdoc->inputdata+="\r\n           ";
					  pcomdebugdoc->linenum++;
				  }
				  if(allrecevie%32==0)
				  {
					  recascstr+="\r\n          ";
					  recascline++;
				  }
			  }
			  mainframe->paintcase=PAINT_COMMUICAT;			  
			  pcomdebugview->Invalidate(TRUE);
		  }
		}
	}
	::PurgeComm(mainframe->hcomm,PURGE_RXCLEAR);
	if(nbyte==0)
	{
		pcomdebugdoc->inputdata+="*Nothing.....";
		mainframe->paintcase=PAINT_COMMUICAT;			  		
		pcomdebugview->Invalidate(TRUE);
		return 0;
	}
	pcomdebugdoc->inputdata+="\r\n*ASC code-";
	pcomdebugdoc->linenum++;
	pcomdebugdoc->linenum+=recascline;
	pcomdebugdoc->inputdata+=recascstr;	
	mainframe->paintcase=PAINT_COMMUICAT;			  
	pcomdebugview->Invalidate(TRUE);
	mainframe->MessageBox("接收结束");
	return 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -