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

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

?? yscomm.cpp

?? 使用VC++編寫(xiě)
?? CPP
?? 第 1 頁(yè) / 共 2 頁(yè)
字號(hào):
// YsAT.cpp: implementation of the CYsComm class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "YsComm.h"

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

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

CYsComm::CYsComm()
{
//ifdef _BALANCE
	m_bSemiduplex=FALSE;
//#else
//	m_bSemiduplex=TRUE;//半雙工
//#endif
	m_hFileHandle = NULL;
	//m_overlappedWrite={0, 0, 0, 0, NULL};
	memset(&m_overlappedWrite,0,sizeof(OVERLAPPED));
	//m_overlappedRead  = {0, 0, 0, 0, NULL};
	memset(&m_overlappedRead,0,sizeof(OVERLAPPED));

	memset(&m_overlappedEvent,0,sizeof(OVERLAPPED));
	
	// Needed for overlapped I/O.
	m_overlappedWrite.hEvent = CreateEvent(NULL,TRUE,FALSE, NULL);
	if (m_overlappedWrite.hEvent == NULL)
	{
		TRACE(_TEXT("Unable to CreateEvent:\n "));
	}
		
	// Lets put an event in the Read overlapped structure.
	m_overlappedRead.hEvent = CreateEvent(NULL,TRUE,FALSE, NULL);
	if (m_overlappedRead.hEvent == NULL)
	{
		TRACE(_TEXT("Unable to CreateEvent: \n"));
	}

	m_overlappedEvent.hEvent = CreateEvent(NULL,TRUE,FALSE, NULL);
	if (m_overlappedEvent.hEvent == NULL)
	{
		TRACE(_TEXT("Unable to CreateEvent: \n"));
	}

	m_hStopReadEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	if (m_hStopReadEvent== NULL)
	{
		TRACE(_TEXT("Unable to CreateEvent: \n"));
	}

	m_hStopWriteEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	if (m_hStopWriteEvent== NULL)
	{
		TRACE(_TEXT("Unable to CreateEvent: \n"));
	}
	m_nPort=0;
	m_hWnd=NULL;
}

CYsComm::~CYsComm()
{
	StopComm();
	CloseHandle(m_overlappedRead.hEvent);
	CloseHandle(m_overlappedWrite.hEvent);
	CloseHandle(m_overlappedEvent.hEvent);
	CloseHandle(m_hStopWriteEvent);
	CloseHandle(m_hStopReadEvent);
}

/*************************2001.10.31 ycat *********************************************
FUNCTION: BOOL CYsComm::Create(UINT port,HWND hWnd)

PURPOSE: 創(chuàng)建串口文件句柄

PARAMETERS:
	port:串口的串口號(hào)
	hWnd:用來(lái)接收消息的窗口句柄

RETURN VALUE:
    如果操作成功,返回TRUE,如果失敗返回FALSE

COMMENTS: 
**********************************************************************/
BOOL CYsComm::Create(UINT port,BOOL bSemiduplex,HWND hWnd)
{
	m_bSemiduplex=bSemiduplex;
	CString sBuff;
	DWORD dwError = 0;

	if(m_hFileHandle!=NULL)
	{
		StopComm();
	}
	sBuff.Format(_TEXT("COM%d"),port);

	m_hFileHandle	=	CreateFile(sBuff,
						GENERIC_READ|GENERIC_WRITE,
						0,//exclusive access
						NULL,
						OPEN_EXISTING,	//必須
						FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,
						NULL);

	if(m_hFileHandle == INVALID_HANDLE_VALUE)
	{
		dwError = GetLastError();
		TRACE(_TEXT("Open COM%d Error code %d,Please check if the port is usable.\n"),port,dwError);
		return	FALSE;
	}
	m_hWnd=hWnd;
	m_nPort=port;
	return TRUE;
}
/*************************2001.10.31 ycat *********************************************
FUNCTION: void CYsComm::StopComm()

PURPOSE: 關(guān)閉串口句柄

PARAMETERS:

RETURN VALUE:

COMMENTS: 
**********************************************************************/
void CYsComm::StopComm()
{
    // No need to continue if we're not communicating.
    if (m_hFileHandle == NULL)
        return;
	//Purge(PURGE_ALL);
	
    TRACE(_TEXT("Stopping the Comm\n"));
	
    // Now close the comm port handle.
    CloseHandle(m_hFileHandle);
    m_hFileHandle = NULL;

}
/*************************2001.10.31 ycat *********************************************
/*************************2001.11.06 ycat *********************************************
FUNCTION: int CYsComm::ReadIn(LPTSTR  lpszInputBuffer,
							   DWORD dwCount,
							   DWORD dwReadTimeOut)

PURPOSE: 在dwReadTimeOut里讀到dwCount個(gè)字符,否則出錯(cuò)

PARAMETERS:
		lpszInputBuffer:	存放返回?cái)?shù)據(jù)的字符串緩沖區(qū)
		dwCount:			希望要讀到的字符個(gè)數(shù)
		dwReadTimeOut:		超時(shí)的時(shí)間

RETURN VALUE:
	   -1: 除-2,-3之外的其它錯(cuò)誤
		1:表示寫(xiě)com口成功
	   -2: 表示timeout
	   -3: 表示讀操作被停止

COMMENTS:
        不能支持多線程

		如果讀出的數(shù)和dwCount不一樣,那么將返回超時(shí)
		讀出來(lái)的數(shù)沒(méi)有意義

		注意和ReadComm()的區(qū)別
**********************************************************************/
int CYsComm::ReadIn(PBYTE  lpszInputBuffer,
							   DWORD dwCountoByte,
							   DWORD dwReadTimeOut)
{
	if ( m_hFileHandle == NULL)
	{
		TRACE(_TEXT("m_hFileHandle error.\n"));
		return -1;
	}
	int nRet;
    DWORD dwLastError;
    DWORD dwHandleSignaled;
    HANDLE HandlesToWaitFor[2];
	int iWait=2;
	
   // HandlesToWaitFor[0] = g_hCloseEvent;//為了支持多線程
	//OVERLAPPED o={0};
	//o.hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);
	
    HandlesToWaitFor[0] = m_overlappedRead.hEvent;
	HandlesToWaitFor[1] = m_hStopReadEvent;
	
	//HandlesToWaitFor[0] = o.hEvent;
	
	DWORD dwHaveReaded=0;

//	unsigned char
//	WCHAR

	if (ReadFile((HANDLE)m_hFileHandle, 
		(LPVOID)lpszInputBuffer,
		(DWORD)dwCountoByte,
		(LPDWORD)&dwHaveReaded,
		(LPOVERLAPPED)&m_overlappedRead))
	{  // This would only happen if there was data waiting to be read.
		
	//	TRACE(_TEXT("there waw data waiting to be read.\n");
		nRet=1;
		goto Exit;
	}
	// ReadFile failed.  Expected because of overlapped I/O.
	dwLastError = GetLastError();
	
	// Its possible for this error to occur if the 
	// service provider has closed the port.  Time to end.
	if (GetLastError()!= ERROR_IO_PENDING)
	{
		TRACE(_TEXT("Error to reading to CommFile %x\n"),dwLastError);
		nRet=-1;
		goto Exit;
	}
	
	// This is the expected ERROR_IO_PENDING case.
	
	// Wait for either overlapped I/O completion,
	// or for the CloseEvent to get signaled.
	dwHandleSignaled = 
		WaitForMultipleObjects(iWait,HandlesToWaitFor, 
		FALSE,dwReadTimeOut);
	switch(dwHandleSignaled)
	{
	case WAIT_OBJECT_0 : // Wait finished.
		{
			// Time to get the results of the WriteFile
			break;
		}
	case WAIT_OBJECT_0+1 : // Wait finished.
		{
			TRACE(_TEXT("stop read event set\n"));
			nRet=-3;
			goto Exit;
		}
	case WAIT_TIMEOUT :
		{
//			TRACE(_TEXT("read time out\n"));
			nRet=-2;
			goto Exit;
		}
		
	case WAIT_FAILED: // Wait failed.  Shouldn't happen.
		{
			TRACE(_TEXT("read WAIT_FAILED: \n "));

			nRet=-1;
			goto Exit;
		}
		
	default: // This case should never occur.
		{
			TRACE(_TEXT("Unexpected Wait return value '%x'"),dwHandleSignaled);
			nRet=-1;
			goto Exit;			
		}
	}
	
	if (GetOverlappedResult(m_hFileHandle,
		&m_overlappedRead,&dwHaveReaded, FALSE))
    {
		nRet=1;
		goto Exit;
	}
	else
	{
		//cause by Purge(PURGE_RXABORT)
		TRACE(_TEXT("read operation error \n "));
		nRet=-1;
	}
Exit:
/*	if(nRet==1)
	{
		for(UINT i=0;i<dwHaveReaded;i++)
		TRACE("@@@ %x @@@\n",lpszInputBuffer[i],lpszInputBuffer[i]);
	}*/
	if(nRet!=1) Purge(PURGE_RXABORT);//取消讀操作
	return nRet;
}
/*************************2001.10.31 ycat *********************************************
FUNCTION: int CYsComm::BOOL CYsComm::Purge(DWORD nType)

PURPOSE: 清除串口

PARAMETERS:
	nType的值及說(shuō)明,可組合起來(lái)用
		PURGE_TXABORT Terminates all outstanding overlapped write 
						operations and returns immediately, 
						even if the write operations have not been completed. 

		PURGE_RXABORT Terminates all outstanding overlapped 
						read operations and returns immediately, 
						even if the read operations have not been completed. 

		PURGE_TXCLEAR Clears the output buffer (if the device driver has one). 

		PURGE_RXCLEAR Clears the input buffer (if the device driver has one). 

RETURN VALUE: 如果操作成功,返回TRUE,如果失敗返回FALSE

COMMENTS: 
**********************************************************************/
BOOL CYsComm::Purge(DWORD nType)
{
	if(!m_hFileHandle)
	{
	//	SetLastError(_TEXT("comm file handle isn't available"));
		return FALSE;
	}

	if(nType&PURGE_RXABORT)
		PulseEvent(m_hStopReadEvent);

	if(nType&PURGE_TXABORT)
		PulseEvent(m_hStopWriteEvent);

	int i=PurgeComm(m_hFileHandle,nType);
	if(!i) 
	{
	//	SetLastError(_TEXT("Purge com fail"));
		return FALSE;
	}
//	ResetError();
//	TRACE(_TEXT("Purge Comm\n");
	return i;
}
/*查詢緩沖區(qū)內(nèi)的字符數(shù)
nType=TYPE_READ 表示查讀緩沖區(qū)
nType=TYPE_WRITE表示寫(xiě)緩沖區(qū)*/
BOOL CYsComm::GetBufferCount(int nType,LPDWORD lpNumberInBuffer)
{
	DWORD Errors;
	COMSTAT State;
	if(!ClearCommError(m_hFileHandle,&Errors,&State))
		return FALSE;
	if(nType==TYPE_READ) *lpNumberInBuffer=State.cbInQue;
	else *lpNumberInBuffer=State.cbOutQue;
	return TRUE;
}
/*************************2001.10.31 ycat *********************************************
FUNCTION: int CYsComm::WriteComm(LPCTSTR lpszStringToWrite,
								DWORD dwCount)

PURPOSE: 向串口發(fā)送數(shù)據(jù)

PARAMETERS:
		lpszStringToWrite:要寫(xiě)的字符串
		dwCount:字符串的長(zhǎng)度

RETURN VALUE: 
    -1:除timeout外其它錯(cuò)誤
	1:表示寫(xiě)com口成功
	-2:表示timeout
	-3:表示stop write event set

COMMENTS: 
		Change the WaitForSingleObject call to include a real 
	time-out value. This causes more problems because 
	if the program issues another operation 
	while an older operation is still pending, 
	new OVERLAPPED structures and overlapped 
	events need to be allocated. 
	This type of recordkeeping is difficult, 
	particularly when compared to using a “job queue” 
	design for the operations. 
	不支持多線程
**********************************************************************/
int CYsComm::WriteComm(PBYTE lpszStringToWrite,
								DWORD dwCount)
{
	if ( m_hFileHandle == NULL)
	{
		TRACE(_TEXT("m_hFileHandle error_W.\n"));
		return -1;
	}

	int nRet;
    DWORD dwLastError;
    DWORD dwHaveWritten = 0;
    DWORD dwStartWrite = 0; // Start at the beginning.
	DWORD dwNumToWrite = dwCount;
    DWORD dwHandleSignaled;
    HANDLE HandlesToWaitFor[2];
	int iWait=2;

	HandlesToWaitFor[0] = m_overlappedWrite.hEvent;
	HandlesToWaitFor[1] = m_hStopWriteEvent;

//	EscapeCommFunction(m_hFileHandle,SETRTS);//半雙工
    // Keep looping until all characters have been written.
    do
    {
        // Start the overlapped I/O.
        if (!WriteFile((HANDLE)m_hFileHandle, 
			(LPCVOID)&(lpszStringToWrite[dwStartWrite]), 
			(DWORD)dwCount,
			(LPDWORD)&dwHaveWritten,
			(LPOVERLAPPED)&m_overlappedWrite))
        {
            // WriteFile failed.  Expected; lets handle it.
            dwLastError = GetLastError();
			
            // Its possible for this error to occur if the 
            // service provider has closed the port.  Time to end.
			if(GetLastError()!= ERROR_IO_PENDING)
            {
                TRACE(_TEXT("Error to writing to CommFile %x\n"),dwLastError);
                nRet=-1;
				goto Exit;
            }
			
            // Wait for either overlapped I/O completion,
            // or for the CloseEvent to get signaled.
            dwHandleSignaled = 
                WaitForMultipleObjects(2, HandlesToWaitFor, 
				FALSE,5000);
			
            switch(dwHandleSignaled)
            {
				
			case WAIT_OBJECT_0 : // Wait finished.
                {
                    // Time to get the results of the WriteFile
                    break;
                }
			case WAIT_TIMEOUT :
				{
					TRACE(_TEXT("write time out\n"));
					nRet=-2;
					goto Exit;
				}
				
			case WAIT_FAILED: // Wait failed.  Shouldn't happen.
                {
                    TRACE(_TEXT("Write WAIT_FAILED: \n "));
                    nRet=-1;
					goto Exit;
                }
			case WAIT_OBJECT_0+1:
				{
					//stop event set
					TRACE(_TEXT("stop event set"));
					nRet=-3;
					goto Exit;
				}				
			default: // This case should never occur.
                {
                    TRACE(_TEXT("Unexpected Wait return value '%x'"),dwHandleSignaled);
                    nRet=-1;
					goto Exit;
                }
            }
			//判斷是否已經(jīng)結(jié)束
            if (!GetOverlappedResult(m_hFileHandle,
				&m_overlappedWrite,
				&dwHaveWritten,
				TRUE))
            {
                dwLastError = GetLastError();
				
                // Its possible for this error to occur if the 
                // service provider has closed the port.
                if (dwLastError == ERROR_INVALID_HANDLE)
                {
                    TRACE(_TEXT("ERROR_INVALID_HANDLE, Likely that the Service Provider has closed the port.\n"));
                    nRet=-1;
					goto Exit;
                }
                // No idea what could cause another error.
                TRACE(_TEXT("Error writing to CommFile while waiting %x \n"),dwLastError);
                nRet=-1;
				goto Exit;
            }
        }
        // Some data was written.  Make sure it all got written.
        //TRACE(_TEXT("Write bytes %ld\n",dwHaveWritten);
        dwCount -= dwHaveWritten;
        dwStartWrite += dwHaveWritten;
    }while(dwCount > 0);  // Write the whole thing!
	
    // Wrote the whole string.
//	*pdwCountWritten = dwNumToWrite;
    nRet=1;
Exit:
//	EscapeCommFunction(m_hFileHandle,CLRRTS);//半雙工
	if(nRet!=1) Purge(PURGE_TXABORT|PURGE_TXCLEAR);//取消寫(xiě)操作
	return nRet;
}

/*
很簡(jiǎn)單的設(shè)置串口的程序,無(wú)參數(shù)接口,還需修改
*/
BOOL CYsComm::SetComm(int iBaud)
{
  m_iBaud=iBaud;
  DCB dcb;
  BOOL fSuccess;
  
  fSuccess = GetCommState(m_hFileHandle, &dcb);

  if (!fSuccess) 
  {
      // Handle the error.
	  TRACE(_TEXT("GetCommState failed with error %d.\n"), GetLastError());
       return FALSE;
  }
//BuildCommDCB("2400,n,8,1", &dcb)) //another way to set DCB

  dcb.fBinary=TRUE;
  dcb.BaudRate = iBaud;       // set the baud rate
  dcb.ByteSize = 8;           // data size, xmit, and rcv
  dcb.Parity = 0;//EVENPARITY;//  Even  parity bit

?? 快捷鍵說(shuō)明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號(hào) Ctrl + =
減小字號(hào) Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
欧美色图一区二区三区| 色婷婷综合久色| 欧美日韩一区二区三区高清| 精品久久久久久久久久久久久久久久久 | 91丝袜美腿高跟国产极品老师 | 欧美一区二区三区色| 亚洲欧美一区二区三区久本道91| 精品一区二区三区香蕉蜜桃| 欧美性大战久久久久久久蜜臀 | 日韩亚洲欧美成人一区| 一区二区三区不卡在线观看| 国产尤物一区二区在线| 欧美精品在线一区二区三区| 中文字幕一区二区三区不卡| 久久99久久精品| 欧美日韩亚州综合| 亚洲视频一区二区在线| 国产成人免费9x9x人网站视频| 日韩一级在线观看| 性做久久久久久免费观看| 色综合久久久久| 久久久91精品国产一区二区三区| 日韩一区二区三区电影在线观看 | 国产一区二区中文字幕| 久久久精品国产免费观看同学| 91色在线porny| 日韩欧美一区在线观看| 国产99久久精品| 成人欧美一区二区三区1314| 欧美久久一二区| 国产午夜久久久久| 色视频一区二区| 亚洲区小说区图片区qvod| 国产精品小仙女| 欧美成人乱码一区二区三区| 中文字幕免费不卡在线| 色悠悠久久综合| 亚洲成va人在线观看| 精品国精品国产尤物美女| 国产99久久精品| 日韩电影在线观看网站| 久久久精品免费网站| 精品视频在线免费看| 国产一区欧美二区| 偷拍自拍另类欧美| 中文字幕永久在线不卡| 日韩精品中文字幕一区二区三区 | 性做久久久久久免费观看| 久久一留热品黄| 欧美卡1卡2卡| 91一区在线观看| 高清日韩电视剧大全免费| 偷拍一区二区三区| 日韩精品一区二区三区中文精品| av福利精品导航| 国产99一区视频免费| 免费成人av在线| 午夜精品一区二区三区免费视频| 亚洲国产精品成人综合 | 欧美日韩综合在线| 色噜噜夜夜夜综合网| 蜜桃视频在线观看一区| 国产精品三级电影| www国产精品av| 久久这里只有精品首页| 日韩一区二区三区高清免费看看| 欧美另类变人与禽xxxxx| 日本道色综合久久| 91色九色蝌蚪| 欧美色图一区二区三区| 亚洲日本va午夜在线电影| 不卡av在线免费观看| 国产主播一区二区| 国产精品综合av一区二区国产馆| 久久精品国产99国产精品| 精品一区二区三区蜜桃| 亚洲福利一二三区| 另类人妖一区二区av| 成人免费的视频| 88在线观看91蜜桃国自产| 欧美精品一区二区三区久久久| 欧美一级二级三级乱码| 中文字幕 久热精品 视频在线 | 婷婷夜色潮精品综合在线| 奇米亚洲午夜久久精品| 国产美女一区二区三区| www.色综合.com| 91成人在线观看喷潮| 欧美一卡2卡三卡4卡5免费| 久久女同精品一区二区| 国产精品热久久久久夜色精品三区| 亚洲国产一区二区在线播放| 91麻豆精品在线观看| 欧美性猛交xxxx黑人交| 日韩一区二区三区在线视频| 久久这里只有精品6| 亚洲日本免费电影| 水野朝阳av一区二区三区| 狠狠久久亚洲欧美| www.成人在线| 911国产精品| 日本一区二区动态图| 麻豆成人久久精品二区三区红 | 香蕉成人啪国产精品视频综合网| 日韩成人精品视频| 国产伦精品一区二区三区免费 | 一本久久a久久免费精品不卡| 国内精品国产三级国产a久久| 91啦中文在线观看| 中文在线一区二区| 91在线无精精品入口| 日韩美女精品在线| 国内精品久久久久影院一蜜桃| 国产精品一区在线| 欧美日韩视频在线一区二区| 国产精品久久久久久久蜜臀 | 日韩女优制服丝袜电影| 亚洲一区在线观看视频| 97aⅴ精品视频一二三区| 中文字幕国产一区| 成人丝袜18视频在线观看| 国产欧美精品在线观看| 国产又粗又猛又爽又黄91精品| 精品噜噜噜噜久久久久久久久试看 | 欧美一级生活片| 麻豆精品久久久| 日韩一区中文字幕| 欧美人与性动xxxx| 国产成人在线视频网址| 欧美国产禁国产网站cc| 欧美嫩在线观看| 丁香婷婷综合激情五月色| 亚洲小说欧美激情另类| 久久色视频免费观看| 欧美午夜精品理论片a级按摩| 精品一区二区三区久久久| 亚洲免费观看高清完整版在线 | eeuss影院一区二区三区| 亚洲欧美日本韩国| 欧美日韩国产综合久久| 紧缚奴在线一区二区三区| 亚洲特级片在线| 欧美一级高清片在线观看| 国产精品18久久久久久久久| 1024精品合集| 日韩精品一区二区三区四区 | 欧美亚洲另类激情小说| 美女性感视频久久| 国产清纯美女被跳蛋高潮一区二区久久w| 国产成人av福利| 日本aⅴ精品一区二区三区| 亚洲人精品午夜| 国产欧美日韩在线观看| 欧美一区三区四区| 亚洲成人www| 欧美精品一区二区三区蜜桃视频 | 欧美日韩综合一区| 久久超碰97中文字幕| 国产精品国产三级国产有无不卡| 91国在线观看| 久久电影网站中文字幕| 国产精品大尺度| 7777精品伊人久久久大香线蕉经典版下载 | 色菇凉天天综合网| 午夜久久久影院| 国产女人aaa级久久久级| 欧美喷潮久久久xxxxx| 国内久久精品视频| 亚洲国产欧美日韩另类综合 | 午夜精品久久久久久久久久久 | 欧美日本韩国一区二区三区视频 | 在线观看av一区| 国产suv精品一区二区三区| 性久久久久久久久| 中文字幕在线不卡一区二区三区| 51精品视频一区二区三区| 99精品久久99久久久久| 国产一区二区三区在线观看免费| 夜夜揉揉日日人人青青一国产精品| 日韩欧美一区二区不卡| 欧美刺激午夜性久久久久久久| 色网站国产精品| 不卡的av在线| 懂色av中文一区二区三区| 另类小说欧美激情| 青草av.久久免费一区| 亚洲精品伦理在线| 精品国产精品网麻豆系列| 91色在线porny| 92国产精品观看| 91在线播放网址| 91蜜桃免费观看视频| 一本久道中文字幕精品亚洲嫩| 99久久综合99久久综合网站| www.亚洲免费av| www.久久久久久久久| 色94色欧美sute亚洲线路二| 91麻豆国产精品久久| 在线观看一区二区精品视频| 欧洲国内综合视频|