亚洲欧美第一页_禁久久精品乱码_粉嫩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清纯白嫩初高中在线观看| 五月天久久比比资源色| 日韩av电影免费观看高清完整版| 狠狠色丁香九九婷婷综合五月| 国产欧美视频一区二区三区| 久久久www成人免费无遮挡大片| 亚洲国产精品精华液ab| 国产精品丝袜在线| 亚洲午夜精品久久久久久久久| 亚洲一区二区三区视频在线播放| 亚洲一区二区av在线| 亚洲一区日韩精品中文字幕| 久久精品国产澳门| 国产成人h网站| 日本大香伊一区二区三区| 91精品国产欧美一区二区18| 国产亚洲美州欧州综合国| 亚洲欧美视频在线观看视频| 日本中文字幕一区| 欧美老女人第四色| 久久综合九色综合欧美就去吻| 精品国产一区二区在线观看| 久久久久久久av麻豆果冻| 国产在线不卡一区| 国产婷婷一区二区| 99视频在线精品| 久久久久国产成人精品亚洲午夜| 欧美大片一区二区| 久久综合狠狠综合久久综合88 | 日韩二区三区在线观看| 日韩欧美卡一卡二| 欧美日韩中字一区| 国产精品情趣视频| 久久精品国产在热久久| 91成人免费在线| 久久久久久久久久久99999| 亚洲va国产天堂va久久en| 国产成人午夜视频| 欧美精品v国产精品v日韩精品| 《视频一区视频二区| 精品一区二区三区免费视频| 欧美午夜电影网| 国产精品嫩草99a| 黄色资源网久久资源365| 欧美精品免费视频| 最新高清无码专区| 国产99一区视频免费| 欧美一区二区三区在线视频| 国产曰批免费观看久久久| 久久免费午夜影院| 欧美日韩大陆在线| 免费视频一区二区| 欧美色网站导航| 亚洲国产wwwccc36天堂| 欧美精品123区| 欧美一级久久久久久久大片| 国产成人精品综合在线观看| 亚洲国产美女搞黄色| 欧美日韩精品专区| 中文在线资源观看网站视频免费不卡 | 欧美高清在线一区| 韩国av一区二区三区在线观看| 欧美区视频在线观看| 亚洲午夜电影在线| 欧美亚洲国产一区二区三区va | 色成人在线视频| 亚洲欧美自拍偷拍色图| 成人开心网精品视频| 国产午夜精品久久久久久久| 国产一区在线不卡| 国产视频一区二区在线| 国产激情91久久精品导航| 久久精品人人做人人爽人人| 国产一区二区在线电影| 精品成人在线观看| 国产xxx精品视频大全| 久久久久久免费网| 粉嫩av一区二区三区粉嫩| 国产精品乱码一区二区三区软件| 成人在线一区二区三区| 国产精品理伦片| 91蜜桃视频在线| 一区二区三区久久| 欧美日韩高清一区| 蜜桃久久久久久久| 久久综合国产精品| 欧美写真视频网站| 亚洲一区二区美女| 91精品国产综合久久久久久久久久 | 久久色视频免费观看| 国产又黄又大久久| 亚洲综合小说图片| 精品国产一区二区三区久久影院| 99久久精品久久久久久清纯| 美国十次综合导航| 亚洲3atv精品一区二区三区| 成人免费一区二区三区视频| 欧美电影免费提供在线观看| 欧美三级欧美一级| 大白屁股一区二区视频| 日本成人在线电影网| 国产精品久久久久久久午夜片| 777午夜精品视频在线播放| 不卡一区二区三区四区| 日韩主播视频在线| 亚洲高清免费一级二级三级| 一区二区三区在线影院| 国产无遮挡一区二区三区毛片日本| 欧美日韩国产区一| 精品免费视频.| 欧美剧情电影在线观看完整版免费励志电影| 欧美日韩第一区日日骚| 色综合中文综合网| 毛片av一区二区| 日韩欧美中文字幕公布| 国内一区二区在线| 亚洲精品水蜜桃| 日韩欧美在线综合网| 成人v精品蜜桃久久一区| 综合亚洲深深色噜噜狠狠网站| 51精品秘密在线观看| 高清不卡在线观看av| 亚洲地区一二三色| 国产日本欧美一区二区| 欧美美女bb生活片| 国产成人av一区二区三区在线观看| 亚洲主播在线播放| 久久久国产精品麻豆| 欧美日韩国产一区| 成人国产亚洲欧美成人综合网 | 久久影院电视剧免费观看| 成人免费黄色大片| 日本欧美一区二区| 亚洲色图欧洲色图婷婷| 精品国产伦一区二区三区观看方式| 91久久免费观看| 国产精品一区二区在线观看不卡| 一区二区三区日韩精品| 国产清纯美女被跳蛋高潮一区二区久久w | 日韩精品在线网站| 欧美性色黄大片手机版| 国产精品亚洲专一区二区三区| 亚洲成人资源网| 亚洲人成网站影音先锋播放| 国产亚洲污的网站| 欧美大尺度电影在线| 欧美日韩一区二区在线视频| 99这里只有久久精品视频| 国产一区视频网站| 免费xxxx性欧美18vr| 亚洲午夜久久久久中文字幕久| 国产精品久久久久国产精品日日| 精品国产乱码久久久久久1区2区| 欧美美女黄视频| 91成人免费在线视频| 91在线精品一区二区| 国产成人亚洲综合色影视| 欧美aaaaaa午夜精品| 亚洲成a人片在线观看中文| 亚洲欧美日韩国产综合在线 | 色偷偷久久人人79超碰人人澡| 成人一区在线观看| 韩国av一区二区| 裸体在线国模精品偷拍| 日韩高清在线不卡| 亚洲18女电影在线观看| 亚洲亚洲精品在线观看| 亚洲午夜影视影院在线观看| 亚洲老妇xxxxxx| 亚洲精品免费电影| 亚洲乱码国产乱码精品精98午夜| 18成人在线观看| 国产精品高清亚洲| 亚洲视频一二三区| 亚洲欧美自拍偷拍色图| 亚洲欧美色图小说| 亚洲乱码精品一二三四区日韩在线| **性色生活片久久毛片| 亚洲欧洲国产日本综合| 成人欧美一区二区三区1314| 亚洲欧洲精品一区二区精品久久久| 国产精品人成在线观看免费| 国产片一区二区| 国产精品国产三级国产aⅴ中文| 国产精品国产三级国产aⅴ入口 | av激情综合网| 91网站最新网址| 色婷婷久久久久swag精品| 日本丶国产丶欧美色综合| 在线观看一区不卡| 欧美性色aⅴ视频一区日韩精品| 亚洲视频在线一区观看| 国产高清在线精品| 一区二区三区四区不卡在线| 91久久久免费一区二区| 日韩精品每日更新| 国产喷白浆一区二区三区| 欧美日韩www| 国产一区二区三区香蕉|