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

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關(guān)于我們
? 蟲蟲下載站

?? serialcomm.cpp

?? 研華ADAN4050 檢測程序(自做) 壓縮文件中 無密碼
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// SerialComm.cpp: implementation of the CSerialComm class.
//
//////////////////////////////////////////////////////////////////////
#include "stdafx.h"
#include "SerialComm.h"

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

CSerialComm::CSerialComm()
{
#if !defined(SC_MSCOMOBJECT)

	m_bAsyncOutput = FALSE; //同步寫方式
	m_hCOM = NULL; //串行通訊端口句柄

	::ZeroMemory(&m_stDCB, sizeof(DCB));
	::ZeroMemory(&m_stCTO, sizeof(COMMTIMEOUTS));
	::ZeroMemory(m_atcCurCOM, sizeof(TCHAR) * SC_MAXCOMNAME);
	::ZeroMemory(&m_stROverlapped, sizeof(m_stROverlapped));
	::ZeroMemory(&m_stWOverlapped, sizeof(m_stWOverlapped));
	m_stWOverlapped.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
	m_stROverlapped.hEvent = ::CreateEvent(NULL, TRUE, FALSE, NULL);
	m_bShowCommConfigDialog = FALSE;

#else //if !defined(SC_MSCOMOBJECT)
#endif
}

CSerialComm::~CSerialComm()
{
	Close();

#if !defined(SC_MSCOMOBJECT)

	if (NULL != m_stROverlapped.hEvent)
	{
		::CloseHandle(m_stROverlapped.hEvent);
	}
	if (NULL != m_stWOverlapped.hEvent)
	{
		::CloseHandle(m_stWOverlapped.hEvent);
	}

#else //if !defined(SC_MSCOMOBJECT)
#endif
}

//獲取當(dāng)前系統(tǒng)中安裝的串行通訊端口
//<參數(shù)>
//	pppCOMs: 用于接收一個(gè)指向串行通訊端口名集的指針
//<返回值>
//	返回當(dāng)前系統(tǒng)中安裝的串行通訊端口名集。
int CSerialComm::GetCOMs(LPCTSTR ** pppCOMs)
{
#if !defined(SC_MSCOMOBJECT)

	if (NULL == pppCOMs)
		return int(0);

	static TCHAR atcCOMs[SC_MAXCOMNUM][SC_MAXCOMNAME];
	static LPTSTR apCOMs[SC_MAXCOMNUM];
	::ZeroMemory(atcCOMs, sizeof(TCHAR) * SC_MAXCOMNUM * SC_MAXCOMNAME);

	int iCount = 0;
	HANDLE hCOM = NULL;

	for (int i = 0; i < SC_MAXCOMNUM; i++)
	{
		apCOMs[i] = atcCOMs[i];
		::_stprintf(atcCOMs[iCount], _T("COM%d"), i+1);

		//打開串口
		hCOM = ::CreateFile(atcCOMs[iCount],
			GENERIC_READ|GENERIC_WRITE,
			0,
			NULL,
			OPEN_EXISTING,
			FILE_FLAG_OVERLAPPED,
			NULL);

		//如果串口打開失敗...
		if (INVALID_HANDLE_VALUE == hCOM || NULL == hCOM)
		{
			DWORD dwLastError = ::GetLastError();
			if (ERROR_FILE_NOT_FOUND != dwLastError)
				++iCount;
			else
				::ZeroMemory(atcCOMs[iCount], sizeof(TCHAR) * SC_MAXCOMNAME);
		}
		else
		{
			::CloseHandle(hCOM);
			++iCount;
		}
	}

	if (0 < iCount)
		*pppCOMs = (LPCTSTR *)apCOMs;

	return int(iCount);

#else //if !defined(SC_MSCOMOBJECT)
#endif
}

//打開指定串行通訊端口并指定其波特率和校驗(yàn)方式
//<參數(shù)>
//	lpszCOMName: 指定端口名稱
//	dwBaudrate: 指定波特率
//	dwParity: 指定校驗(yàn)方式
//<返回值>
//	如果成功返回TRUE,否則返回FALSE。
BOOL CSerialComm::Open(LPCTSTR lpszCOMName, DWORD dwBaudrate/* = 0xFFFFFFFFl*/, DWORD dwParity/* = 0xFFFFFFFFl*/)
{
#if !defined(SC_MSCOMOBJECT)

	Close();
	if (NULL == lpszCOMName || FALSE != m_bShowCommConfigDialog)
		return BOOL(FALSE);

	//打開串口
	m_hCOM = ::CreateFile(lpszCOMName,
		GENERIC_READ | GENERIC_WRITE,
		0,
		NULL,
		OPEN_EXISTING,
		FILE_FLAG_OVERLAPPED,
		NULL);
	//如果串口打開失敗...
	if (INVALID_HANDLE_VALUE == m_hCOM || NULL == m_hCOM)
	{
		m_hCOM = NULL;
		return BOOL(FALSE);
	}
	//設(shè)置缺省配置
	SetDefaultConfig(dwBaudrate, BYTE(dwParity));
	::lstrcpyn(m_atcCurCOM, lpszCOMName, SC_MAXCOMNAME - 1);
	return BOOL(TRUE);

#else //if !defined(SC_MSCOMOBJECT)
#endif
}

//關(guān)閉當(dāng)前使用的串行端口
//<參數(shù)> 無
//<返回值> 無
void CSerialComm::Close()
{
#if !defined(SC_MSCOMOBJECT)

	if (NULL != m_hCOM)
	{
		::PurgeComm(m_hCOM, PURGE_RXABORT | PURGE_TXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
		::CloseHandle(m_hCOM);
		m_hCOM=NULL;
		::ZeroMemory(m_atcCurCOM, sizeof(TCHAR) * SC_MAXCOMNAME);
	}

#else //if !defined(SC_MSCOMOBJECT)
#endif
}

//判斷當(dāng)前串行通訊端口是否已經(jīng)打開
//<參數(shù)> 無
//<返回值>
//	如果已經(jīng)打開則返回已打開串口的名字,否則返回NULL。
LPCTSTR CSerialComm::IsOpened()
{
#if !defined(SC_MSCOMOBJECT)

	return LPCTSTR((NULL != m_hCOM && INVALID_HANDLE_VALUE != m_hCOM) ? m_atcCurCOM : NULL);

#else //if !defined(SC_MSCOMOBJECT)
#endif
}

#if !defined(SC_MSCOMOBJECT)
//設(shè)置當(dāng)前串行通訊端口的缺省配置
//<參數(shù)>
//	dwBaudrate: 指定波特率,如果為0xFFFFFFFF表示保持原有設(shè)置值
//	ucParity: 指定校驗(yàn)方式,如果為0xFFFF表示保持原有設(shè)置值
//<返回值> 無
void CSerialComm::SetDefaultConfig(DWORD dwBaudrate, BYTE ucParity)
{
	if (INVALID_HANDLE_VALUE == m_hCOM || NULL == m_hCOM)
		return;

	if (FALSE != ::GetCommState(m_hCOM, &m_stDCB))
	{
		if (0xFFFFFFFF != dwBaudrate)
			m_stDCB.BaudRate = FormatBaudrate(dwBaudrate);

		if (0xFF != ucParity)
		{
			m_stDCB.Parity = FormatParity(ucParity);
			m_stDCB.fParity = BOOL(m_stDCB.Parity != NOPARITY);
		}

		m_stDCB.DCBlength = sizeof(DCB);	//DCB數(shù)據(jù)結(jié)構(gòu)長度
		m_stDCB.ByteSize = 8;				//數(shù)據(jù)位
		m_stDCB.StopBits = ONESTOPBIT;	//停止位

		m_stDCB.fAbortOnError = FALSE;	//發(fā)生通訊錯(cuò)誤時(shí)不終止讀寫
		m_stDCB.fBinary = TRUE;			//以二近制方式通訊

		::SetCommState(m_hCOM, &m_stDCB);
	}

	if (FALSE != ::GetCommTimeouts(m_hCOM, &m_stCTO))
	{
		int iBits = 1 + m_stDCB.ByteSize + ((m_stDCB.StopBits == ONESTOPBIT) ? 1 : 2);
		m_stCTO.ReadIntervalTimeout = 10; //10ms的區(qū)間超時(shí)
		m_stCTO.ReadTotalTimeoutMultiplier = (iBits * 1000) / m_stDCB.BaudRate; //傳輸一個(gè)字節(jié)所需的時(shí)間
		if (0 == m_stCTO.ReadTotalTimeoutMultiplier)
			m_stCTO.ReadTotalTimeoutMultiplier = 1;
		m_stCTO.ReadTotalTimeoutConstant = m_stCTO.ReadTotalTimeoutMultiplier * 10;
		m_stCTO.WriteTotalTimeoutMultiplier = ((iBits + 2) * 1000) / m_stDCB.BaudRate; //傳輸一個(gè)字節(jié)所需的時(shí)間
		if (0 == m_stCTO.WriteTotalTimeoutMultiplier)
			m_stCTO.WriteTotalTimeoutMultiplier = 1;
		m_stCTO.WriteTotalTimeoutConstant = m_stCTO.WriteTotalTimeoutMultiplier * 10;
		::SetCommTimeouts(m_hCOM, &m_stCTO);
	}
}
#endif //if !defined(SC_MSCOMOBJECT)

//從當(dāng)前串行通訊端口讀取數(shù)據(jù)
//<參數(shù)>
//	pBuff: 指定用于接收數(shù)據(jù)的緩沖區(qū)
//	lReadSize: 指定期望讀取的數(shù)據(jù)長度
//<返回值>
//	返回正確讀取的字節(jié)數(shù)。如果指定一個(gè)NULL緩沖區(qū)或期望讀取的數(shù)據(jù)長度不大于0,
//則返回當(dāng)前系統(tǒng)內(nèi)部讀緩沖區(qū)中的字節(jié)數(shù)。出錯(cuò)時(shí)返回值小于0。
long CSerialComm::Read(LPVOID pBuff, long lReadSize)
{
#if !defined(SC_MSCOMOBJECT)

	if (INVALID_HANDLE_VALUE == m_hCOM || NULL == m_hCOM)
		return long(-1);

	//如果入口參數(shù)無效則試圖返回輸入緩沖區(qū)中的數(shù)據(jù)長度
	if (NULL == pBuff || 0 > lReadSize)
	{
		COMSTAT stCOMStat;
		DWORD dwErr;
		if (FALSE == ::ClearCommError(m_hCOM, &dwErr, &stCOMStat))
			return long(-2);
		return long(stCOMStat.cbInQue);
	}

	DWORD dwReadedSize = 0;
	long lReaded = 0;
	int iCount = (lReadSize + 3) >> 2;

	while (iCount > 0)
	{
		--iCount;
		::ResetEvent(m_stROverlapped.hEvent);
		//如果讀取失敗...
		if (FALSE == ::ReadFile(m_hCOM, LPBYTE(pBuff)+lReaded, lReadSize, &dwReadedSize, &m_stROverlapped))
		{
			//如果是重疊IO...
			if (ERROR_IO_PENDING == GetLastError())
			{
				if (FALSE != ::GetOverlappedResult(m_hCOM, &m_stROverlapped, &dwReadedSize, TRUE))
				{
					lReaded += long(dwReadedSize);
					lReadSize -= long(dwReadedSize);
					if (0 >= lReadSize || 0 == dwReadedSize)
						return long(lReaded);
					else
					{
						iCount = min((lReadSize + 3) >> 2, iCount);
					}
				}
			} //if (ERROR_IO_PENDING == GetLastError())
		} //if (FALSE == ::ReadFile)
		else
		{
			lReaded += long(dwReadedSize);
			//讀取完成
			return long(lReaded);
		}
	} //while(dwSize)
	return long(lReaded);

#else //if !defined(SC_MSCOMOBJECT)
#endif
}

//向當(dāng)前串行通訊端口寫數(shù)據(jù)
//<參數(shù)>
//	pData: 指定待寫數(shù)據(jù)
//	lWriteSize: 指定待寫數(shù)據(jù)長度
//<返回值>
//	返回正確寫出的字節(jié)數(shù)。如果指定pData為NULL或待寫數(shù)據(jù)長度不大于0,
//則返回當(dāng)前系統(tǒng)內(nèi)部寫緩沖區(qū)中的字節(jié)數(shù)。出錯(cuò)時(shí)返回值小于0。
long CSerialComm::Write(LPVOID pData, long lWriteSize)
{
#if !defined(SC_MSCOMOBJECT)

	if (INVALID_HANDLE_VALUE == m_hCOM || NULL == m_hCOM)
		return long(-1);

	COMSTAT stCOMStat;
	DWORD dwErr = 0;

	//如果入口參數(shù)無效則試圖返回輸入緩沖區(qū)中的數(shù)據(jù)長度
	if (NULL == pData || 0 > lWriteSize)
	{
		if (FALSE == ::ClearCommError(m_hCOM, &dwErr, &stCOMStat))
			return long(-2);
		return long(stCOMStat.cbOutQue);
	}

	DWORD dwWritedSize = 0;
	long lWritedTatol = 0;

	if (FALSE != m_bAsyncOutput)
	{
		::GetOverlappedResult(m_hCOM, &m_stWOverlapped, &dwWritedSize, FALSE);
		dwWritedSize = 0;
	}

	while (0 < lWriteSize)
	{
		::ResetEvent(m_stWOverlapped.hEvent);
		//如果發(fā)送失敗...
		if (FALSE == ::WriteFile(m_hCOM, LPBYTE(pData) + lWritedTatol, DWORD(lWriteSize), &dwWritedSize, &m_stWOverlapped))
		{
			//如果是重疊IO...
			if (ERROR_IO_PENDING == ::GetLastError())
			{
				//如果重疊IO失敗...
				if (FALSE == ::GetOverlappedResult(m_hCOM, &m_stWOverlapped, &dwWritedSize, FALSE))
				{
					if (FALSE != m_bAsyncOutput)
						return long(lWritedTatol);
					DWORD dwWait = m_stCTO.WriteTotalTimeoutMultiplier * lWriteSize + m_stCTO.WriteTotalTimeoutConstant;
					if (WAIT_TIMEOUT == ::WaitForSingleObject(m_stWOverlapped.hEvent, dwWait))
						return long(-3);
					if (FALSE == ::GetOverlappedResult(m_hCOM, &m_stWOverlapped, &dwWritedSize, FALSE))
						return long(-4);
				}
				if (0 == dwWritedSize)
					return long(lWritedTatol);
				lWritedTatol += long(dwWritedSize);
				lWriteSize -= long(dwWritedSize);
			} //if (ERROR_IO_PENDING == ::GetLastError())
			else
				return long(-5);
		}
		else
		{
			lWritedTatol += long(dwWritedSize);
			lWriteSize -= long(dwWritedSize);
		}
	}

	if (FALSE != m_bAsyncOutput)
		return long(lWritedTatol);

	//清空軟件緩沖區(qū)
	::FlushFileBuffers(m_hCOM);
	DCB stDCB;
	if (FALSE != ::GetCommState(m_hCOM, &stDCB))
	{
		int iBits = 1 + stDCB.ByteSize + ((stDCB.StopBits == ONESTOPBIT) ? 1 : 2); //一個(gè)字節(jié)的實(shí)際傳輸位數(shù)
		int iBytesTime = (iBits * 1000 * min(16 + 2, dwWritedSize + 2)) / stDCB.BaudRate; //傳輸若干字節(jié)所需要的時(shí)間
		::Sleep(iBytesTime); //等待硬件緩沖區(qū)空
	}
	return long(lWritedTatol);

#else //if !defined(SC_MSCOMOBJECT)
#endif
}

//對Win32API CommConfigDialog函數(shù)的封裝
//<參數(shù)> 無
//<返回值>
//	如果成功返回TRUE,否則返回FALSE。
BOOL CSerialComm::CommConfigDialog()
{
#if !defined(SC_MSCOMOBJECT)

	if (NULL != IsOpened())
	{
		DWORD dwCCSize;

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
午夜视频一区二区| 91豆麻精品91久久久久久| 99精品视频在线免费观看| 欧美视频一区二区在线观看| 2017欧美狠狠色| 亚洲福利视频一区| 国产91对白在线观看九色| 欧美一区二区三级| 亚洲精品大片www| 成人午夜免费视频| 日韩欧美国产高清| 亚洲h精品动漫在线观看| 91蝌蚪porny| 国产女主播在线一区二区| 香蕉乱码成人久久天堂爱免费| 风流少妇一区二区| 日韩精品一区国产麻豆| 五月婷婷色综合| 91小视频免费看| 欧美激情一区在线观看| 精品系列免费在线观看| 7777精品伊人久久久大香线蕉超级流畅| 国产欧美精品在线观看| 国产专区欧美精品| 欧美变态tickling挠脚心| 午夜电影一区二区| 欧美三级蜜桃2在线观看| 中文字幕亚洲精品在线观看| 国产成人精品aa毛片| 精品国产伦一区二区三区观看方式| 亚洲va中文字幕| 欧美日韩在线不卡| 亚洲午夜久久久久久久久电影网 | 久久精品在这里| 美国毛片一区二区三区| 日韩区在线观看| 日本怡春院一区二区| 欧美日韩精品一区二区三区| 亚洲一区二区黄色| 欧美亚洲综合在线| 性久久久久久久久久久久| 欧美人与禽zozo性伦| 日韩精品亚洲专区| 欧美一区二区三区爱爱| 久久黄色级2电影| 久久综合色天天久久综合图片| 麻豆freexxxx性91精品| 精品免费日韩av| 国产精品12区| 国产精品国产馆在线真实露脸| 97精品视频在线观看自产线路二| 亚洲日本一区二区| 在线免费不卡电影| 天天综合网天天综合色| 日韩欧美一二三| 国产福利91精品| 亚洲精品欧美在线| 在线播放中文字幕一区| 精品在线亚洲视频| 国产偷国产偷精品高清尤物| av不卡一区二区三区| 又紧又大又爽精品一区二区| 欧美久久高跟鞋激| 精品亚洲成a人在线观看| 欧美激情一区二区三区蜜桃视频| 欧美久久一区二区| 日韩av中文字幕一区二区| 精品毛片乱码1区2区3区| 懂色av中文字幕一区二区三区| 最新国产精品久久精品| 欧美日韩日本视频| 高清在线观看日韩| 亚洲国产精品视频| 久久久亚洲午夜电影| 欧美综合一区二区| 精品无人码麻豆乱码1区2区| 国产精品乱人伦| 91精品国产手机| 成人av在线影院| 蜜臀久久99精品久久久久宅男| 中文成人av在线| 日韩午夜激情av| 欧美中文字幕一二三区视频| 狠狠色狠狠色综合日日91app| 亚洲最新视频在线观看| 久久综合色之久久综合| 欧美性受xxxx黑人xyx性爽| 福利视频网站一区二区三区| 调教+趴+乳夹+国产+精品| 中文字幕av一区二区三区免费看 | 亚洲国产激情av| 日韩无一区二区| 在线观看日韩国产| 成人av网站免费观看| 久久精品国产99久久6| 亚洲国产视频一区二区| 国产精品国产自产拍高清av| 精品国产电影一区二区| 欧美精品一二三区| 91激情五月电影| 99久久99久久综合| 国产成a人亚洲| 国产一区在线视频| 美女视频免费一区| 久久66热偷产精品| 91网站在线观看视频| 欧美丝袜丝交足nylons图片| 经典一区二区三区| 亚洲电影视频在线| 一区二区三区不卡视频| 国产精品欧美一区喷水| 久久精品亚洲精品国产欧美 | 人妖欧美一区二区| 亚洲综合丝袜美腿| 亚洲精品成人天堂一二三| 国产精品美女久久久久高潮| 国产欧美日产一区| 国产农村妇女精品| 日本一区二区三区国色天香 | 日韩国产在线一| 亚洲成av人片在线| 亚洲图片自拍偷拍| 亚洲一区二区三区小说| 亚洲一区二区精品久久av| 伊人开心综合网| 亚洲国产另类av| 天天影视网天天综合色在线播放| 亚洲gay无套男同| 青青草原综合久久大伊人精品| 日韩av在线发布| 狠狠色丁香婷婷综合久久片| 国产一区二区看久久| 国产精品一区二区免费不卡| 国产91清纯白嫩初高中在线观看 | 国产精品亚洲成人| 99视频精品在线| 91看片淫黄大片一级在线观看| 色94色欧美sute亚洲线路一久| 欧美在线看片a免费观看| 欧美少妇bbb| 精品国产乱码久久久久久久久| 久久女同性恋中文字幕| 欧美国产精品专区| 亚洲精品日产精品乱码不卡| 丝袜国产日韩另类美女| 久久精品国产澳门| voyeur盗摄精品| 欧美色精品在线视频| 欧美成人高清电影在线| 欧美国产1区2区| 亚洲国产一区二区三区| 久久精品国产成人一区二区三区| 国产69精品一区二区亚洲孕妇| 日本高清不卡在线观看| 欧美一区二区黄色| 欧美国产成人精品| 五月天网站亚洲| 国产激情视频一区二区在线观看 | 国产亚洲欧美一级| 一区二区视频免费在线观看| 日韩二区三区四区| 成人黄色大片在线观看| 欧美精品粉嫩高潮一区二区| 久久亚洲精华国产精华液 | 欧美一区二区三区四区高清| 久久久影院官网| 亚洲愉拍自拍另类高清精品| 韩国三级在线一区| 欧美日韩精品久久久| 国产精品电影一区二区三区| 美腿丝袜一区二区三区| 色综合咪咪久久| 久久在线免费观看| 亚洲成av人综合在线观看| 菠萝蜜视频在线观看一区| 91精品国产入口| 亚洲视频 欧洲视频| 国产在线播放一区三区四| 欧美三片在线视频观看| 欧美激情一区二区三区不卡| 蜜桃精品在线观看| 欧美视频自拍偷拍| 国产精品免费视频一区| 精品亚洲国产成人av制服丝袜 | 久久精品一区二区三区不卡 | 亚洲欧美日韩精品久久久久| 极品美女销魂一区二区三区免费| 欧美色老头old∨ideo| 1区2区3区国产精品| 国产精品一二三在| 欧美r级在线观看| 男女激情视频一区| 欧美日产在线观看| 夜夜亚洲天天久久| 色综合天天做天天爱| 国产精品乱码久久久久久| 国产老肥熟一区二区三区| 日韩欧美一二三| 热久久久久久久| 制服丝袜亚洲色图|