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

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

?? ttydoc.cpp

?? 內有功能說明,是成功的上位機軟件,通過測試,可以使用
?? CPP
字號:
// TTYDoc.cpp : implementation of the CTTYDoc class
//

#include "stdafx.h"
#include "TTY.h"
#include "commsetDlg.h"
#include "TTYDoc.h"

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

/////////////////////////////////////////////////////////////////////////////
// CTTYDoc

IMPLEMENT_DYNCREATE(CTTYDoc, CDocument)

BEGIN_MESSAGE_MAP(CTTYDoc, CDocument)
	//{{AFX_MSG_MAP(CTTYDoc)
	ON_COMMAND(ID_API_CONNECT, OnApiConnect)
	ON_UPDATE_COMMAND_UI(ID_API_CONNECT, OnUpdateApiConnect)
	ON_COMMAND(ID_API_DISCONNECT, OnApiDisconnect)
	ON_UPDATE_COMMAND_UI(ID_API_DISCONNECT, OnUpdateApiDisconnect)
	ON_COMMAND(ID_API_SETTINGS, OnApiSettings)
	ON_UPDATE_COMMAND_UI(ID_API_SETTINGS, OnUpdateApiSettings)
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTTYDoc construction/destruction

CTTYDoc::CTTYDoc()
{
	// TODO: add one-time construction code here
//初始化操作
	m_bConnected=FALSE;//斷開連接菜單項無效
	m_pThread=NULL;

	m_nBaud = 9600;
	m_nDataBits = 8;
	m_bEcho = FALSE;
	m_bNewLine = FALSE;
	m_nParity = 0;
	m_sPort = "COM2";
	m_nStopBits = 0;
}

CTTYDoc::~CTTYDoc()
{
//程序結束時刪除線程、關閉串口的操作
	if(m_bConnected)
		CloseConnection();

	// 刪除事件句柄
	if(m_hPostMsgEvent)
		CloseHandle(m_hPostMsgEvent);

	if(m_osRead.hEvent)
		CloseHandle(m_osRead.hEvent);

	if(m_osWrite.hEvent)
		CloseHandle(m_osWrite.hEvent);
}

BOOL CTTYDoc::OnNewDocument()
{
	if (!CDocument::OnNewDocument())
		return FALSE;

	((CEditView*)m_viewList.GetHead())->SetWindowText(NULL);
	// TODO: add reinitialization code here
	// (SDI documents will reuse this document)
	
	// 為WM_COMMNOTIFY消息創建事件對象,手工重置,初始化為有信號的
	if((m_hPostMsgEvent=CreateEvent(NULL, TRUE, TRUE, NULL))==NULL)
		return FALSE;

	memset(&m_osRead, 0, sizeof(OVERLAPPED));
	memset(&m_osWrite, 0, sizeof(OVERLAPPED));

	// 為重疊讀創建事件對象,手工重置,初始化為無信號的
	if((m_osRead.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
		return FALSE;

	// 為重疊寫創建事件對象,手工重置,初始化為無信號的
	if((m_osWrite.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL))==NULL)
		return FALSE;
	return TRUE;
}

/////////////////////////////////////////////////////////////////////////////
// CTTYDoc serialization

void CTTYDoc::Serialize(CArchive& ar)
{
	// CEditView contains an edit control which handles all serialization
	((CEditView*)m_viewList.GetHead())->SerializeRaw(ar);
}

/////////////////////////////////////////////////////////////////////////////
// CTTYDoc diagnostics

#ifdef _DEBUG
void CTTYDoc::AssertValid() const
{
	CDocument::AssertValid();
}

void CTTYDoc::Dump(CDumpContext& dc) const
{
	CDocument::Dump(dc);
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CTTYDoc commands

BOOL CTTYDoc::CanCloseFrame(CFrameWnd* pFrame) 
{
	// TODO: Add your specialized code here and/or call the base class
	
	SetModifiedFlag(FALSE); // 將文檔的修改標志設置成未修改
	return CDocument::CanCloseFrame(pFrame);
}

// 工作者線程,負責監視串行口
UINT CommProc(LPVOID pParam)
{
	OVERLAPPED os;
	DWORD dwMask, dwTrans;
	COMSTAT ComStat;
	DWORD dwErrorFlags;

	CTTYDoc *pDoc=(CTTYDoc*)pParam;

	memset(&os, 0, sizeof(OVERLAPPED));
	os.hEvent=CreateEvent(NULL, TRUE, FALSE, NULL);

	if(os.hEvent==NULL)
	{
		AfxMessageBox("Can't create event object!");
		return (UINT)-1;
	}

	while(pDoc->m_bConnected)
	{
		ClearCommError(pDoc->m_hCom,&dwErrorFlags,&ComStat);

		if(ComStat.cbInQue)
		{
			// 無限等待WM_COMMNOTIFY消息被處理完
			WaitForSingleObject(pDoc->m_hPostMsgEvent, INFINITE);
			ResetEvent(pDoc->m_hPostMsgEvent);

			// 通知視圖
			PostMessage(pDoc->m_hTermWnd, WM_COMMNOTIFY, EV_RXCHAR, 0);

			continue;
		}

		dwMask=0;

		if(!WaitCommEvent(pDoc->m_hCom, &dwMask, &os)) // 重疊操作
		{

			if(GetLastError()==ERROR_IO_PENDING)
			// 無限等待重疊操作結果
				GetOverlappedResult(pDoc->m_hCom, &os, &dwTrans, TRUE);
			else
			{
				CloseHandle(os.hEvent);
				return (UINT)-1;
			}
		}
	}

	CloseHandle(os.hEvent);
	return 0;
}

// 將指定數量的字符從串行口輸出
DWORD CTTYDoc::WriteComm(char *buf, DWORD dwLength)
{
	BOOL fState;
	DWORD length=dwLength;
	COMSTAT ComStat;
	DWORD dwErrorFlags;

	ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
	fState=WriteFile(m_hCom,buf,length,&length,&m_osWrite);

	if(!fState)
	{

		if(GetLastError()==ERROR_IO_PENDING)
		{
			GetOverlappedResult(m_hCom,&m_osWrite,&length,TRUE);// 等待
		}
		else
			length=0;
	}

	return length;
}

// 從串行口輸入緩沖區中讀入指定數量的字符
DWORD CTTYDoc::ReadComm(char *buf, DWORD dwLength)
{
	DWORD length=0;
	COMSTAT ComStat;
	DWORD dwErrorFlags;

	ClearCommError(m_hCom,&dwErrorFlags,&ComStat);
	length=min(dwLength, ComStat.cbInQue);
	ReadFile(m_hCom,buf,length,&length,&m_osRead);

	return length;
}

//菜單項"串口連接"的響應
void CTTYDoc::OnApiConnect() 
{
	// TODO: Add your command handler code here
	if(!OpenConnection())
		AfxMessageBox("Can't open connection");
}

//更新"串口連接"菜單項
void CTTYDoc::OnUpdateApiConnect(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(!m_bConnected);
}

//菜單項"斷開連接"的響應函數
void CTTYDoc::OnApiDisconnect() 
{
	// TODO: Add your command handler code here
	CloseConnection(); 
}

//更新菜單項"斷開連接"
void CTTYDoc::OnUpdateApiDisconnect(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(m_bConnected);
}

//菜單項"串行口設置" 的響應函數
void CTTYDoc::OnApiSettings() 
{
	// TODO: Add your command handler code here
	CCommSetDlg dlg;
	CString str;

	dlg.m_bConnected = m_bConnected;

	dlg.m_sPort = m_sPort;

	str.Format("%d", m_nBaud);
	dlg.m_sBaud = str;

	str.Format("%d", m_nDataBits);
	dlg.m_sDataBits = str;

	dlg.m_nParity = m_nParity;
	
	dlg.m_nStopBits = m_nStopBits;
	
	dlg.m_bEcho = m_bEcho;
	dlg.m_bNewLine = m_bNewLine;

	if(dlg.DoModal() == IDOK)
	{
		m_sPort = dlg.m_sPort;
		m_nBaud = atoi(dlg.m_sBaud);
		m_nDataBits = atoi(dlg.m_sDataBits);
		m_nParity = dlg.m_nParity;
		m_nStopBits = dlg.m_nStopBits;
		
		m_bEcho=dlg.m_bEcho;
		m_bNewLine=dlg.m_bNewLine;

		if(m_bConnected)
			if(!ConfigConnection())
				AfxMessageBox("Can't realize the settings!");
	}
}

//更新"串行口設置"菜單項
void CTTYDoc::OnUpdateApiSettings(CCmdUI* pCmdUI) 
{
	// TODO: Add your command update UI handler code here
	
}
 //配置串口連接
BOOL CTTYDoc::ConfigConnection()
{
	DCB dcb;

	if(!GetCommState(m_hCom, &dcb))
		return FALSE;

	dcb.fBinary=TRUE;
	dcb.BaudRate = m_nBaud; // 數據傳輸速率
	dcb.ByteSize = m_nDataBits; // 每字節位數
	dcb.fParity = TRUE;

	switch(m_nParity) // 校驗設置
	{
	case 0: 
		dcb.Parity=NOPARITY;
		break;

	case 1: 
		dcb.Parity=EVENPARITY;
		break;

	case 2: 
		dcb.Parity=ODDPARITY;
		break;

	default:;
	}

	switch(m_nStopBits) // 停止位
	{
	case 0: 
		dcb.StopBits=ONESTOPBIT;
		break;

	case 1: 
		dcb.StopBits=ONE5STOPBITS;
		break;

	case 2:
		dcb.StopBits=TWOSTOPBITS;
		break;

	default:;
	}

	// 硬件流控制設置
	dcb.fOutxCtsFlow = TRUE;
	dcb.fRtsControl = TRUE;

	// XON/XOFF流控制設置
	dcb.fInX=dcb.fOutX = TRUE;
	dcb.XonChar = XON;
	dcb.XoffChar = XOFF;
	dcb.XonLim = 50;
	dcb.XoffLim = 50;

	return SetCommState(m_hCom, &dcb);
}

// 打開并配置串行口,建立工作者線程
BOOL CTTYDoc::OpenConnection()
{
	COMMTIMEOUTS TimeOuts;
	POSITION firstViewPos;
	CView *pView;

	firstViewPos=GetFirstViewPosition();
	pView=GetNextView(firstViewPos);

	m_hTermWnd=pView->GetSafeHwnd();

	if(m_bConnected)
		return FALSE;

	m_hCom=CreateFile(m_sPort, GENERIC_READ | GENERIC_WRITE, 0, NULL,
		OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, 
		NULL); // 重疊方式

	if(m_hCom==INVALID_HANDLE_VALUE)
		return FALSE;

	SetupComm(m_hCom,MAXBLOCK,MAXBLOCK);
	SetCommMask(m_hCom, EV_RXCHAR);


	// 把間隔超時設為最大,把總超時設為0將導致ReadFile立即返回并完成操作
	TimeOuts.ReadIntervalTimeout=MAXDWORD; 
	TimeOuts.ReadTotalTimeoutMultiplier=0; 
	TimeOuts.ReadTotalTimeoutConstant=0; 

	/* 設置寫超時以指定WriteComm成員函數中的GetOverlappedResult函數的等待時間*/
	TimeOuts.WriteTotalTimeoutMultiplier=50;
	TimeOuts.WriteTotalTimeoutConstant=2000;

	SetCommTimeouts(m_hCom, &TimeOuts);

	if(ConfigConnection())
	{

		m_pThread=AfxBeginThread(CommProc, this, THREAD_PRIORITY_NORMAL, 
			0, CREATE_SUSPENDED, NULL); // 創建并掛起線程

		if(m_pThread==NULL)
		{
			CloseHandle(m_hCom);
			return FALSE;
		}
		else

		{
			m_bConnected=TRUE;
			m_pThread->ResumeThread(); // 恢復線程運行
		}
	}
	else
	{
		CloseHandle(m_hCom);
		return FALSE;
	}
	
	return TRUE;
}

//關閉連接,關閉工作線程
void CTTYDoc::CloseConnection()
{
	if(!m_bConnected)
		return;

	m_bConnected=FALSE;

	//結束CommProc線程中WaitSingleObject函數的等待
	SetEvent(m_hPostMsgEvent); 

	//結束CommProc線程中WaitCommEvent的等待
	SetCommMask(m_hCom, 0); 

	//等待輔助線程終止
	WaitForSingleObject(m_pThread->m_hThread, INFINITE);
	m_pThread=NULL;
	CloseHandle(m_hCom);

}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
日韩亚洲国产中文字幕欧美| 天堂影院一区二区| 亚洲电影一级片| 国产精品69毛片高清亚洲| 欧美女孩性生活视频| 中文字幕中文在线不卡住| 极品少妇一区二区三区精品视频| 99麻豆久久久国产精品免费| 欧美r级在线观看| 亚洲一区视频在线| 国产91高潮流白浆在线麻豆| 日韩欧美区一区二| 亚洲一区二区偷拍精品| jlzzjlzz国产精品久久| 久久精品视频一区二区| 日本va欧美va瓶| 欧美剧情片在线观看| 亚洲精品国产成人久久av盗摄 | 九九九精品视频| 91麻豆精品视频| 久久久综合精品| 国产在线不卡一卡二卡三卡四卡| 欧美精品vⅰdeose4hd| 亚洲成人免费av| 欧美色综合影院| 亚洲风情在线资源站| 欧美三级在线播放| 亚洲一二三四区| 日本伦理一区二区| 一二三四社区欧美黄| 色av成人天堂桃色av| 亚洲一区二区三区美女| 欧美日韩在线三级| 日韩电影在线观看一区| 欧美一卡二卡在线| 老色鬼精品视频在线观看播放| 91精品综合久久久久久| 青草av.久久免费一区| 精品久久一二三区| 国产伦理精品不卡| 国产日韩欧美一区二区三区综合| 东方aⅴ免费观看久久av| 国产精品三级av在线播放| av激情亚洲男人天堂| 一区二区三区 在线观看视频| 欧美日韩在线电影| 久久黄色级2电影| 久久九九久久九九| 日本乱人伦aⅴ精品| 日韩精品成人一区二区三区| 精品精品欲导航| 国产美女在线观看一区| 中文字幕成人av| 色嗨嗨av一区二区三区| 欧美aaa在线| 欧美国产欧美亚州国产日韩mv天天看完整 | 在线电影一区二区三区| 九九在线精品视频| 久久毛片高清国产| 一本大道av伊人久久综合| 亚洲成av人片| 日本一区二区三区四区| 欧美日韩精品欧美日韩精品一 | 精品一二三四在线| 国产精品美女久久久久久| 欧美日韩中文国产| 国产乱码一区二区三区| 亚洲综合成人网| 精品国产亚洲一区二区三区在线观看 | 国产精品嫩草99a| 欧美日韩激情一区| 丁香另类激情小说| 亚洲成a人片在线观看中文| 久久精品人人做| 在线观看av不卡| 国产99久久久国产精品| 日韩经典中文字幕一区| 国产精品成人一区二区三区夜夜夜| 欧美日韩国产高清一区| 99久久综合99久久综合网站| 日本视频在线一区| 中文字幕在线一区| 欧美大片在线观看| 欧美日韩国产色站一区二区三区| 懂色av中文一区二区三区 | 午夜免费久久看| 欧美高清在线精品一区| 欧美一区二区在线免费播放| 色狠狠一区二区| 成人免费毛片高清视频| 老司机免费视频一区二区三区| 一二三四社区欧美黄| 亚洲欧洲成人自拍| 国产亚洲一二三区| 日韩精品中文字幕一区二区三区 | 色婷婷久久久久swag精品| 国产精品亚洲一区二区三区妖精| 婷婷一区二区三区| 一区二区三区中文字幕电影| 国产精品久久久久影院老司| 国产人成亚洲第一网站在线播放 | 欧美精品v日韩精品v韩国精品v| 91蜜桃传媒精品久久久一区二区| 国产精品123区| 国产东北露脸精品视频| 国产美女视频91| 国产最新精品免费| 激情欧美一区二区| 激情成人综合网| 狠狠色狠狠色综合系列| 精品亚洲国内自在自线福利| 麻豆精品久久久| 免费观看在线综合色| 午夜国产精品影院在线观看| 天天综合色天天综合| 三级久久三级久久久| 天堂一区二区在线| 欧美aaaaaa午夜精品| 精一区二区三区| 国产精品一卡二| 成人中文字幕合集| 99久久久久久99| 91福利在线观看| 欧美日韩精品免费| 精品国产自在久精品国产| 久久一夜天堂av一区二区三区| 久久久精品2019中文字幕之3| 国产欧美日产一区| 尤物av一区二区| 香蕉av福利精品导航| 久久99国产乱子伦精品免费| 国产激情一区二区三区| 91麻豆国产自产在线观看| 欧美另类z0zxhd电影| 欧美一区二区免费视频| 久久久久国产一区二区三区四区| 国产精品素人一区二区| 亚洲最大成人综合| 青青草国产精品97视觉盛宴 | 欧美—级在线免费片| 亚洲三级在线免费| 日韩不卡一区二区三区| 国产福利不卡视频| 欧美制服丝袜第一页| 久久亚洲精华国产精华液 | 中文字幕中文字幕中文字幕亚洲无线| 国产精品欧美久久久久一区二区| 亚洲制服丝袜av| 国内外精品视频| 在线观看一区不卡| 精品剧情在线观看| 亚洲一区二区四区蜜桃| 国产一区二区三区免费在线观看| 91亚洲大成网污www| 日韩欧美激情四射| 亚洲激情综合网| 激情另类小说区图片区视频区| 99国产精品国产精品毛片| 日韩一区二区三区免费看| 国产精品久久网站| 秋霞午夜鲁丝一区二区老狼| 97se亚洲国产综合在线| 精品久久人人做人人爽| 亚洲综合色视频| 成人av电影在线网| 日韩欧美第一区| 亚洲午夜精品在线| av午夜一区麻豆| 精品电影一区二区三区 | 久久久91精品国产一区二区精品| 亚洲一区二区三区免费视频| 成人午夜在线视频| 日韩欧美一区二区三区在线| 亚洲色图一区二区| 国产福利91精品一区| 日韩小视频在线观看专区| 亚洲综合免费观看高清完整版| 成人ar影院免费观看视频| 精品久久久久一区| 天天影视网天天综合色在线播放 | 一级特黄大欧美久久久| 成人污污视频在线观看| 精品少妇一区二区三区| 婷婷综合在线观看| 欧美亚洲国产bt| 亚洲乱码国产乱码精品精的特点| 高清在线不卡av| 久久久精品tv| 国产一区二区精品久久99 | 欧美一区二区三区色| 亚洲成人免费观看| 欧美无砖专区一中文字| 亚洲综合免费观看高清完整版| 一道本成人在线| 一区二区三区在线观看网站| 97精品国产97久久久久久久久久久久| 国产精品女同互慰在线看| 成人久久视频在线观看| 中文字幕+乱码+中文字幕一区| 成人深夜福利app|