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

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

?? ceseries.cpp

?? windows ce下的串口測試程序
?? CPP
字號:
// CESeries.cpp: implementation of the CCESeries class.
//
//////////////////////////////////////////////////////////////////////

#include "stdafx.h"
#include "SeriesSample.h"
#include "CESeries.h"

#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//定義向?qū)懢€程發(fā)送的消息常量
const CM_THREADCOMMWRITE = WM_USER+110;

//類CCESeries構(gòu)造函數(shù)
CCESeries::CCESeries()
{
	m_hComm = INVALID_HANDLE_VALUE;
	
}

//類CCESeries析構(gòu)函數(shù)
CCESeries::~CCESeries()
{
	
}

BOOL CCESeries::ClearRxTxBuffer(BYTE Flag)
{
	PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
	return TRUE;
}
BOOL CCESeries::SetClearBreak(BYTE Flag)
{
	if(Flag==1)
	{
		SetCommBreak(m_hComm);
	}
	else
	{
		ClearCommBreak(m_hComm);
	}
	return TRUE;
}
#define IOCTL_OPERATE_SEND 0x807
BOOL CCESeries::OperateSerialSend(VOID)
{
	HANDLE hComm=NULL; 
	hComm = CreateFile(_T("KPT1:"),GENERIC_READ | GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
	DeviceIoControl(hComm,IOCTL_OPERATE_SEND,NULL,0,NULL,0,0,NULL);
	CloseHandle(hComm);
	return TRUE;
}
/*
*函數(shù)介紹:打開串口
*入口參數(shù):pPortOwner	:使用此串口類的窗體句柄
		   portNo		:串口號
		   baud			:波特率
		   parity		:奇偶校驗
		   databits		:數(shù)據(jù)位
		   stopbits		:停止位
*出口參數(shù):(無)
*返回值:TRUE:成功打開串口;FALSE:打開串口失敗
*/
BOOL CCESeries::OpenPort(CWnd* pPortOwner,			/*使用串口類,窗體句柄*/
						 UINT portNo	,			/*串口號*/
						 UINT baud		,			/*波特率*/
						 UINT parity	,			/*奇偶校驗*/
						 UINT databits	,			/*數(shù)據(jù)位*/
						 UINT stopbits			   /*停止位*/
						 )
{
	DCB commParam;
	TCHAR szPort[15];	
	
	// 已經(jīng)打開的話,直接返回
	if (m_hComm != INVALID_HANDLE_VALUE)
	{
		return TRUE;
	}
	ASSERT(pPortOwner != NULL);
	ASSERT(portNo > 0 && portNo < 5);
	
	//設(shè)置串口名
	wsprintf(szPort, L"COM%d:", portNo);
	//打開串口
	m_hComm = CreateFile(
		szPort,
		GENERIC_READ | GENERIC_WRITE,	//允許讀和寫
		0,								//獨占方式(共享模式)
		NULL,
		OPEN_EXISTING,					//打開而不是創(chuàng)建(創(chuàng)建方式)
		0,
		NULL 
		);
	
	if (m_hComm == INVALID_HANDLE_VALUE)
	{
		// 無效句柄,返回。		
		TRACE(_T("CreateFile 返回?zé)o效句柄"));
		return FALSE;
		
	}
	
	// 得到打開串口的當(dāng)前屬性參數(shù),修改后再重新設(shè)置串口。
	// 設(shè)置串口的超時特性為立即返回。
	
	if (!GetCommState(m_hComm,&commParam))
	{		
		return FALSE;
	}
	
	commParam.BaudRate = baud;					// 設(shè)置波特率 
	commParam.fBinary = TRUE;					// 設(shè)置二進制模式,此處必須設(shè)置TRUE
	commParam.fParity = TRUE;					// 支持奇偶校驗 
	commParam.ByteSize = databits;				// 數(shù)據(jù)位,范圍:4-8 
	commParam.Parity = parity;				// 校驗?zāi)J?	commParam.StopBits = stopbits;				// 停止位 
	
	commParam.fOutxCtsFlow = FALSE;				// No CTS output flow control 
	commParam.fOutxDsrFlow = FALSE;				// No DSR output flow control 
	commParam.fDtrControl = DTR_CONTROL_ENABLE; 
	// DTR flow control type 
	commParam.fDsrSensitivity = FALSE;			// DSR sensitivity 
	commParam.fTXContinueOnXoff = TRUE;			// XOFF continues Tx 
	commParam.fOutX = FALSE;					// No XON/XOFF out flow control 
	commParam.fInX = FALSE;						// No XON/XOFF in flow control 
	commParam.fErrorChar = FALSE;				// Disable error replacement 
	commParam.fNull = FALSE;					// Disable null stripping 
	commParam.fRtsControl = RTS_CONTROL_ENABLE; 
	// RTS flow control 
	commParam.fAbortOnError = FALSE;			// 當(dāng)串口發(fā)生錯誤,并不終止串口讀寫
	
	if (!SetCommState(m_hComm, &commParam))
	{
		TRACE(_T("SetCommState error"));		
		return FALSE;
	}
	
	
    //設(shè)置串口讀寫時間
	COMMTIMEOUTS CommTimeOuts;
	GetCommTimeouts (m_hComm, &CommTimeOuts);
	CommTimeOuts.ReadIntervalTimeout = MAXDWORD;  
	CommTimeOuts.ReadTotalTimeoutMultiplier = 10;  
	CommTimeOuts.ReadTotalTimeoutConstant = 10;    
	CommTimeOuts.WriteTotalTimeoutMultiplier = 10;  
	CommTimeOuts.WriteTotalTimeoutConstant = 1000;  
	
	if(!SetCommTimeouts( m_hComm, &CommTimeOuts ))
	{
		TRACE( _T("SetCommTimeouts 返回錯誤") );
		return FALSE;
	}
	
	m_pPortOwner = pPortOwner;	
	
	//指定端口監(jiān)測的事件集
	SetCommMask (m_hComm, EV_RXCHAR);
	
	//分配設(shè)備緩沖區(qū)
	SetupComm(m_hComm,512,512);
	
	//初始化緩沖區(qū)中的信息
	PurgeComm(m_hComm,PURGE_TXCLEAR|PURGE_RXCLEAR);
	
	m_hReadCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	m_hWriteCloseEvent = CreateEvent(NULL,TRUE,FALSE,NULL);
	//創(chuàng)建讀串口線程
	m_hReadThread = CreateThread(NULL,0,ReadThreadFunc,this,0,&m_dwReadThreadID);
	//創(chuàng)建寫串口線程
	m_hWriteThread = CreateThread(NULL,0,WriteThreadFunc,this,0,&m_dwWriteThreadID);
	
	TRACE(_T("串口打開成功"));
	
	return TRUE;
}

/*
*函數(shù)介紹:關(guān)閉串口
*入口參數(shù):(無)
*出口參數(shù):(無)
*返回值:  (無)
*/
void CCESeries::ClosePort()
{	
	//表示串口還沒有打開
	if (m_hComm == INVALID_HANDLE_VALUE)
	{
		return ;
	}
	
	//關(guān)閉讀線程
	CloseReadThread();
	//關(guān)閉寫線程
	CloseWriteThread();
	
	//關(guān)閉串口
	if (!CloseHandle (m_hComm))
	{
		m_hComm = INVALID_HANDLE_VALUE;
		return ;
	}
}


/*
*函數(shù)介紹:向串口發(fā)送數(shù)據(jù)
*入口參數(shù):buf		: 將要往串口寫入的數(shù)據(jù)的緩沖區(qū)
		   bufLen	: 將要往串口寫入的數(shù)據(jù)的緩沖區(qū)長度
*出口參數(shù):(無)
*返回值:TRUE:表示成功地將要發(fā)送的數(shù)據(jù)傳遞到寫線程消息隊列。
		 FALSE:表示將要發(fā)送的數(shù)據(jù)傳遞到寫線程消息隊列失敗。
		 注視:此處的TRUE,不直接代表數(shù)據(jù)一定成功寫入到串口了。
*/
BOOL CCESeries::WritePort(const BYTE *buf,DWORD bufLen)
{
	//將要發(fā)送的數(shù)據(jù)傳遞到寫線程消息隊列
	if (PostThreadMessage(m_dwWriteThreadID,CM_THREADCOMMWRITE,
		WPARAM(bufLen), LPARAM(buf)))
	{
		return TRUE;
	}
	
	return FALSE;
}

/*
*函數(shù)介紹:設(shè)置串口讀取、寫入超時
*入口參數(shù):CommTimeOuts : 指向COMMTIMEOUTS結(jié)構(gòu)
*出口參數(shù):(無)
*返回值:TRUE:設(shè)置成功;FALSE:設(shè)置失敗
*/
BOOL CCESeries::SetSeriesTimeouts(COMMTIMEOUTS CommTimeOuts)
{
	ASSERT(m_hComm != INVALID_HANDLE_VALUE);
	return SetCommTimeouts(m_hComm,&CommTimeOuts);
}


//串口讀線程函數(shù)
DWORD CCESeries::ReadThreadFunc(LPVOID lparam)
{
	CCESeries *ceSeries = (CCESeries*)lparam;
	
	DWORD	evtMask;
	BYTE * readBuf = NULL;//讀取的字節(jié)
	DWORD actualReadLen=0;//實際讀取的字節(jié)數(shù)
	DWORD willReadLen;
	
	DWORD dwReadErrors;
	COMSTAT	cmState;
	
	// 清空緩沖,并檢查串口是否打開。
	ASSERT(ceSeries->m_hComm !=INVALID_HANDLE_VALUE); 
	
	
	//清空串口
	PurgeComm(ceSeries->m_hComm, PURGE_RXCLEAR | PURGE_TXCLEAR );
	
	SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
	while (TRUE)
	{   	
		if (WaitCommEvent(ceSeries->m_hComm,&evtMask,0))
		{			
			SetCommMask (ceSeries->m_hComm, EV_RXCHAR | EV_CTS | EV_DSR );
			//表示串口收到字符		
			if (evtMask & EV_RXCHAR) 
			{
				
				ClearCommError(ceSeries->m_hComm,&dwReadErrors,&cmState);
				willReadLen = cmState.cbInQue ;
				if (willReadLen <= 0)
				{
					continue;
				}
				
				readBuf = new BYTE[willReadLen];
				ReadFile(ceSeries->m_hComm, readBuf, willReadLen, &actualReadLen,0);
				
				//如果讀取的數(shù)據(jù)大于0,
				if (actualReadLen>0)
				{
					//觸發(fā)讀取回調(diào)函數(shù)
					ceSeries->m_OnSeriesRead(ceSeries->m_pPortOwner,readBuf,actualReadLen);
				}
			}
		}
		//如果收到讀線程退出信號,則退出線程
		if (WaitForSingleObject(ceSeries->m_hReadCloseEvent, 0) == WAIT_OBJECT_0)
		{
			break;
		}
	}
	return 0;
}

//串口寫線程函數(shù)
DWORD CCESeries::WriteThreadFunc(LPVOID lparam)
{
	CCESeries *ceSeries = (CCESeries*)lparam;
	MSG msg;
	DWORD dwWriteLen = 0;
	BYTE * buf = NULL;
	
	while (TRUE)
	{
		//如果捕捉到線程消息
		if (PeekMessage(&msg, 0, 0, 0, PM_REMOVE))
		{
			if (msg.hwnd != 0 )
			{
				TranslateMessage(&msg);
				DispatchMessage(&msg);
				continue;
			}
			if (msg.message == CM_THREADCOMMWRITE)
			{
				//向串口寫
				buf = (BYTE*)msg.lParam;
				dwWriteLen = msg.wParam;
				//向串口寫
				WritePort(ceSeries->m_hComm,buf,dwWriteLen);
				//刪除動態(tài)分配的內(nèi)存
				delete[] buf;
			}
		}
		//如果收到寫線程退出信號,則退出線程
		if (WaitForSingleObject(ceSeries->m_hWriteCloseEvent,500) == WAIT_OBJECT_0)
		{
			break;
		}
		ceSeries->m_hWriteThread = NULL;
	}
	
	return 0;
}


//私用方法,用于向串口寫數(shù)據(jù),被寫線程調(diào)用
BOOL CCESeries::WritePort(HANDLE hComm,const BYTE *buf,DWORD bufLen)
{
	DWORD dwNumBytesWritten;
	DWORD dwHaveNumWritten =0 ; //已經(jīng)寫入多少
	
	ASSERT(hComm != INVALID_HANDLE_VALUE);
	do
	{
		if (WriteFile (hComm,					//串口句柄 
			buf+dwHaveNumWritten,				//被寫數(shù)據(jù)緩沖區(qū) 
			bufLen - dwHaveNumWritten,          //被寫數(shù)據(jù)緩沖區(qū)大小
			&dwNumBytesWritten,					//函數(shù)執(zhí)行成功后,返回實際向串口寫的個數(shù)	
			NULL))								//此處必須設(shè)置NULL
		{
			dwHaveNumWritten = dwHaveNumWritten + dwNumBytesWritten;
			//寫入完成
			if (dwHaveNumWritten == bufLen)
			{
				break;
			}
			Sleep(10);
		}
		else
		{
			return FALSE;
		}
	}while (TRUE);
	
	return TRUE;	
}



//關(guān)閉讀線程
void CCESeries::CloseReadThread()
{
	SetEvent(m_hReadCloseEvent);
	//設(shè)置所有事件無效無效
	SetCommMask(m_hComm, 0);
	//清空所有將要讀的數(shù)據(jù)
    PurgeComm( m_hComm,  PURGE_RXCLEAR );
    //等待10秒,如果讀線程沒有退出,則強制退出
    if (WaitForSingleObject(m_hReadThread,10000) == WAIT_TIMEOUT)
	{
		TerminateThread(m_hReadThread,0);
	}
	m_hReadThread = NULL;
}

//關(guān)閉寫線程
void CCESeries::CloseWriteThread()
{
	SetEvent(m_hWriteCloseEvent);
	
	//清空所有將要寫的數(shù)據(jù)
    PurgeComm( m_hComm,  PURGE_TXCLEAR );
	
    //等待10秒,如果讀線程沒有退出,則強制退出
    if (WaitForSingleObject(m_hWriteThread,10000) == WAIT_TIMEOUT)
	{
		TerminateThread(m_hWriteThread,0);
	}
	m_hWriteThread = NULL;
}

?? 快捷鍵說明

復(fù)制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久久久久99精品| 岛国精品在线观看| 国产精品无码永久免费888| 欧美亚洲高清一区二区三区不卡| 成人av资源站| 日韩av中文在线观看| 亚洲欧美日韩一区二区 | 欧美本精品男人aⅴ天堂| 色综合激情久久| 国产一区二区导航在线播放| 亚洲一区二区在线免费看| 国产精品卡一卡二| www一区二区| 日韩西西人体444www| 欧美性受xxxx| 92国产精品观看| 国产成人精品亚洲777人妖| 久久精品国产澳门| 日韩成人免费看| 亚洲超碰97人人做人人爱| 一区二区三区在线视频免费观看| 亚洲国产高清在线| 国产婷婷一区二区| 久久久久9999亚洲精品| 精品久久一二三区| 日韩欧美色综合| 7777精品久久久大香线蕉| 欧美影院一区二区| 欧美日韩一二三| 欧美精品视频www在线观看| 一本大道久久a久久综合| a级精品国产片在线观看| 成人一区二区三区视频在线观看| 国产麻豆欧美日韩一区| 久久99久久99| 国产精品一区二区久激情瑜伽| 精品亚洲成a人| 国产在线视频一区二区三区| 久久精品国产一区二区三区免费看 | 91蝌蚪porny成人天涯| 99精品视频在线免费观看| 99精品欧美一区二区蜜桃免费| 成人网页在线观看| 91在线免费看| 欧美主播一区二区三区美女| 在线一区二区三区四区五区 | 中文字幕不卡在线播放| 国产精品毛片久久久久久| 一区在线播放视频| 亚洲美女偷拍久久| 亚洲国产综合91精品麻豆| 水野朝阳av一区二区三区| 日日欢夜夜爽一区| 久久激五月天综合精品| 粉嫩aⅴ一区二区三区四区五区 | 欧美综合色免费| 91精品在线一区二区| 欧美电视剧在线看免费| 国产欧美视频一区二区三区| 国产精品麻豆一区二区| 亚洲综合色区另类av| 日本亚洲视频在线| 国产一区二区日韩精品| 成人福利视频网站| 欧美伊人久久大香线蕉综合69| 在线播放中文一区| 久久午夜国产精品| 亚洲人妖av一区二区| 日韩精品乱码av一区二区| 国产精品一区二区久久精品爱涩| 91丨国产丨九色丨pron| 欧美卡1卡2卡| 国产区在线观看成人精品| 亚洲欧美一区二区三区极速播放 | 丝袜美腿亚洲综合| 高清在线成人网| 欧美中文字幕一区二区三区 | 色呦呦国产精品| 欧美一区二区三区四区久久| 国产亚洲综合av| 亚洲成人黄色影院| 国产精品18久久久久久久久| 在线观看国产日韩| 国产视频一区二区三区在线观看| 亚洲一二三四区| 国产精品资源在线观看| 欧美精品vⅰdeose4hd| 国产精品高清亚洲| 麻豆精品视频在线| 在线精品视频小说1| 国产亚洲精品超碰| 日韩中文字幕区一区有砖一区 | 精品国产人成亚洲区| 亚洲精品国产无天堂网2021| 国产一区二区三区在线观看免费 | 欧美日韩综合不卡| 国产精品理论在线观看| 蜜臀av性久久久久av蜜臀妖精 | 欧美一级夜夜爽| 亚洲色图19p| 国产精品12区| 日韩午夜在线观看视频| 一区二区三区免费看视频| 成人中文字幕合集| 精品蜜桃在线看| 午夜精品久久久久影视| av在线一区二区三区| 国产亚洲成年网址在线观看| 日本美女一区二区三区视频| 欧美亚洲国产一卡| 一区二区三区四区蜜桃| zzijzzij亚洲日本少妇熟睡| 欧美电视剧在线看免费| 免费在线观看精品| 欧美日韩高清一区| 亚洲第一在线综合网站| 欧美性猛交xxxx乱大交退制版| 1024成人网| 91丨porny丨在线| 中文字幕av一区二区三区高| 国产成都精品91一区二区三| 久久久久久一二三区| 韩国一区二区视频| 精品久久久影院| 美女视频网站黄色亚洲| 欧美猛男超大videosgay| 一区二区三区中文字幕在线观看| 成人精品视频.| 中文无字幕一区二区三区| 国产精品1024久久| 国产色综合久久| 成人在线综合网站| 国产精品不卡一区二区三区| 不卡一区中文字幕| 国产精品国产三级国产普通话三级| 9久草视频在线视频精品| 欧美激情中文不卡| 高清不卡一二三区| 欧美国产一区视频在线观看| 成人蜜臀av电影| 亚洲天堂福利av| 91久久国产最好的精华液| 亚洲一区二区三区爽爽爽爽爽| 欧美在线视频日韩| 日韩制服丝袜先锋影音| 日韩一级大片在线观看| 国内精品伊人久久久久av影院| 久久九九久精品国产免费直播| 国产91精品免费| 一区二区三区欧美日| 欧美一区二区三区在线| 国产在线播放一区二区三区| 国产精品丝袜黑色高跟| 在线视频欧美精品| 午夜精品久久久久久久| 久久亚洲精品国产精品紫薇| 成人免费视频视频| 一区二区三区四区中文字幕| 欧美电影一区二区三区| 国精产品一区一区三区mba桃花 | 国产精品―色哟哟| 91丨九色丨国产丨porny| 夜夜精品视频一区二区| 制服丝袜av成人在线看| 国产精品一区二区三区乱码| 亚洲人吸女人奶水| 日韩欧美成人一区二区| 国产成人av自拍| 亚洲午夜激情网站| 欧美成人综合网站| 99久久婷婷国产综合精品电影| 亚洲综合小说图片| 欧美精品一区二区三区很污很色的 | 久久精品一区四区| 91在线精品一区二区| 美女视频一区二区| 成人欧美一区二区三区1314 | 国产日产欧美一区二区视频| 色综合久久久网| 精品一区二区三区久久| 亚洲人精品一区| 日韩精品一区二区三区中文不卡| av成人免费在线观看| 免费精品99久久国产综合精品| 日本一区二区成人| 欧美一区二区日韩| 91精品福利在线| 国产自产v一区二区三区c| 亚洲精品高清在线| 欧美国产日韩精品免费观看| 欧美电影一区二区三区| 91在线观看成人| 经典三级一区二区| 亚洲成人黄色影院| 亚洲天堂福利av| 久久精品欧美一区二区三区不卡 | 色噜噜狠狠成人中文综合| 国产美女在线精品| 日本欧美韩国一区三区| 亚洲一区二区三区中文字幕在线|