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

📄 serial.cpp

📁 此程序是基于BC4的蓝牙CE应用程序
💻 CPP
字号:
// Serial.cpp: implementation of the CSerial class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "A39cmd.h"
//#include "CMD_COLLECTION.h"
#include "Serial.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$全局变量$$$$$$$$$$$$$$$$$$$$$$$$$$

HANDLE hport;
unsigned char recv_buf[1024] ;
DWORD m_recv_index=0;
DWORD old_index_I=0,old_index_E=0;
DWORD judge_success_cnt=0;
COMSTAT comstate;
DWORD FLG_bt_into_talking,FLG_bt_release;
//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

void Judge()
{
  CString str,str1;
  TCHAR temp;
  str1= recv_buf;
   if( str1.Find('I')>0)
   {
      FLG_bt_into_talking=1;
   }

}



//////////////////////////////////////////////////////////////////////////////
DWORD WINAPI ReadPortThread(LPVOID lpvoid)
{
    CString str;
    char  BUF;
	DWORD  dwComEvent,dwlength=0;
	BOOL recv_flg;
	BOOL new_flg=FALSE;
	unsigned int temp_i=0;
	DWORD err;
    //DWORD err =CE_RXOVER |CE_OVERRUN |CE_BREAK |CE_FRAME |CE_IOE ;
//	COMSTAT comstate;
	while(hport!=INVALID_HANDLE_VALUE)
	{ 
		::SetCommMask(hport,EV_RXCHAR );
		recv_flg=WaitCommEvent(hport,&dwComEvent,NULL);
	   ::SetCommMask(hport,EV_RXCHAR  );
	   if((dwComEvent&EV_RXCHAR)==EV_RXCHAR)
	{
			 ClearCommError(hport, 
				           &err,
						   &comstate
						   );
			 do
			 {
			  ::ReadFile(hport,&BUF,1,&dwlength,NULL);
			 if(dwlength==1)
			 {
			  recv_buf[m_recv_index++]=(unsigned char)BUF;
			  if(m_recv_index==1023)
			  {
			    memset(&recv_buf,NULL,1024);
				m_recv_index=old_index_E=old_index_I=0;
			  }
			 }
			  Judge();
			 }while(dwlength==1);
	}
	
		//退出wait后要从新进行设置
	   ::SetCommMask(hport,EV_RXCHAR  );	  
  
	}
//	::AfxMessageBox(_T("hport failed"));
  return 1;

}

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

CSerial::CSerial()
{

}

CSerial::~CSerial()
{
 cy_ClosePort(); 
}

///////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////
BOOL CSerial::cy_initDCB()
{
	CString str;
if(!GetCommState(hport, &m_dcb))
	{
	
		CloseHandle(hport);
		return FALSE;
	}
    memset(&m_dcb   ,0   ,sizeof(DCB));     
    m_dcb.DCBlength=sizeof(m_dcb);   
    
	m_dcb.BaudRate =CBR_19200;
	m_dcb.ByteSize = 8;
	m_dcb.Parity =NOPARITY ;
	m_dcb.StopBits =ONESTOPBIT;
	m_dcb.fBinary=TRUE;
	m_dcb.fDsrSensitivity=false;
	m_dcb.fParity=NOPARITY;
	m_dcb.fOutX=false;
	m_dcb.fInX=false;
	m_dcb.fNull=false;
	m_dcb.fAbortOnError=TRUE;
	m_dcb.fOutxCtsFlow=FALSE;
	m_dcb.fOutxDsrFlow=false;
	m_dcb.fDtrControl=DTR_CONTROL_DISABLE;
	m_dcb.fDsrSensitivity=false;
	m_dcb.fRtsControl=RTS_CONTROL_DISABLE;
	m_dcb.fOutxCtsFlow=false;
	m_dcb.fOutxCtsFlow=false;
	
  //	m_dcb.XonChar = 0xff;
  //  m_dcb.XoffChar =0xfe;
   // m_dcb.XonLim = 20;
   // m_dcb.XoffLim =20;


    //根据bcd配置端口
   if(!SetCommState(hport,&m_dcb))
   {
	
	   CloseHandle(hport);
	   return FALSE;
   }
   return TRUE;

}
////////////////////////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////////////////////


BOOL CSerial::cy_SetTimeOut()
{
DWORD err;

CString str;
//等到指定元器件的指定超时设置
if(!GetCommTimeouts(hport,&m_timeout))
{

	 return FALSE;
}

//在通讯线上到达的两个字符之间的时间间隔
m_timeout.ReadIntervalTimeout = MAXDWORD; 
//指定乘数,用于计算在读数据期间的timeout总数,被乘数是请求要接收的字节数,
m_timeout.ReadTotalTimeoutMultiplier=0;
//指定一个定量,在乘完后就加上
m_timeout.ReadTotalTimeoutConstant=0;
m_timeout.WriteTotalTimeoutConstant=1000;
m_timeout.WriteTotalTimeoutMultiplier=0;
    if(!SetCommTimeouts(hport,&m_timeout))
	{

		err=::GetLastError();
 
          return FALSE;
	}
 return TRUE;

}
////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////////////////

BOOL CSerial::cy_OpenPort()
{
    CString str;
   //==========================

	hport=CreateFile(TEXT("COM5:"),GENERIC_READ|GENERIC_WRITE,0,NULL,
		                   OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
		 
        if(hport==INVALID_HANDLE_VALUE)
		{
    		 DWORD err;
	    	err=::GetLastError();
//      	     str="create file failed";
//           ::AfxMessageBox(str);
		}
    cy_initDCB();
   if(!cy_SetTimeOut()) 
	{
       return FALSE;
   }
     //指定端口监控事件----接收字符
	 ::SetCommMask(hport,EV_RXCHAR);
	 //指定内部buffer
	 if(!SetupComm(hport,1024,1024))
	 { }
     //初始化缓冲区数据,这个函数还能中止读写操作
	 
	 PurgeComm(hport,     PURGE_TXABORT |   
		                  PURGE_RXABORT  |     
                          PURGE_TXCLEAR | 
						  PURGE_RXCLEAR   );  
	 
     return TRUE;
} 
/////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////
BOOL CSerial::cy_write( BYTE *pcmd,unsigned int num)
{
  DWORD iBytesWritten;
  CString str;
//BYTE ZCMD_DIAIL_NUMBER[]={ 0x20,0x28,0x31,0x33,0x36,0x33,0x32,0x36,0x39,0x37,0x34,0x31,0x33,0x29};
   
    if(!WriteFile(hport,pcmd, num, &iBytesWritten, NULL) )
	{
     str="failed to write to the port";
//	::AfxMessageBox(str);
	return FALSE;
	}




   return TRUE;
}
////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////
  BOOL CSerial::cy_ClosePort()
  {
	  CString str;
	  if(!CloseHandle(hport))
	  {
	   return FALSE;
	  }
	  else
	  {
	  hport = INVALID_HANDLE_VALUE;
	  return TRUE;
	  }
  }
///////////////////////////////////////////////////////////////////
  BOOL CSerial::cy_Read()
  {
	 HANDLE hReadThrd;
     hReadThrd=::CreateThread(NULL,0,
		                    ReadPortThread,
							0,      //不需要这个参数,所以设成0
                            0,     //The thread runs immediately after creation.
							NULL);
							
    if(hReadThrd==INVALID_HANDLE_VALUE)
	{
		CString str;
	//	str="thread failed";
	//	::AfxMessageBox(str);
		return FALSE;
	}
    else 
	{
    	m_connected=TRUE;
		return FALSE;
	}
  }
  
 /////////////////////////////////////////////////////////////////////
 ////////////////读指定字节的数据///////////////////////////
DWORD CSerial::ReadFromA(TCHAR Buf[], DWORD Count)
{

	DWORD dwBytesTransferred;
     ReadFile (hport, recv_buf, Count, &dwBytesTransferred, 0);
    return dwBytesTransferred;
}

⌨️ 快捷键说明

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