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

📄 comm.cpp

📁 FIRA 3对3 机器人足球PC端控制程序。
💻 CPP
字号:
//Comm.cpp Rs232c烹脚阑 窍扁 困茄 努贰胶
#include "stdafx.h"
#include "comm.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

IMPLEMENT_DYNCREATE(CComm, CObject)



CComm::CComm( )
{
   idComDev=NULL;
   bFlowCtrl= FC_XONXOFF ;
   fConnected      = FALSE ;
}

CComm::~CComm( )
{
    DestroyComm();
}

//BEGIN_MESSAGE_MAP(CComm, CObject)
	//{{AFX_MSG_MAP(CComm)
		// NOTE - the ClassWizard will add and remove mapping macros here.
	//}}AFX_MSG_MAP
//END_MESSAGE_MAP()


/////////////////////////////////////////////////////////////////////////////
// CComm message handlers
//CommWatchProc()
//烹脚阑 窍绰 橇肺技历 溜 单捞鸥啊 甸绢吭阑措 皑矫窍绰
//风凭 夯风凭篮 OpenComPort 窃荐 角青矫 橇肺矫历肺 楷搬凳
//OpenComPort 窃荐 曼炼
DWORD CommWatchProc(LPVOID lpData)
{
   DWORD       dwEvtMask ;
   OVERLAPPED  os ;
   CComm*      npComm = (CComm*) lpData ;
   char InData[MAXBLOCK + 1];
	int        nLength ;
   //idCommDev 扼绰 勤甸俊 酒公繁 com 器飘啊 救嘿绢 勒栏搁
   // 俊扼 府畔
   if ( npComm == NULL || 
      !npComm->IsKindOf( RUNTIME_CLASS( CComm ) ) )
      return (DWORD)(-1);

   memset( &os, 0, sizeof( OVERLAPPED ) ) ;


   os.hEvent = CreateEvent( NULL,    // no security
                            TRUE,    // explicit reset req
                            FALSE,   // initial event reset
                            NULL ) ; // no name
   if ( os.hEvent == NULL )
   {
      MessageBox( NULL, "Failed to create event for thread!", "comm Error!",
                  MB_ICONEXCLAMATION | MB_OK ) ;
      return ( FALSE ) ;
   }

   if (!SetCommMask(npComm->idComDev, EV_RXCHAR ))
      return ( FALSE ) ;

   while (npComm->fConnected )
   {
		dwEvtMask = 0 ;

		WaitCommEvent(npComm->idComDev, &dwEvtMask, NULL );

		if ((dwEvtMask & EV_RXCHAR) == EV_RXCHAR)
		{

			do
		   {
			   memset(InData,0,80);
				if (nLength = npComm->ReadCommBlock((LPSTR) InData, MAXBLOCK ))
				{
                  npComm->SetReadData(InData);
               //捞镑俊辑 单捞鸥甫 罐绰促.
		      	}
		   }
		   while ( nLength > 0 ) ;
		}
   }

  
   CloseHandle( os.hEvent ) ;


   return( TRUE ) ;

} 
//单捞鸥甫 老绊 单捞鸥甫 佬菌促绰
//皋技瘤甫 府畔茄促.
void CComm::SetReadData(LPSTR data)
{
   lstrcpy((LPSTR)abIn,(LPSTR)data);
   //ConverData
   //汲沥等 扩档快俊 WM_RECEIVEDATA皋技瘤甫
   //朝妨林绢 泅力 单捞鸥啊 甸绢吭促绰巴阑
   //舅妨霖促.
   SendMessage(m_hwnd,WM_RECEIVEDATA,0,0);
}
//皋技瘤甫 傈崔且 hwnd汲沥
void CComm::SetHwnd(HWND hwnd)
{
   m_hwnd=hwnd;
}
//哪器飘甫 汲沥茄促.
void CComm::SetComPort(int port,DWORD rate,BYTE bytesize,BYTE stop,BYTE parity)
{
   bPort=port;
   dwBaudRate=rate;
   bByteSize=bytesize;
   bStopBits=stop;
   bParity=parity;
}
//XonOff 溜 府畔蔼 歹喉 汲沥
void CComm::SetXonOff(BOOL chk)
{
   fXonXoff=chk;
}
void CComm::SetDtrRts(BYTE chk)
{
   bFlowCtrl=chk;
}
//哪器飘 沥焊甫 父电促.
//捞巴阑 父甸锭 捞傈俊 且老捞
// SetComPort(); -> SetXonOff() ->SetDtrRts() 茄促澜 汲沥茄促.
BOOL CComm::CreateCommInfo()
{


   osWrite.Offset = 0 ;
   osWrite.OffsetHigh = 0 ;
   osRead.Offset = 0 ;
   osRead.OffsetHigh = 0 ;

//捞亥飘 芒备 汲沥
   osRead.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL ) ; 
   if (osRead.hEvent == NULL)
   {
      return FALSE ;
   }
   osWrite.hEvent = CreateEvent( NULL,   TRUE,  FALSE,   NULL ) ;
   if (NULL == osWrite.hEvent)
   {
      CloseHandle( osRead.hEvent ) ;
      return FALSE;
   }


   return TRUE ;

} 

//com 器飘甫 凯绊 楷搬阑 矫档茄促.
//OpenComport()
BOOL CComm::OpenComPort( )
{            
   char       szPort[ 15 ] ;
   BOOL       fRetVal ;
   COMMTIMEOUTS  CommTimeOuts ;


   if (bPort > MAXPORTS)
      lstrcpy( szPort, "\\\\.\\TELNET" ) ;
   else
      wsprintf( szPort, "COM%d", bPort ) ;

   // COMM device甫 拳老屈侥栏肺 楷搬茄促.

   if ((idComDev =
      CreateFile( szPort, GENERIC_READ | GENERIC_WRITE,
                  0,                    // exclusive access
                  NULL,                 // no security attrs
                  OPEN_EXISTING,
                   FILE_ATTRIBUTE_NORMAL | 
                  FILE_FLAG_OVERLAPPED, // overlapped I/O
                  NULL )) == (HANDLE) -1 )
      return ( FALSE ) ;
   else
   {
      //哪器飘俊辑 单捞鸥甫 背券窍绰 规过阑 char窜困甫 扁夯栏肺 汲沥
      //窍磊
      SetCommMask( idComDev, EV_RXCHAR ) ;
      SetupComm( idComDev, 4096, 4096 ) ;
      //叼官捞胶俊 静饭扁啊 乐阑瘤 葛福聪鳖 柄昌捞 没家甫 窍磊!
      PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |
                                      PURGE_TXCLEAR | PURGE_RXCLEAR ) ;

     
      CommTimeOuts.ReadIntervalTimeout = 0xFFFFFFFF ;
      CommTimeOuts.ReadTotalTimeoutMultiplier = 0 ;
      CommTimeOuts.ReadTotalTimeoutConstant = 1000 ;
      CommTimeOuts.WriteTotalTimeoutMultiplier = 0 ;
      CommTimeOuts.WriteTotalTimeoutConstant = 1000 ;
      SetCommTimeouts( idComDev, &CommTimeOuts ) ;
   }

   fRetVal = SetupConnection() ;

   if (fRetVal)//楷搬捞 登菌促搁 fRetVal TRUE捞骨肺
   {
      fConnected = TRUE ;//楷搬登菌促绊 富秦淋
      //橇肺矫傈甫 CommWatchProc俊 楷搬窍聪鳖 唱吝俊 单捞鸥啊 吭促艾促
      //窍搁 葛电 郴侩篮 CommWatchProc啊 淬寸茄促.
      AfxBeginThread((AFX_THREADPROC)CommWatchProc,(LPVOID)this);
   }
   else
   {
      fConnected = FALSE ;
      CloseHandle( idComDev) ;
   }

   return ( fRetVal ) ;

} 

//拳老肺 汲沥等 哪器飘客 角龙 器飘客 楷搬阑 矫挪促.
//SetupConnection 捞傈俊 CreateComPort甫 秦林绢具 茄促.
BOOL CComm::SetupConnection()
{
   BOOL       fRetVal ;
//   BYTE       bSet ;
   DCB        dcb ;

   dcb.DCBlength = sizeof( DCB ) ;

   GetCommState( idComDev, &dcb ) ;//dcb狼 扁夯蔼阑 罐绰促.


   //捞何盒阑 荐沥秦具 钦聪促.
   dcb.BaudRate = dwBaudRate;//傈价加档
   dcb.ByteSize = bByteSize ;//单捞鸥厚飘
   dcb.Parity = bParity;//菩府萍 眉农
   dcb.StopBits = bStopBits;//胶砰厚瓢

   dcb.fOutxDsrFlow =0 ;//Dsr Flow
   dcb.fDtrControl = DTR_CONTROL_ENABLE ;//Dtr Control
   dcb.fOutxCtsFlow = 0 ;//Cts Flow
   dcb.fRtsControl = RTS_CONTROL_ENABLE ; //Ctr Control
   dcb.fInX = dcb.fOutX = 1 ; //XON/XOFF 包茄巴
   dcb.XonChar = ASCII_XON ;
   dcb.XoffChar = ASCII_XOFF ;
   dcb.XonLim = 100 ;
   dcb.XoffLim = 100 ;
   dcb.fBinary = TRUE ;
   dcb.fParity = TRUE ;



   dcb.fBinary = TRUE ;
   dcb.fParity = TRUE ;

   fRetVal = SetCommState( idComDev, &dcb ) ; //函版等 Dcb 汲沥

   return ( fRetVal ) ;

} 

//哪器飘肺 何磐 单捞鸥甫 佬绰促.
int CComm::ReadCommBlock(LPSTR lpszBlock, int nMaxLength )
{
	BOOL       fReadStat ;
	COMSTAT    ComStat ;
	DWORD      dwErrorFlags;
	DWORD      dwLength;

	// only try to read number of bytes in queue 
	ClearCommError( idComDev, &dwErrorFlags, &ComStat ) ;
	dwLength = min( (DWORD) nMaxLength, ComStat.cbInQue ) ;

	if (dwLength > 0)
	{
		fReadStat = ReadFile( idComDev, lpszBlock,
		                    dwLength, &dwLength, &osRead ) ;
		if (!fReadStat)
		{
         //捞镑俊 俊扼甫 持绰巴捞促.
         //溜 ReadFile 沁阑锭 单捞鸥啊 力措肺 救唱坷搁 fReadState俊 咯矾
         //俊扼 内靛甫 府畔茄促. 捞锭 汗备且荐乐栏搁 亮瘤父 角龙利牢
         //汗备啊 阂啊瓷窍促 蝶扼辑 犁价免阑 秦崔扼绰 皋技瘤甫 秦林绰巴捞
         //亮促.
		}
   }
   
   return ( dwLength ) ;

} 
//哪器飘甫 肯傈洒 秦力茄促.

BOOL CComm::DestroyComm()
{


   if (fConnected)
      CloseConnection( ) ;


   CloseHandle( osRead.hEvent ) ;
   CloseHandle( osWrite.hEvent ) ;

   return ( TRUE ) ;

} 

//楷搬阑 摧绰促.
BOOL CComm::CloseConnection()
{

   // set connected flag to FALSE

   fConnected = FALSE ;

   // disable event notification and wait for thread
   // to halt

   SetCommMask( idComDev, 0 ) ;



   EscapeCommFunction( idComDev, CLRDTR ) ;


   PurgeComm( idComDev, PURGE_TXABORT | PURGE_RXABORT |
                                   PURGE_TXCLEAR | PURGE_RXCLEAR ) ;
   CloseHandle( idComDev ) ;
   return ( TRUE ) ;

} 



BOOL CComm::WriteCommBlock( LPSTR lpByte , DWORD dwBytesToWrite)
{

	BOOL        fWriteStat ;
	DWORD       dwBytesWritten ;


	fWriteStat = WriteFile( idComDev, lpByte, dwBytesToWrite,
	                       &dwBytesWritten, &osWrite ) ;


	if (!fWriteStat) 
	{
      //哪器飘俊 单捞鸥甫 力措肺 结持瘤 给沁阑版快捞促.
      //捞锭绰 绢痘霸 且鳖 弊巴篮 荤侩磊 付澜捞摆促.
      //促矫 焊郴绊 酵栏搁 力蓖价免阑 窍搁 等促.
      //弊矾唱 林狼痢 公茄 风橇甫 倒荐 乐促绰痢阑 积阿窍扼
	}
	return ( TRUE ) ;

} 

⌨️ 快捷键说明

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