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

📄 conmunication.cpp

📁 是本人编写的串行通信的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
// Conmunication.cpp : implementation file
//

#include "stdafx.h"
#include "inf of com.h"
#include "Conmunication.h"
#include "afxmt.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CConmunication dialog


CConmunication::CConmunication(CWnd* pParent /*=NULL*/)
	: CDialog(CConmunication::IDD, pParent)
{
	//{{AFX_DATA_INIT(CConmunication)
	m_ShowSend = _T("");
	m_ShowReceive = _T("");
	//}}AFX_DATA_INIT
	hWnd=NULL;
	times=1;
	buf=NULL;
	bLock1=FALSE;
	bLock12=FALSE;
	bLock123=FALSE;
	bVerify=FALSE;
	bVerifyData=FALSE;
	bThread=TRUE;
}

CConmunication::~CConmunication()
{
 delete buf;

}
void CConmunication::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CConmunication)
	DDX_Control(pDX, IDC_BUTTON_Send, m_Send);
	DDX_Control(pDX, IDC_BUTTON_Clr, m_Clear);
	DDX_Control(pDX, IDC_BUTTON_Close, m_Close);
	DDX_Control(pDX, IDC_STATIC_ShowLabel, m_Label);
	DDX_Control(pDX, IDC_EDIT_ShowSend, m_ConEdit);
	DDX_Control(pDX, IDC_PROGRESS1, m_Progress);
	DDX_Text(pDX, IDC_EDIT_ShowSend, m_ShowSend);
	DDX_Text(pDX, IDC_EDIT_ShowReceive, m_ShowReceive);
	DDX_Control(pDX, IDC_MSCOMM1, m_MsComm);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CConmunication, CDialog)
	//{{AFX_MSG_MAP(CConmunication)
	ON_BN_CLICKED(IDC_BUTTON_Send, OnBUTTONSend)
	ON_BN_CLICKED(IDC_BUTTON_Clr, OnBUTTONClr)
	ON_BN_CLICKED(IDC_BUTTON_Close, OnBUTTONClose)
	ON_BN_CLICKED(IDC_RADIO1, OnRadio1)
	ON_BN_CLICKED(IDC_RADIO2, OnRadio2)
	ON_NOTIFY(NM_OUTOFMEMORY, IDC_PROGRESS1, OnOutofmemoryProgress1)
	ON_MESSAGE(WM_CONMUNICATION,ReadData)
	ON_BN_CLICKED(IDC_RADIO3, OnRadio3)
	ON_BN_CLICKED(IDC_RADIO4, OnRadio4)
	ON_BN_CLICKED(IDC_RADIO5, OnRadio5)
	ON_BN_CLICKED(IDC_RADIO6, OnRadio6)
	ON_BN_CLICKED(IDC_RADIO7, OnRadio7)
	ON_BN_CLICKED(IDC_RADIO8, OnRadio8)
	ON_BN_CLICKED(IDC_RADIO9, OnRadio9)
	//}}AFX_MSG_MAP
		
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CConmunication message handlers

void CConmunication::OnCancel() 
{
	// TODO: Add extra cleanup here
	
	//CDialog::OnCancel();
}

void CConmunication::OnOK() 
{
	// TODO: Add extra validation here
	
//	CDialog::OnOK();
}
CEvent ThreadBegin;
CEvent ThreadEnd;
BOOL bReady;
BOOL bFile;	
BOOL bHand;
CConmunication op;	
int size;	
BOOL bSending=FALSE;
CFile file;	
CString str;	
long len;	
UINT ThreadProc(LPVOID param)
{   
//	long len;
	::WaitForSingleObject(ThreadBegin.m_hObject,INFINITE);
//	BOOL KeepRunning=true;
 
/*
        VARIANT variant_inp;
		BYTE rxdata[2048]; 
		long k;
        COleSafeArray safearray_inp;
    	variant_inp=op.m_MsComm.GetInput(); //读缓冲区
        safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
        len=safearray_inp.GetOneDimSize(); //得到有效数据长度
        for(k=0;k<len;k++)
        safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
		long len1=0;
    	while(len1<len-1)
		{
		 // str.Format("%c",rxdata[len1]);
		  //op.m_ShowReceive+=str;
		  //op.UpdateData(FALSE);
          //op.m_Progress.SetPos(len1*600);
			str.Format("%d",len1);
			::PostMessage((HWND)param,WM_UPDATE,0,(LPARAM)(LPCTSTR)str);
          Sleep(600);
		  len1++;
		}*/
	//	if(AfxMessageBox("通信成功!继续发送吗?")==MB_OK)
    	


	
/*	while(KeepRunning)
	{   
		if(op.bSending)
		{
        len=op.m_MsComm.GetOutBufferCount();
		if(len=size+2) 
        ThreadEnd.SetEvent(); 
		if(len==0)
			AfxMessageBox("OK!");
		}
       else
		{
		  VARIANT variant_inp;
          COleSafeArray safearray_inp;
		  BYTE rxdata[2048]; //设置BYTE数组 An 8-bit integerthat is not si  gned.
          CString strtemp;
          variant_inp=op.m_MsComm.GetInput(); //读缓冲区
          safearray_inp=variant_inp; //VARIANT型变量转换为ColeSafeArray型变量
          len=safearray_inp.GetOneDimSize(); //得到有效数据长度 
		  for(k=0;k<len;k++)
          safearray_inp.GetElement(&k,rxdata+k);//转换为BYTE型数组
		  if(bFile)
		  {
		    if(len<size+2)
			{
		       for(k=0;k<size;k++)
		        if( op.bindata[k]==rxdata[k])
				{
	            op.m_Progress.SetPos(k+16*op.times);
				Sleep(700);
				}
	 	        else
				{
		               if(AfxMessageBox("校验失败!重新发送吗?",MB_OK)==MB_OK)
					   {
		                  op.ReSend=TRUE;
		                  op.m_MsComm.SetRThreshold(1);
	                      op.m_MsComm.SetSThreshold(0);
	                      CByteArray reArr;
	                      op.bVerify=FALSE;
	                      if(reArr.GetSize()!=0)
	                      reArr.RemoveAll();
                          reArr.Add(0x06); //给数组赋值
                          COleVariant varOut;
                          varOut=COleVariant(reArr); //将数据转换为变体数据类型
                          op.m_MsComm.SetOutput (varOut); 
		                  op.m_Progress.SetPos(16*op.times);
					   }	
					      break;	 		             
		                  ThreadEnd.SetEvent();
				}//循环
				ThreadEnd.SetEvent();//一帧数据检验完成
			}//len<size+_2
		 op.UpdateData(FALSE);
		  }//bfile
		CString str;
        if(!bHand && !bFile)              
	    	for(l=0;l<size;l++)	    
			{
		     op.m_ShowReceive="接受的字符:";
		     str.Format("%c",rxdata[l]);	      
             op.m_ShowReceive+=str;   
			 Sleep(500);
			}
        ThreadEnd.SetEvent();
		}//接受数据*/
	/*	Result=::WaitForSingleObject(ThreadEnd.m_hObject,0);
		if (Result==WAIT_OBJECT_0)
			KeepRunning=false;		    
		else
			Sleep(1000);
	}*/
//        ::PostMessage((HWND)param,WM_CONMUNICATION,0,0);
	return 0;
}
void CConmunication::OnBUTTONSend() 
{
	// TODO: Add your control notification handler code here
 UpdateData(TRUE); 
 bSending=TRUE;
  if(bFile || bHand)	
  {	

	   if(!bFile && bSending)
	   {	  
		   size=0;
            if(m_ShowSend!="")
	        {
	         if(bytOutArr.GetSize()!=0)
	         bytOutArr.RemoveAll(); 
			 bytOutArr.Add(0xFF);
             m_MsComm.SetOutput(COleVariant(m_ShowSend)); 
             varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型
			// m_MsComm.SetOutput(COleVariant(str));
		     hWnd=GetSafeHwnd();		    
	       //  AfxBeginThread(ThreadProc,NULL);
	        // ThreadBegin.SetEvent();
			}
	        else
	           AfxMessageBox(" 请填写发送内容!"); 
	   }
    	else
		{	     
	     if(bytOutArr.GetSize()!=0)
	     bytOutArr.RemoveAll(); 
	     for(int i=0;i<sizeof(bindata);i++)
         bytOutArr.Add(bindata[i]); //给数组赋值
		 bytOutArr.Add(0xFF);
		 bytOutArr.Add(0xFF);//数据以4个F为结束标识
         varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型
		 hWnd=GetSafeHwnd();
		 bSending=TRUE;
		 m_MsComm.SetOutput(varOut);
	     AfxBeginThread(ThreadProc,hWnd);
	     ThreadBegin.SetEvent();
		}
		m_MsComm.SetOutput(varOut);
//	}
//	else
   // AfxMessageBox(" 正在准备线路!");
  }
  else
  {
    AfxMessageBox("请选择发送方式!");
  }
        
   /*  UpdateData(TRUE);
	size=0;
            if(m_ShowSend!="")
	        {

			 m_MsComm.SetOutput(COleVariant(m_ShowSend)); 

			 m_ShowReceive="正在通信中....";
			 UpdateData(FALSE);	/*	     
			}*/
}
void CConmunication::ReadData()
{
if(bFile || bHand)
{
   if(!ReSend)
   {
     if(bFile)
     size=file.Read(bindata,sizeof(bindata));
     else
	 {
        if(bytOutArr.GetSize()!=0)
        bytOutArr.RemoveAll(); 
        int j;
        size=0;
        for(j=times*16;j<((times+1)*16) && j<m_ShowSend.GetLength();j++)
		{
          bytOutArr.Add(buf[j]);
          size++;  
		}

	 }
    times++;
	bytOutArr.Add(0xFF);
    bytOutArr.Add(0xFF);
   }
 ReSend=FALSE;
 if(size==0)
 {
	 m_ShowSend="";
	 UpdateData(FALSE);
	if(MessageBox("通信成功!继续发送吗?","成功提示",MB_OK|MB_ICONINFORMATION)==MB_OK)
	{

	 m_MsComm.SetRThreshold(1);
	 m_MsComm.SetSThreshold(0);
	 CByteArray reArr;
	 bVerify=FALSE;
	 bFile=FALSE;
	 bHand=FALSE;
	// BYTE Byte=0x06;//准备发送
     reArr.Add(ControlByte); //给数组赋值
     COleVariant varOut;
	 if(reArr.GetSize()!=0)
		reArr.RemoveAll();
     varOut=COleVariant(reArr); //将数据转换为变体数据类型
     m_MsComm.SetOutput (varOut); 
	}
	 
 }
 else
 {

	if(bFile)
	{
	m_MsComm.SetSThreshold(0);
	CByteArray reArr;
	if(reArr.GetSize()!=0)
		reArr.RemoveAll();
	BYTE Byte=0x0A;//准备校验
    reArr.Add(Byte); //给数组赋值
    COleVariant varOut;
    varOut=COleVariant(reArr); //将数据转换为变体数据类型
    m_MsComm.SetOutput (varOut); 
	}
	else
	{
       varOut=COleVariant(bytOutArr); //将数据转换为变体数据类型
       hWnd=GetSafeHwnd();
       bSending=TRUE;
       m_MsComm.SetOutput(varOut); 
       AfxBeginThread(ThreadProc,hWnd);
       ThreadBegin.SetEvent(); 
	}
 }
}
else
{
  m_MsComm.SetRThreshold(18);			
  m_MsComm.SetSThreshold(0);	
}
}
void CConmunication::OnBUTTONClr() 
{
	// TODO: Add your control notification handler code here
	m_ShowSend="";
	UpdateData(FALSE);

⌨️ 快捷键说明

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