亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? asyncserialport.cpp

?? 串口通信mfc源碼
?? CPP
字號:
#include "StdAfx.h"
#include "AsyncSerialPort.h"
#include "RuntimeException.h"

CAsyncSerialPort::CAsyncSerialPort(void)
{
	m_breakEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	m_readEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	m_portClosingEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	m_writeEvent = CreateEvent(NULL,TRUE,FALSE,NULL);

	::ZeroMemory(&m_readOverlapped,sizeof(m_readOverlapped));
	::ZeroMemory(&m_breakOverlapped,sizeof(m_breakOverlapped));
	::ZeroMemory(&m_writeOverlapped,sizeof(m_writeOverlapped));

	m_readOverlapped.hEvent = m_readEvent;
	m_breakOverlapped.hEvent = m_breakEvent;
	m_writeOverlapped.hEvent = m_writeEvent;

	ASSERT(m_breakEvent!=NULL);
	ASSERT(m_readEvent!=NULL);
	ASSERT(m_portClosingEvent!=NULL);
	ASSERT(m_writeEvent!=NULL);
}

CAsyncSerialPort::~CAsyncSerialPort(void)
{
	Close();

	::CloseHandle(m_breakEvent);
	::CloseHandle(m_readEvent);
	::CloseHandle(m_portClosingEvent);
	::CloseHandle(m_writeEvent);

}

void CAsyncSerialPort::Open(int nPort, DWORD dwBaud, Parity parity, BYTE DataBits,
							   StopBits stopbits, FlowControl fc, BOOL bOverlapped)
{
	CSerialPort::Open(nPort,dwBaud,parity,DataBits,stopbits,fc,TRUE);

	m_isWriting = FALSE;

	//This config is very useful
	COMMTIMEOUTS timeouts;
	GetTimeouts(timeouts);
	timeouts.ReadIntervalTimeout = 100;
	SetTimeouts(timeouts);
	
	//Discards all characters from the output or input buffer 
	Purge(PURGE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
	//Set buffer length
	Setup( ReadBufferLength, WriteBufferLength);
		
	CThread::Start();
	CThread::SetPriority(THREAD_PRIORITY_HIGHEST);

	for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
	{
		(*iter)->OnPortOpen(this);
	}
}

void CAsyncSerialPort::Close()
{
	if(IsOpen())
	{
		::SetEvent(m_portClosingEvent);
		CThread::Wait(5000);
		CThread::Terminate();
		::ResetEvent(m_portClosingEvent);

		for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
		{
			(*iter)->OnPortClose(this);
		}

	}
	
	CSerialPort::Close();
}

void CAsyncSerialPort::OnRead(const byte *pData, size_t dataLength)
{
	try
	{
		for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
		{
			(*iter)->OnRead(this, pData, dataLength);
		}
	}
	catch (CRuntimeException* e)
	{
		OnError( e->GetErrorMessage());
		e->Delete();
	}
	
}

void CAsyncSerialPort::OnWrite(const byte *pData,size_t dataLength)
{
	for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
	{
		(*iter)->OnWrite(this,pData, dataLength );
	}
}

void CAsyncSerialPort::HandleBreakEvent(DWORD &dwMask)
{
	DWORD dwReadBytes;
	CSerialPort::GetOverlappedResult(m_breakOverlapped,dwReadBytes, FALSE);
	OnBreak(dwMask);
}

void CAsyncSerialPort::OnError(LPCTSTR lpszErrorMessage)
{
	for(PortObserverList::iterator iter = m_portObservers.begin(); iter != m_portObservers.end(); ++ iter )
	{
		(*iter)->OnError(this,lpszErrorMessage);
	}
}

void CAsyncSerialPort::SetBreakEvent(DWORD &dwMask)
{
	while(true)
	{
		if(WaitEvent(dwMask,m_breakOverlapped))
		{
			HandleBreakEvent(dwMask);
		}
		else
		{
			DWORD dwError = ::GetLastError();
			if( ERROR_IO_PENDING == dwError)
			{
				break;
			}
			else
			{
				THROW_EX_CODE(dwError);
			}
		}
	}

}

void CAsyncSerialPort::SetReadEvent(OVERLAPPED& overlapped)
{
	DWORD readCount=0;
	while(true)
	{
		if(Read(m_readBuffer, ReadBufferLength, overlapped, &readCount))
		{
			OnRead(m_readBuffer,readCount);
			ResetEvent(m_readEvent);
		}
		else
		{
			DWORD dwError = ::GetLastError();
			if( ERROR_IO_PENDING == dwError)
			{
				return;
			}
			else
			{
				THROW_EX_CODE(dwError);
			}
		}
	}
}

void CAsyncSerialPort::HandleReadEvent(OVERLAPPED& overlapped)
{
	DWORD dwReadCount;
	GetOverlappedResult(m_readOverlapped, dwReadCount, FALSE);
	OnRead(m_readBuffer, dwReadCount);
}

void CAsyncSerialPort::HandleWriteEvent(OVERLAPPED& overlapped)
{
	ASSERT(m_isWriting == TRUE);

	DWORD dwWriteCount;

	GetOverlappedResult(m_writeOverlapped, dwWriteCount, FALSE);
	OnWrite(m_writeBuffer, dwWriteCount);

	m_isWriting = FALSE;
	::ResetEvent(m_writeEvent);
}

void CAsyncSerialPort::OnBreak(DWORD dwMask)
{
}

//Thread worker
int CAsyncSerialPort::Run()
{
	try
	{
		TRACE(_T("Run read thread.\n"));


		//events array
		HANDLE waitHandles[4]= { 
			m_portClosingEvent,
			m_readEvent, 
			m_breakEvent,
			m_writeEvent}; 
			
		WORD dwStoredFlags = EV_BREAK | EV_CTS | EV_DSR | EV_ERR | EV_RING | \
			EV_RLSD | EV_RXCHAR | EV_RXFLAG | EV_TXEMPTY;

		SetMask(dwStoredFlags);
		DWORD dwMask;
		SetBreakEvent(dwMask);
		SetReadEvent(m_readOverlapped);
		
		DWORD dwEventIndex;
		while(TRUE)
		{
			dwEventIndex = ::WaitForMultipleObjects(4,waitHandles,false,INFINITE);
			switch(dwEventIndex)
			{
			case WAIT_OBJECT_0:
				TRACE(_T("Receive serial port close event, exit read thread.\n"));
				return 0L;
			case WAIT_OBJECT_0+1: //read event
				{
					HandleReadEvent(m_readOverlapped);
					SetReadEvent(m_readOverlapped);
				}
				break;
			case WAIT_OBJECT_0 +2: //break event
				{
					HandleBreakEvent(dwMask);
					SetBreakEvent(dwMask);
				}
				break;
			case WAIT_OBJECT_0 +3:
				{
					HandleWriteEvent(m_writeOverlapped);
				}
				break;
			case WAIT_FAILED:
				THROW_EX_CODE( ::GetLastError() );
			default:
				ASSERT(FALSE);
				return 0L;
			}
		}
	}
	catch (CRuntimeException* e)
	{
		OnError(e->GetErrorMessage());

		e->Delete();
	}

	return 0L;
}

void CAsyncSerialPort::WriteEx(const void* lpBuf, DWORD dwCount)
{
	if( dwCount > WriteBufferLength)
	{
		THROW_EX_CODE(_T("Too much data to write"));
	}

	if( !IsOpen())
	{
		THROW_EX_CODE(_T("SerialPort is closed, write data fail"));
	}

	ASSERT( lpBuf != NULL );

	if( m_isWriting )
	{
		THROW_EX_CODE(_T("Send not completed, write data fail"));
	}

	::CopyMemory(m_writeBuffer, lpBuf, dwCount);

	m_isWriting = TRUE;

	DWORD dwWriteBytes = 0;

	if( CSerialPort::Write(m_writeBuffer, dwCount, m_writeOverlapped, &dwWriteBytes) )
	{
		OnWrite(m_writeBuffer,dwWriteBytes);
		ResetEvent(m_writeEvent);
	}
}

void  CAsyncSerialPort::AtachObserver(ISerialPortObserver  *pObserver)
{
	ASSERT(pObserver!=NULL);
	m_portObservers.push_back(pObserver);
}

void  CAsyncSerialPort::DetchObserver(ISerialPortObserver *pObserver)
{
	ASSERT(pObserver!=NULL);
	m_portObservers.remove(pObserver);
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
亚洲综合色区另类av| 亚洲午夜视频在线观看| 欧美日韩在线三级| 日本高清免费不卡视频| 99久久久国产精品| av电影天堂一区二区在线观看| 久久99国产精品成人| 久久99精品国产.久久久久久| 麻豆成人av在线| 国产米奇在线777精品观看| 国产精品羞羞答答xxdd| 成人v精品蜜桃久久一区| 国产成a人亚洲| 91丨porny丨国产入口| 欧美午夜精品免费| 日韩欧美国产精品一区| 国产网红主播福利一区二区| 国产精品久久久久一区二区三区| 亚洲欧美在线观看| 亚洲成人一区二区在线观看| 秋霞午夜av一区二区三区| 国产乱淫av一区二区三区| jlzzjlzz亚洲日本少妇| 欧美日韩国产一区| 欧美www视频| 国产精品白丝在线| 日韩成人精品在线观看| 国产精品99久久久久久宅男| 91啪九色porn原创视频在线观看| 欧美日韩国产成人在线91| 2020国产成人综合网| 一区二区三区免费看视频| 久久激五月天综合精品| 色婷婷久久99综合精品jk白丝| 日韩一区二区三区电影在线观看| 中文字幕的久久| 亚洲一卡二卡三卡四卡无卡久久| 免费在线观看一区| 一本大道久久a久久综合| 日韩视频中午一区| 亚洲人成亚洲人成在线观看图片| 日本一道高清亚洲日美韩| 成人激情校园春色| 日韩欧美电影一二三| 一区二区三区在线视频播放| 国产乱码一区二区三区| 欧美日韩国产欧美日美国产精品| 久久日韩粉嫩一区二区三区| 亚洲国产精品综合小说图片区| 国产宾馆实践打屁股91| 91精品国产91久久久久久最新毛片 | 国产成人精品亚洲777人妖| 色香蕉久久蜜桃| 国产日韩精品一区二区三区| 亚洲第一激情av| 91在线精品一区二区三区| 欧美成人精品3d动漫h| 午夜视频一区二区三区| 91蜜桃视频在线| 国产日韩高清在线| 激情综合五月婷婷| 欧美一区二区精品久久911| 尤物视频一区二区| 99在线精品一区二区三区| 国产日产精品一区| 国产乱对白刺激视频不卡| 欧美电视剧在线看免费| 日本在线不卡一区| 制服丝袜成人动漫| 三级在线观看一区二区| 欧美日韩视频在线第一区 | 日本一区二区三区四区| 国产精品一区在线| 欧美mv日韩mv亚洲| 麻豆91在线看| 精品嫩草影院久久| 国内不卡的二区三区中文字幕 | 免费在线成人网| 欧美精品亚洲一区二区在线播放| 亚洲午夜电影在线观看| 欧美亚洲高清一区| 青青草国产精品97视觉盛宴| 欧美一区二区三区电影| 蜜桃精品在线观看| 久久综合久久综合久久综合| 国产剧情一区在线| 国产精品久久久久一区二区三区| 国产美女精品在线| 国产视频亚洲色图| 一本到高清视频免费精品| 亚洲夂夂婷婷色拍ww47| 欧美高清视频不卡网| 另类小说视频一区二区| 国产精品私人自拍| 欧美在线一二三| 麻豆精品视频在线观看视频| 久久青草国产手机看片福利盒子| 成人av网站在线观看免费| 亚洲精品高清视频在线观看| 6080yy午夜一二三区久久| 久久精品99国产精品| 国产精品久久久久久久久图文区| 在线一区二区三区| 久久99国产精品麻豆| 国产精品久久久久精k8 | 国产精品18久久久久久久久久久久 | 亚洲成av人在线观看| 日韩精品一区二区三区视频播放| 国产成人免费高清| 亚洲一区二区不卡免费| 久久人人超碰精品| 欧美日韩在线亚洲一区蜜芽| 国产一区二区福利视频| 亚洲黄网站在线观看| 日韩精品一区二区三区swag| 91蜜桃网址入口| 久久国产精品一区二区| 亚洲一区av在线| 国产三区在线成人av| 91精品国模一区二区三区| av电影在线观看不卡| 韩国v欧美v日本v亚洲v| 国产精品久久久久久久第一福利 | 成人av在线电影| 日韩精品每日更新| 亚洲人成影院在线观看| 久久久久国色av免费看影院| 欧美日韩一区二区三区四区| 成人精品视频一区二区三区尤物| 日韩专区欧美专区| 亚洲尤物视频在线| 国产精品三级在线观看| 精品三级av在线| 欧美一区二区三区视频免费播放| 99re热视频这里只精品| 国产成人av电影在线播放| 日韩极品在线观看| 夜夜揉揉日日人人青青一国产精品| 久久久国产综合精品女国产盗摄| 欧美一级在线视频| 7777精品伊人久久久大香线蕉最新版 | 日韩**一区毛片| 一区二区三区精品视频| 亚洲免费观看高清完整| 中文字幕精品一区二区精品绿巨人 | 欧美理论在线播放| 欧美日韩中文字幕一区二区| 91丝袜高跟美女视频| 91浏览器在线视频| 99精品热视频| 99久久er热在这里只有精品15 | 午夜久久久影院| 亚洲一二三区不卡| 亚洲成人av资源| 午夜精品福利视频网站| 日本欧美在线观看| 奇米精品一区二区三区在线观看 | 欧美精品一区二区久久久| 欧美一区二区三区四区久久| 欧美精品免费视频| 国产精品日产欧美久久久久| 亚洲精品一区二区三区99| 精品国产免费人成电影在线观看四季 | 久久精品夜色噜噜亚洲aⅴ| 欧美成人精品二区三区99精品| 精品少妇一区二区三区| 久久精品在线观看| 国产精品成人在线观看| 亚洲欧美国产高清| 亚洲一区二区影院| 麻豆精品在线看| 成人影视亚洲图片在线| 在线日韩一区二区| 日韩欧美一二三四区| 亚洲国产精品成人综合| 亚洲美女屁股眼交| 毛片不卡一区二区| 国产精品一区二区三区99| 色综合天天综合在线视频| 4438亚洲最大| 欧美激情综合网| 亚洲成人7777| 高清日韩电视剧大全免费| 欧美网站一区二区| 国产亚洲欧美日韩日本| 亚洲一线二线三线久久久| 韩国一区二区视频| 欧美亚洲综合网| 国产日韩欧美电影| 日韩国产一二三区| www.日本不卡| 日韩免费性生活视频播放| 亚洲欧美乱综合| 久久国产精品露脸对白| 91极品视觉盛宴| 国产精品视频一区二区三区不卡| 午夜精品福利在线| 91色|porny| 国产农村妇女精品| 久久国产尿小便嘘嘘|