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

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

?? yscomm.cpp

?? 通過貓實現(xiàn)計算機之間的通信
?? CPP
?? 第 1 頁 / 共 2 頁
字號:
// 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:串口的串口號
	hWnd:用來接收消息的窗口句柄

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: 關閉串口句柄

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個字符,否則出錯

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

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

COMMENTS:
        不能支持多線程

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

		注意和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的值及說明,可組合起來用
		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ū)內的字符數(shù)
nType=TYPE_READ 表示查讀緩沖區(qū)
nType=TYPE_WRITE表示寫緩沖區(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:要寫的字符串
		dwCount:字符串的長度

RETURN VALUE: 
    -1:除timeout外其它錯誤
	1:表示寫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)結束
            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);//取消寫操作
	return nRet;
}

/*
很簡單的設置串口的程序,無參數(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

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
在线精品国精品国产尤物884a| 国产成人aaa| 国产精品免费久久| 欧美肥妇bbw| 99riav一区二区三区| 久久97超碰色| 五月综合激情婷婷六月色窝| 日本一区二区成人| 日韩欧美美女一区二区三区| 99免费精品视频| 国产精品综合在线视频| 同产精品九九九| 亚洲天堂久久久久久久| 欧美www视频| 制服丝袜中文字幕亚洲| 樱花草国产18久久久久| 色综合天天综合色综合av| 精品一区二区免费在线观看| 亚洲一区二区在线视频| 国产精品卡一卡二| 国产亚洲福利社区一区| 日韩欧美黄色影院| 欧美丰满美乳xxx高潮www| 日本韩国欧美国产| 99久久伊人久久99| 国产91高潮流白浆在线麻豆| 韩国v欧美v亚洲v日本v| 日韩黄色一级片| 亚洲成人先锋电影| 一区二区三区不卡视频在线观看 | 中文字幕五月欧美| 久久九九影视网| 久久在线观看免费| 欧美精品一区二| 日韩精品一区在线观看| 欧美一级爆毛片| 91精品国产免费| 日韩天堂在线观看| 欧美一级午夜免费电影| 91麻豆精品国产自产在线| 精品视频免费看| 欧美日韩国产精选| 欧美丰满美乳xxx高潮www| 欧美放荡的少妇| 91精品国产91久久综合桃花| 日韩一区二区在线观看| 欧美一二三区精品| 日韩一区二区在线播放| 日韩欧美成人一区| 久久久久久夜精品精品免费| 久久综合狠狠综合久久综合88| 欧美一区二区三区在线看| 日韩午夜在线影院| www久久精品| 中文子幕无线码一区tr| 中文字幕一区二区三区四区| 国产精品第四页| 亚洲最色的网站| 午夜成人在线视频| 国产自产2019最新不卡| 成人免费毛片app| 欧美在线你懂的| 91精品国产一区二区三区| 日韩免费成人网| 国产日产欧美精品一区二区三区| 国产精品久久毛片a| 一区二区三区久久| 天天操天天干天天综合网| 麻豆一区二区在线| 成人午夜av电影| 精品视频全国免费看| 欧美成人vps| 国产精品第一页第二页第三页| 一区二区三区中文字幕| 中文字幕电影一区| 久久夜色精品一区| 亚洲伦理在线免费看| 三级不卡在线观看| 成人久久18免费网站麻豆| 在线免费不卡电影| 精品久久久久av影院| 最新高清无码专区| 美女一区二区久久| 99久久精品情趣| 欧美一级欧美三级| 亚洲免费在线电影| 九九精品视频在线看| eeuss鲁一区二区三区| 国产黄色成人av| 色综合天天性综合| 精品久久久久久久人人人人传媒| 亚洲日本韩国一区| 国产一区二区调教| 欧美三级乱人伦电影| 久久精品亚洲国产奇米99| 亚洲午夜日本在线观看| 国产酒店精品激情| 欧美一区欧美二区| 一区二区三区高清在线| 国产91富婆露脸刺激对白| 在线播放91灌醉迷j高跟美女 | 日本道免费精品一区二区三区| 日韩久久久久久| 亚洲图片欧美综合| 高清久久久久久| 欧美大片顶级少妇| 亚洲第一会所有码转帖| 成人网男人的天堂| 精品国产免费视频| 日本在线不卡视频| 91成人在线观看喷潮| 亚洲国产高清aⅴ视频| 奇米在线7777在线精品| 色乱码一区二区三区88| 国产精品婷婷午夜在线观看| 蜜臀久久99精品久久久久久9| 色婷婷久久久亚洲一区二区三区| 久久精品亚洲乱码伦伦中文 | 国产真实乱偷精品视频免| 8v天堂国产在线一区二区| 一区二区不卡在线播放| www.色精品| 国产清纯白嫩初高生在线观看91 | 91精品国产综合久久久久久| 洋洋av久久久久久久一区| 91在线视频网址| 国产精品视频看| 国产91在线观看丝袜| 久久久久久久久久电影| 国产在线精品一区二区夜色| 欧美一级在线免费| 蜜臀久久久久久久| 综合久久久久久| 日韩精品一区二区在线观看| 日韩精品一级二级| 欧美日韩www| 五月天国产精品| 91精品国产丝袜白色高跟鞋| 日本中文一区二区三区| 在线电影院国产精品| 日本vs亚洲vs韩国一区三区| 日韩一区二区在线看| 美女www一区二区| 久久伊99综合婷婷久久伊| 国内精品国产成人| 久久久久国产免费免费| 丁香天五香天堂综合| 国产精品欧美一级免费| eeuss鲁片一区二区三区在线观看| 中文字幕第一区综合| 91农村精品一区二区在线| 亚洲精品大片www| 欧美精品一卡两卡| 韩日av一区二区| 欧美极品少妇xxxxⅹ高跟鞋| 成人av免费在线| 亚洲精品久久7777| 欧美夫妻性生活| 黑人精品欧美一区二区蜜桃| 欧美激情一区在线| 91黄色免费观看| 久久激情综合网| 日本一区二区成人在线| 在线日韩av片| 裸体一区二区三区| 欧美国产在线观看| 在线观看成人小视频| 琪琪一区二区三区| 国产精品乱码妇女bbbb| 欧洲另类一二三四区| 麻豆精品久久精品色综合| 久久精品人人爽人人爽| 色婷婷香蕉在线一区二区| 日本网站在线观看一区二区三区| 精品国产污污免费网站入口 | 成人av网址在线| 亚洲一区中文日韩| 欧美大片国产精品| 色综合久久久久综合| 五月综合激情日本mⅴ| 国产欧美一区二区三区网站| 欧美在线不卡一区| 韩国女主播成人在线| 亚洲女人的天堂| 日韩免费在线观看| 99精品视频中文字幕| 免费观看在线色综合| 亚洲婷婷在线视频| 亚洲精品在线三区| 欧美日韩久久久| 成人黄色一级视频| 青娱乐精品视频| 一区二区三区影院| 久久久精品影视| 欧美精品第一页| 91麻豆自制传媒国产之光| 国产一区二区在线观看免费| 亚洲国产成人av网| 国产精品全国免费观看高清| 欧美一区二区视频在线观看2022|