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

📄 commthread.cpp

📁 Read nmea file and send to com port. you can easly simulate the gps application
💻 CPP
字号:
#include "stdafx.h"
#include "CommThread.h"

extern HWND hCommWnd;


void CQueue::Clear()
{
	m_iHead = m_iTail =0;
	memset(buff,0,BUFF_SIZE);
}
CQueue::CQueue()
{
	Clear();
}
int CQueue::GetSize()
{
	return (m_iHead - m_iTail + BUFF_SIZE) % BUFF_SIZE;
}
BOOL CQueue::PutByte(BYTE b)
{
	if(GetSize() == (BUFF_SIZE-1)) return FALSE;
	buff[m_iHead++] =b;
	m_iHead %= BUFF_SIZE;
	return TRUE;
}
BOOL CQueue::GetByte(BYTE *pb)
{
	if(GetSize() == 0) return FALSE;
	*pb = buff[m_iTail++];
	m_iTail %= BUFF_SIZE;
	return TRUE;
}
//--- 努贰胶 积己磊
CCommThread::CCommThread()
{

	//--> 檬扁绰 寸楷洒..器飘啊 凯府瘤 臼篮 惑怕咯具摆烈?
	m_bConnected = FALSE;

}

CCommThread::~CCommThread()
{

}


// 器飘 sPortName阑 dwBaud 加档肺 楷促.
// ThreadWatchComm 窃荐俊辑 器飘俊 公攫啊 佬躯阑 锭 MainWnd俊 舅府扁
// 困秦 WM_COMM_READ皋矫瘤甫 焊尘锭 鞍捞 焊尘 wPortID蔼阑 傈崔 罐绰促.
BOOL CCommThread::OpenPort(WORD wPortID, CString strPortName, DWORD dwBaud )
{

	// Local 函荐.
		COMMTIMEOUTS	timeouts;
		DCB				dcb;
		DWORD			dwThreadID;
		int				err;

		m_wPortID = wPortID;
		
		// overlapped structure 函荐 檬扁拳.
		m_osRead.Offset = 0;
		m_osRead.OffsetHigh = 0;
		//--> Read 捞亥飘 积己俊 角菩..
		if ( !(m_osRead.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)) ) 	
		{
			return FALSE;
		}
	

		m_osWrite.Offset = 0;
		m_osWrite.OffsetHigh = 0;
		//--> Write 捞亥飘 积己俊 角菩..
		if (! (m_osWrite.hEvent = CreateEvent(NULL, TRUE, FALSE, NULL)))
		{
			return FALSE;
		}
		
		//--> 器飘疙 历厘..
		m_sPortName = strPortName;
	
		//--> 角力利牢...RS 232 器飘 凯扁..
		m_hComm = CreateFile( m_sPortName, 
							  GENERIC_READ | GENERIC_WRITE, 0, NULL,
							  OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
							  NULL);

	
		//--> 器飘 凯扁俊 角秦窍搁..
		if (m_hComm == (HANDLE) -1)
		{
			AfxMessageBox("fail Port ofen");
			return FALSE;
		}
	



	// dcb 汲沥.... 器飘狼 角力利牢..力绢甫 淬寸窍绰 DCB 备炼眉蔼 悸泼..
	dcb.DCBlength = sizeof(DCB);

	//--> 泅犁 汲沥等 蔼 吝俊辑..
	err = GetCommState( m_hComm, &dcb);	
	if (err < 0)
	{
		AfxMessageBox("Could not get comm state", MB_OK|MB_ICONSTOP);
	    return FALSE;
	}

	///////////////////////////////////////////////////////////////////////////
	// Need to se te baud seperately
	dcb.BaudRate = (DWORD)dwBaud;
	dcb.Parity = NOPARITY;
	dcb.StopBits = ONESTOPBIT;
	dcb.ByteSize = 8;

	dcb.fBinary = TRUE;						// binary mode, no EOF check 
	dcb.fOutxCtsFlow = FALSE;				// CTS output flow control 
	dcb.fOutxDsrFlow = FALSE;				// DSR output flow control 
	dcb.fDtrControl = DTR_CONTROL_DISABLE;  // DTR flow control type 
	dcb.fDsrSensitivity = FALSE;			// DSR sensitivity 
	dcb.fOutX = FALSE;						// XON/XOFF out flow control 
	dcb.fInX =	FALSE;						// XON/XOFF in flow control 
	dcb.fNull = FALSE;						// enable null stripping 
	dcb.fRtsControl=RTS_CONTROL_DISABLE;	// RTS flow control 
	dcb.fAbortOnError = FALSE;				// abort reads/writes on error 

	err = SetCommState(m_hComm,&dcb);

	if (err < 0) 
	{
		AfxMessageBox(_T("Could not set communication state"),MB_OK|MB_ICONSTOP);
	    return FALSE;
	}

	//===== 器飘 惑怕 汲沥. =====

	// EV_RXCHAR event 汲沥...单捞磐啊 甸绢坷搁.. 荐脚 捞亥飘啊 惯积窍霸阐..
	SetCommMask( m_hComm, EV_RXCHAR);	

	// InQueue, OutQueue 农扁 汲沥.
	SetupComm( m_hComm, BUFF_SIZE, BUFF_SIZE);	

	// 器飘 厚快扁.
	PurgeComm( m_hComm,					
			   PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);

	// timeout 汲沥.
	timeouts.ReadIntervalTimeout = 0xFFFFFFFF;
	timeouts.ReadTotalTimeoutMultiplier = 0;
	timeouts.ReadTotalTimeoutConstant = 0;
	
	timeouts.WriteTotalTimeoutMultiplier = 2*CBR_9600 / dwBaud;
	timeouts.WriteTotalTimeoutConstant = 0;
	
	SetCommTimeouts( m_hComm, &timeouts);


	// 器飘 皑矫 静饭靛 积己.
	m_bConnected = TRUE;

	//--> 器飘 皑矫 静饭靛 积己.
	m_hThreadWatchComm = CreateThread( NULL, 0, 
									   (LPTHREAD_START_ROUTINE)ThreadWatchComm, 
									   this, 0, &dwThreadID);

	//--> 静饭靛 积己俊 角菩窍搁..
	if (! m_hThreadWatchComm)
	{
		//--> 凯赴 器飘甫 摧绊..
		ClosePort();
		return FALSE;
	}
	check = FALSE;

	return TRUE;
}
	
// 器飘甫 摧绰促.
void CCommThread::ClosePort()
{
	//--> 楷搬登瘤 臼疽澜.
	m_bConnected = FALSE;
	

	//--> 付胶农 秦力..
	SetCommMask( m_hComm, 0);
	
	//--> 器飘 厚快扁.
	PurgeComm( m_hComm,	PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXABORT | PURGE_RXCLEAR);
	
	CloseHandle(m_hComm);
	//--> 勤甸 摧扁
	
}

// 器飘俊 pBuff狼 郴侩阑 nToWrite父怒 敬促.
// 角力肺 静咯柳 Byte荐甫 府畔茄促.
DWORD CCommThread::WriteComm(BYTE *pBuff, DWORD nToWrite)
{
	DWORD	dwWritten, dwError, dwErrorFlags;
	COMSTAT	comstat;

	//--> 器飘啊 楷搬登瘤 臼篮 惑怕捞搁..
	if( !m_bConnected )		
	{
		return 0;
	}


	//--> 牢磊肺 甸绢柯 滚欺狼 郴侩阑 nToWrite 父怒 静绊.. 敬 肮荐甫.,dwWrite 俊 逞辫.
	if( !WriteFile( m_hComm, pBuff, nToWrite, &dwWritten, &m_osWrite))
	{
		//--> 酒流 傈价且 巩磊啊 巢疽阑 版快..
		if (GetLastError() == ERROR_IO_PENDING)
		{
			// 佬阑 巩磊啊 巢酒 乐芭唱 傈价且 巩磊啊 巢酒 乐阑 版快 Overapped IO狼
			// 漂己俊 蝶扼 ERROR_IO_PENDING 俊矾 皋矫瘤啊 傈崔等促.
			//timeouts俊 沥秦霖 矫埃父怒 扁促妨霖促.
			while (! GetOverlappedResult( m_hComm, &m_osWrite, &dwWritten, TRUE))
			{
				dwError = GetLastError();
				if (dwError != ERROR_IO_INCOMPLETE)
				{
					ClearCommError( m_hComm, &dwErrorFlags, &comstat);
					break;
				}
			}
		}
		else
		{
			dwWritten = 0;
			ClearCommError( m_hComm, &dwErrorFlags, &comstat);
		}
	}



	//--> 角力 器飘肺 静咯柳 肮荐甫 府畔..
	return dwWritten;
}


// 器飘肺何磐 pBuff俊 nToWrite父怒 佬绰促.
// 角力肺 佬囚柳 Byte荐甫 府畔茄促.
DWORD CCommThread::ReadComm(BYTE *pBuff, DWORD nToRead)
{
	DWORD	dwRead,dwError, dwErrorFlags;
	COMSTAT comstat;

	//--- system queue俊 档馒茄 byte荐父 固府 佬绰促.
	ClearCommError( m_hComm, &dwErrorFlags, &comstat);

	//--> 矫胶袍 钮俊辑 佬阑 芭府啊 乐栏搁..
	dwRead = comstat.cbInQue;
	if(dwRead > 0)
	{

		//--> 滚欺俊 老窜 佬绢甸捞绰单.. 父老..佬绢甸牢蔼捞 绝促搁..

		if( !ReadFile( m_hComm, pBuff, nToRead, &dwRead, &m_osRead) )
		{
			//--> 佬阑 芭府啊 巢疽栏搁..
			if (GetLastError() == ERROR_IO_PENDING)
			{
				//--------- timeouts俊 沥秦霖 矫埃父怒 扁促妨霖促.
				while (! GetOverlappedResult( m_hComm, &m_osRead, &dwRead, TRUE))
				{
					dwError = GetLastError();
					if (dwError != ERROR_IO_INCOMPLETE)
					{
						ClearCommError( m_hComm, &dwErrorFlags, &comstat);
						break;
					}
				}
			}
			else
			{
				dwRead = 0;
				ClearCommError( m_hComm, &dwErrorFlags, &comstat);
			}
		}
	}


	//--> 角力 佬绢甸牢 肮荐甫 府畔.
	return dwRead;

}





// 器飘甫 皑矫窍绊, 佬腮 郴侩捞 乐栏搁
// m_ReadData俊 历厘茄 第俊 MainWnd俊 皋矫瘤甫 焊郴绢 Buffer狼 郴侩阑
// 佬绢啊扼绊 脚绊茄促.

DWORD	ThreadWatchComm(CCommThread* pComm)
{
   DWORD           dwEvent;
   OVERLAPPED      os;
   BOOL            bOk = TRUE;
   BYTE            buff[2048];      // 佬扁 滚欺
   DWORD           dwRead;  // 佬篮 官捞飘荐.
 

   // Event, OS 汲沥.
   memset( &os, 0, sizeof(OVERLAPPED));
   
   //--> 捞亥飘 汲沥..
   if( !(os.hEvent = CreateEvent( NULL, TRUE, FALSE, NULL)) )
   {
		bOk = FALSE;
   }

   //--> 捞亥飘 付胶农..
   if( !SetCommMask( pComm->m_hComm, EV_RXCHAR) )
   {
	   bOk = FALSE;
   }

   //--> 捞亥飘唱..付胶农 汲沥俊 角菩窃..
   if( !bOk )
   {
		AfxMessageBox("Error while creating ThreadWatchComm, " + pComm->m_sPortName);
		return FALSE;
   }
  
   while (pComm ->m_bConnected)//器飘啊 楷搬登搁 公茄 风橇俊 甸绢皑
   {
 		dwEvent = 0;
	
        // 器飘俊 佬阑 芭府啊 棵锭鳖瘤 扁促赴促.
        WaitCommEvent( pComm->m_hComm, &dwEvent, NULL);
	
	
		//--> 单捞磐啊 荐脚登菌促绰 皋技瘤啊 惯积窍搁..
        if ((dwEvent & EV_RXCHAR) == EV_RXCHAR)
        {
            // 器飘俊辑 佬阑 荐 乐绰 父怒 佬绰促.
				//--> buff 俊 罐酒初绊..
			do
			{
				dwRead = pComm->ReadComm( buff, 2048); //甸绢柯 单捞磐 佬绢 坷扁 
				if(BUFF_SIZE - pComm->m_QueueRead.GetSize() > (int)dwRead)
				{
					for( WORD i = 0; i < dwRead; i++ )
					{
						pComm->m_QueueRead.PutByte(buff[i]);//钮 滚欺俊  甸绢柯 单捞磐 持扁 
					}
				}
				else
					AfxMessageBox("buff full"); //钮滚欺狼 农扁甫 檬苞窍搁 版绊 皋矫瘤 焊晨
			}while(dwRead);
			::PostMessage(hCommWnd, WM_COMM_READ, 0, pComm->m_wPortID );//CSerialComDlg肺 单捞磐啊 甸绢吭促绰 皋矫瘤甫 焊晨
		}
		Sleep(0);	// 罐篮 单捞磐甫 拳搁俊 焊咯临 矫埃阑 国扁 困秦.
					// 单捞磐甫 楷加栏肺 罐栏搁 cpu痢蜡啦捞 100%啊 登绢 拳搁俊 谎妨林绰 累诀捞 肋 救登绊. 搬苞利栏肺 
					// 钮 滚欺俊 单捞磐啊 阶捞霸 凳
   }
   
  CloseHandle( os.hEvent);

   //--> 静饭靛 辆丰啊 登摆烈?
   pComm->m_hThreadWatchComm = NULL;

   return TRUE;

}

⌨️ 快捷键说明

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