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

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

?? ceserialcomm.cpp

?? PDA串口通訊程序,實現收發功能并根據協議解析等功能
?? CPP
字號:
/*************************************************************************
 CeSerialComm.cpp: implementation of the CCeSerialComm class.
 作    者:	Raymond
 創建時間:	2006.04.19
 作    用:	封裝串口API
*************************************************************************/
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "RddDbg.h"
#include "CeSerialComm.h"

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

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

CCeSerialComm::CCeSerialComm()
{
	m_hComm = NULL;
	m_strPort = _T("COM1");
	m_strError = _T("");
	m_uRate = 9600;
}

CCeSerialComm::~CCeSerialComm()
{

}

BOOL CCeSerialComm::InitComm(LPCTSTR lpszPort, UINT uRate, UINT uTimeOut)
{
	if(IsCommOpened()) return TRUE;

	if(!OpenComm(lpszPort)) return FALSE;

	DCB commParam;
	// 得到打開串口的當前屬性參數,修改后再重新設置串口。
	// 設置串口的超時特性為立即返回。
	if (!GetCommState(m_hComm,&commParam))
	{
		return FALSE;
	}
	
	commParam.fOutxCtsFlow = FALSE;
	commParam.fOutxDsrFlow = FALSE;
	commParam.fRtsControl = DTR_CONTROL_DISABLE;
	commParam.fDtrControl = DTR_CONTROL_DISABLE;
	commParam.BaudRate = uRate;     // set the baud rate
	commParam.ByteSize = 8;             // data size, xmit, and rcv
	commParam.Parity = NOPARITY;        // no parity bit
	commParam.StopBits = ONESTOPBIT;    // one stop bit
	
	if (!SetCommState(m_hComm, &commParam))
	{
		AfxMessageBox(_T("設置串口屬性參數失敗!"));		
		return FALSE;
	}
	
	
    //設置串口讀寫時間
	COMMTIMEOUTS CommTimeOuts;
	GetCommTimeouts (m_hComm, &CommTimeOuts);
	CommTimeOuts.ReadIntervalTimeout = MAXDWORD;  
	CommTimeOuts.ReadTotalTimeoutMultiplier = 0;  
	CommTimeOuts.ReadTotalTimeoutConstant = 0;    
	CommTimeOuts.WriteTotalTimeoutMultiplier = 10;  
	CommTimeOuts.WriteTotalTimeoutConstant = 1000;  
	
	if(!SetCommTimeouts( m_hComm, &CommTimeOuts ))
	{
		TRACE( _T("SetCommTimeouts 返回錯誤") );
		return FALSE;
	}
	
	//指定端口監測的事件集
	SetCommMask (m_hComm, EV_RXCHAR|EV_TXEMPTY);
	
	//分配設備緩沖區
	SetupComm(m_hComm, 2048, 2048);
	
	//初始化緩沖區中的信息
	PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);

	return TRUE;
}

BOOL CCeSerialComm::OpenComm(LPCTSTR lpszPort)
{
	TCHAR szPort[15];	
	
	//設置串口名
	wsprintf(szPort, L"%s:", lpszPort);
	m_hComm = CreateFile(szPort, GENERIC_READ|GENERIC_WRITE, 0, NULL,
		                 OPEN_EXISTING, 0, NULL);

	if(m_hComm == INVALID_HANDLE_VALUE)
	{
		m_strError = GetLastErrorDisc();
		AfxMessageBox(m_strError);
		return FALSE;
	}
	
	return TRUE;
}

BOOL CCeSerialComm::CloseComm()
{
	if(m_hComm != NULL && m_hComm != INVALID_HANDLE_VALUE) return FALSE;
	return CloseHandle(m_hComm);
}

BOOL CCeSerialComm::ClearCommBreaks()
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;

	return ClearCommBreak(m_hComm);
}

BOOL CCeSerialComm::ClearCommErrors(LPDWORD lpErrors, LPCOMSTAT lpStat)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return ClearCommError(m_hComm, lpErrors, lpStat);
}

BOOL CCeSerialComm::GetCommMasks(LPDWORD lpEvtMask)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return GetCommMask(m_hComm, lpEvtMask);
}

BOOL CCeSerialComm::GetCommStates(LPDCB lpDCB)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return GetCommState(m_hComm, lpDCB);
}

BOOL CCeSerialComm::GetCommTimeOut(LPCOMMTIMEOUTS lpCommTimeouts)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return GetCommTimeouts(m_hComm, lpCommTimeouts);
}

BOOL CCeSerialComm::SetCommTimeOut(LPCOMMTIMEOUTS lpCommTimeouts)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return SetCommTimeouts(m_hComm, lpCommTimeouts);
}

BOOL CCeSerialComm::PurgeCeComm(DWORD dwFlags)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return PurgeComm(m_hComm, dwFlags);
}

BOOL CCeSerialComm::SetCommMasks(DWORD dwEvtMsk)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return SetCommMask(m_hComm, dwEvtMsk);
}

BOOL CCeSerialComm::SetCommStates(LPDCB lpDCB)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return SetCommState(m_hComm, lpDCB);	
}

BOOL CCeSerialComm::IsCommOpened()
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;

	return TRUE;
}

BOOL CCeSerialComm::ReadNoEvent(BYTE *pByMsg, DWORD dwLen, LPDWORD lpdwReadLen, DWORD dwTimeOut/* =0 */)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	
	if(dwTimeOut != 0)
	{
		COMMTIMEOUTS CommTimeouts;
		if(!GetCommTimeOut(&CommTimeouts)) return FALSE;
		
		CommTimeouts.ReadTotalTimeoutMultiplier = 10;
		CommTimeouts.ReadTotalTimeoutConstant = dwTimeOut;
		if(!SetCommTimeOut(&CommTimeouts)) return FALSE;
	}
	
	if(!ReadFile(m_hComm, pByMsg, dwLen, lpdwReadLen, NULL))
	{
		CloseComm();
		return FALSE;
	}
	if(*lpdwReadLen != dwLen) return FALSE;
	return TRUE;
}

BOOL CCeSerialComm::ReadComm(BYTE *pByMsg, DWORD dwNumberOfBytesToRead, LPDWORD lpNumOfByRead, DWORD dwTimeOut)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;

	if(dwTimeOut != 0)
	{
		COMMTIMEOUTS CommTimeouts;
		if(!GetCommTimeOut(&CommTimeouts)) return FALSE;
		
		CommTimeouts.ReadTotalTimeoutMultiplier = 10;
		CommTimeouts.ReadTotalTimeoutConstant = dwTimeOut;
		if(!SetCommTimeOut(&CommTimeouts)) return FALSE;
	}

	if(!ReadFile(m_hComm, pByMsg, dwNumberOfBytesToRead, lpNumOfByRead, NULL))
	{
		CloseComm();
		return FALSE;
	}
	return TRUE;
}

BOOL CCeSerialComm::WriteComm(BYTE *pByMsg, DWORD dwNumOfByToWrite, LPDWORD lpNumOfByWritten, DWORD dwTimeOut)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;

	if(dwTimeOut != 0)
	{
		COMMTIMEOUTS CommTimeouts;
		if(!GetCommTimeOut(&CommTimeouts)) return FALSE;
		
		CommTimeouts.WriteTotalTimeoutMultiplier = 10;
		CommTimeouts.WriteTotalTimeoutConstant = dwTimeOut;
		if(!SetCommTimeOut(&CommTimeouts)) return FALSE;
	}

	if(!WriteFile(m_hComm, pByMsg, dwNumOfByToWrite, lpNumOfByWritten, NULL))
	{
		CloseComm();
		return FALSE;
	}

	return TRUE;
}

BOOL CCeSerialComm::WaitCommEvents(LPDWORD lpEvtMask)
{
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	return WaitCommEvent(m_hComm, lpEvtMask, NULL);	
}

int CCeSerialComm::ReadAframe(BYTE *pByMsg, LPDWORD lpdwReadLen, DWORD dwTimeOut /* = 0 */)
{
	*lpdwReadLen = 0;
	DWORD dwIndex = 0;
	DWORD dwReadLen;

	if(!Read(pByMsg+dwIndex, 1, &dwReadLen, dwTimeOut)) return 0; //讀出錯
	if(pByMsg[0] != 0xeb && pByMsg[0] != 0xd7) return -1; //報文頭第一個字節出錯
	dwIndex += 1; //讀出一個字節
	*lpdwReadLen = dwIndex;
	
	if(!Read(pByMsg+dwIndex, 1, &dwReadLen, dwTimeOut)) return 0; //讀出錯
	if(!(pByMsg[0]==0xeb && pByMsg[1]==0x90) && !(pByMsg[0]==0xd7 && pByMsg[1]==0x09)) return -1; //報文頭出錯
	dwIndex += 1; //讀出一個字節
	*lpdwReadLen = dwIndex;
	
	if(!Read(pByMsg+dwIndex, 2, &dwReadLen, dwTimeOut)) return 0; //讀出錯
	int iMsgLen = pByMsg[2] + pByMsg[3]*0x100;
	if(iMsgLen > MAX_MSG_LEN) return -1; //長度出錯
	dwIndex += 2; //讀出2個字節
	*lpdwReadLen = dwIndex;
	
	if(!Read(pByMsg+dwIndex, iMsgLen-4, &dwReadLen, dwTimeOut)) return 0; //讀出錯

	dwIndex += iMsgLen-4; //讀出iMsgLen-4個字節
	*lpdwReadLen = dwIndex;
	
	return 1; //讀完
	
}

BOOL CCeSerialComm::Recv(BYTE *pByMsg, DWORD &dwLen, DWORD dwTimeOut)
{
	dwLen = 0;
	DWORD dwCommStatus;
	
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	//清空串口
	if(!PurgeCeComm(PURGE_RXCLEAR | PURGE_TXCLEAR )) return FALSE;
	
	if(!SetCommMasks(EV_RXCHAR)) return FALSE;
	
	if(!WaitCommEvents(&dwCommStatus)) return FALSE;
	
	if(!SetCommMasks(EV_RXCHAR)) return FALSE;
	
	if(dwCommStatus & EV_RXCHAR)
	{
		DWORD dwReadLen;
		DWORD dwIndex = 0;
		
		do 
		{
			
			if(!ReadComm(pByMsg+dwIndex, 1, &dwReadLen, dwTimeOut))
			{
				m_strError = GetLastErrorDisc();
				return FALSE;
			}
			
			if(dwReadLen == 1)
			{
				dwIndex++;
				dwLen ++;
			}
			else
			{
				return FALSE;
			}

		} while(dwReadLen == 1);
		
		return TRUE;
	}

	return FALSE;
}

/*****************************************************************************************
	設計意圖:從串口中讀取指定長度的數據。如果串口中原來有數據,則直接讀出來,讀到夠長度就
			  返回,如果不夠,則等待直到讀到所需為止。如果串口中沒有數據,則等待
*****************************************************************************************/
BOOL CCeSerialComm::Read(BYTE *pByMsg, DWORD dwLen, LPDWORD lpdwReadLen, DWORD dwTimeOut)
{
	*lpdwReadLen = 0;
	
	if(m_hComm == NULL || m_hComm == INVALID_HANDLE_VALUE) return FALSE;
	COMSTAT comStat;
	DWORD dwErrors;
	DWORD dwCommStatus;
	BOOL bIsHasData = TRUE; //原本就有數據

	if(!ClearCommErrors(&dwErrors, &comStat)) return FALSE;
	DWORD dwInLen = comStat.cbInQue;
	if(dwInLen < 1) //沒有數據
	{
		//清空串口
		if(!PurgeCeComm(PURGE_RXCLEAR | PURGE_TXCLEAR )) return FALSE;
		
		if(!SetCommMasks(EV_RXCHAR)) return FALSE;

		if(!WaitCommEvents(&dwCommStatus)) return FALSE;

		bIsHasData = FALSE;
	}
	
	DWORD dwIndex = 0;
	DWORD dwReadLen;

	//有數據來,或者原本就有數據
	if((dwCommStatus & EV_RXCHAR) || bIsHasData)
	{
		do 
		{
			if(!ReadComm(pByMsg+dwIndex, 1, &dwReadLen, dwTimeOut))
			{
				*lpdwReadLen = dwReadLen;
				m_strError = GetLastErrorDisc();
				return FALSE;
			}
			if(dwReadLen == 1) 
			{
				dwIndex++;
			}
			
			if(dwIndex == dwLen) //已經讀完所需
			{
				*lpdwReadLen = dwLen;
				return TRUE;
			}

		} while(dwIndex < dwInLen);
	}
	
	//清空串口
	if(!PurgeCeComm(PURGE_RXCLEAR | PURGE_TXCLEAR )) return FALSE;
	//長度不夠
	if(!SetCommMasks(EV_RXCHAR)) return FALSE;
	
	//讀到所需為止
	while(dwIndex < dwLen)
	{
		if(!WaitCommEvents(&dwCommStatus)) return FALSE;

		if(!SetCommMasks(EV_RXCHAR)) return FALSE;
		
		if(dwCommStatus & EV_RXCHAR)
		{
			do 
			{
				if(!ReadComm(pByMsg+dwIndex, 1, &dwReadLen, dwTimeOut))
				{
					m_strError = GetLastErrorDisc();
					*lpdwReadLen = dwReadLen;
					return FALSE;
				}

				if(dwReadLen == 1) dwIndex++;
				
				if(dwIndex == dwLen) //已經夠所需了
				{
					*lpdwReadLen = dwLen;
					return TRUE;
				}
			
			} while(dwReadLen == 1);
		}
		
	}
	
	return FALSE;
}

BOOL CCeSerialComm::Write(BYTE *pByMsg, DWORD dwLen, LPDWORD lpdwWriteLen, DWORD dwTimeOut)
{
	UINT uIndex = 0;
	*lpdwWriteLen = 0;
	
	while(uIndex < dwLen)
	{
		DWORD dwWrittenLen;

		if(!WriteComm(pByMsg+uIndex, 1, &dwWrittenLen))
		{
			m_strError = GetLastErrorDisc();
			return FALSE;
		}
		if(dwWrittenLen == 1)
		{
			uIndex++;
			(*lpdwWriteLen)++;
		}
		else 
		{
			return FALSE;
		}
	}

	return TRUE;
}

CString CCeSerialComm::GetLastErrorDisc()
{
	int iErCode = GetLastError();

	HLOCAL hLocal = NULL;
	BOOL fOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
			    NULL, iErCode, MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
				(PTSTR) &hLocal, 0, NULL);
	
	//如果沒有則從網絡模塊查找.
	if(!fOk) 
	{
		HMODULE hDLL = LoadLibraryEx(TEXT("netmsg.dll"), NULL, 
				      DONT_RESOLVE_DLL_REFERENCES);
		if(hDLL != NULL)
		{
			FormatMessage(FORMAT_MESSAGE_FROM_HMODULE | FORMAT_MESSAGE_FROM_SYSTEM,
				hDLL, iErCode, MAKELANGID(LANG_CHINESE, SUBLANG_CHINESE_SIMPLIFIED),
				(PTSTR)&hLocal, 0, NULL);
			FreeLibrary(hDLL);
		}
	}

	if(hLocal != NULL)
	{
		CString strMsg;
		strMsg.Format(_T("%s"), (PTSTR)LocalLock(hLocal));
		m_strError = strMsg;
		LocalFree(hLocal);
		return strMsg;
	}

	return _T("Unknow Error");
}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
韩国在线一区二区| 欧美一级日韩免费不卡| 国产精品一级片| 国产主播一区二区| 精品无人区卡一卡二卡三乱码免费卡| 午夜av电影一区| 日本视频免费一区| 欧美aaaaa成人免费观看视频| 日本一不卡视频| 久久机这里只有精品| 久久国产精品99久久久久久老狼| 久色婷婷小香蕉久久| 久久69国产一区二区蜜臀| 久久99热99| 福利电影一区二区| www.66久久| 在线观看区一区二| 7777精品伊人久久久大香线蕉的 | 国产91精品露脸国语对白| 国产毛片精品一区| 成人福利视频在线| 在线观看www91| 91精品国产一区二区人妖| 日韩欧美一级特黄在线播放| 久久综合丝袜日本网| 中文字幕av资源一区| 日韩理论片在线| 午夜欧美2019年伦理| 老司机精品视频导航| 国产成人一级电影| 91蝌蚪porny成人天涯| 欧美日韩另类一区| 久久一区二区视频| 国产精品传媒入口麻豆| 亚洲一级二级三级| 久久99精品久久久久久国产越南 | 国产一区二区在线影院| 成人一区二区三区视频| 日本二三区不卡| 日韩一区二区影院| 国产精品传媒视频| 日韩电影在线看| 成人久久18免费网站麻豆| 一区二区三区在线视频观看58 | 成人av动漫网站| 色噜噜夜夜夜综合网| 久久精品一级爱片| 精品乱人伦小说| 国产精品乱子久久久久| 亚洲va在线va天堂| 国产一区二区三区在线观看精品 | 日韩女优av电影| 国产精品久久久久影院亚瑟| 丝袜美腿成人在线| 成人综合激情网| 欧美一区二区三区四区五区| 国产精品三级在线观看| 日韩黄色免费电影| 99久久国产综合精品女不卡| 日韩免费高清av| 夜色激情一区二区| 国产凹凸在线观看一区二区| 欧美日韩日日摸| 中文字幕一区二区三区四区不卡 | 成人av电影在线| 日韩欧美卡一卡二| 亚洲精品午夜久久久| 国产成人一区二区精品非洲| 欧美精三区欧美精三区| 中文字幕亚洲欧美在线不卡| 美女爽到高潮91| 欧美日韩第一区日日骚| 亚洲视频在线一区| 国产一区二区不卡| 69久久夜色精品国产69蝌蚪网| 中文字幕在线不卡| 国产成人午夜电影网| 91精品在线免费| 亚洲一二三四久久| 91免费版pro下载短视频| 久久久精品欧美丰满| 蜜桃av一区二区| 欧美精品第一页| 亚洲综合激情另类小说区| 成人免费黄色大片| 久久久国产综合精品女国产盗摄| 日韩中文字幕av电影| 欧美亚洲国产bt| 亚洲欧美韩国综合色| www.色精品| 国产亚洲成aⅴ人片在线观看| 久久精品99国产国产精| 欧美一区二区三区免费大片| 午夜精品久久久久久不卡8050| 一本色道亚洲精品aⅴ| 国产精品久久精品日日| 粉嫩一区二区三区在线看| 2022国产精品视频| 国产乱子伦视频一区二区三区| 欧美大片一区二区| 麻豆精品视频在线| 精品久久人人做人人爰| 久久97超碰色| 久久久久久久性| 国产风韵犹存在线视精品| 久久精品一区二区| 国产69精品久久久久毛片| 国产视频一区在线观看| 国产精品99久| 日本一区二区三区四区在线视频| 国产精品自产自拍| 国产精品色呦呦| 91丨porny丨中文| 亚洲一区二区欧美| 7878成人国产在线观看| 麻豆精品久久精品色综合| 欧美xxxxxxxxx| 国产精品亚洲第一区在线暖暖韩国| 久久综合999| 不卡一区二区三区四区| 亚洲色图欧美在线| 欧美视频第二页| 日本成人在线一区| 久久这里都是精品| 不卡视频在线观看| 一个色妞综合视频在线观看| 欧美日高清视频| 韩国欧美国产一区| 国产精品色噜噜| 精品视频1区2区| 久久爱www久久做| 欧美国产精品专区| 日本乱人伦aⅴ精品| 日日骚欧美日韩| 精品国产髙清在线看国产毛片| 国产a精品视频| 亚洲精品国产a久久久久久| 9191久久久久久久久久久| 韩国av一区二区三区在线观看| 国产精品久线观看视频| 欧美日韩精品二区第二页| 国产麻豆精品一区二区| 亚洲视频香蕉人妖| 欧美一区二区日韩| 成人在线视频一区二区| 亚洲二区视频在线| 久久噜噜亚洲综合| 欧美影院精品一区| 国产综合久久久久久久久久久久| 国产精品福利在线播放| 欧美精品tushy高清| 国产.欧美.日韩| 午夜久久福利影院| 欧美激情综合网| 911精品产国品一二三产区| 国产v日产∨综合v精品视频| 亚洲午夜精品久久久久久久久| 精品国产一二三| 欧美午夜精品久久久| 激情欧美一区二区三区在线观看| 亚洲欧美另类久久久精品 | 亚洲人成在线播放网站岛国| 欧美精品一二三区| yourporn久久国产精品| 蜜臀av性久久久久蜜臀aⅴ| 国产精品成人一区二区三区夜夜夜| 欧美日韩高清一区二区三区| 成人免费电影视频| 奇米影视一区二区三区| 亚洲色图在线播放| 国产夜色精品一区二区av| 在线91免费看| 日本久久一区二区| 成人免费精品视频| 久久成人免费网| 亚洲成人av在线电影| 国产精品欧美综合在线| 精品国产免费视频| 777亚洲妇女| 在线观看亚洲精品| 风流少妇一区二区| 国产在线精品一区二区三区不卡| 亚洲123区在线观看| 亚洲激情成人在线| 中文字幕一区二区日韩精品绯色| 精品不卡在线视频| 日韩一区二区三区av| 欧美三级乱人伦电影| 色哟哟国产精品| 99久久伊人久久99| 国产成人啪免费观看软件| 九九精品一区二区| 免费看日韩a级影片| 天使萌一区二区三区免费观看| 亚洲免费观看高清完整版在线观看熊 | 欧美日韩在线亚洲一区蜜芽| 91色在线porny| 99re成人精品视频| 成人高清视频在线观看| 成人免费电影视频|