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

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

?? pc2pcview.cpp

?? VisualC實踐與提高——串口通信與工程應用篇代碼
?? CPP
?? 第 1 頁 / 共 3 頁
字號:
// PC2PCView.cpp : implementation of the CPC2PCView class
//

#include "stdafx.h"
#include "PC2PC.h"

#include "PC2PCDoc.h"
#include "PC2PCView.h"

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


HANDLE hCom;                                //串口的句柄
HANDLE hThreadEvent;                      //事件線程句柄
DWORD ThreadProcEvent(LPVOID pParam);      //事件響應函數
bool fEventRun;                            //事件線程函數執行標志
HWND hWnd;                                  //窗口句柄
DWORD dwThreadID;                          //事件線程ID
OVERLAPPED Eol={0};                       //事件線程使用的OVERLAPPED結構Eol
OVERLAPPED Wol={0};                       //寫操作使用的OVERLAPPED結構Wol
OVERLAPPED Rol={0};                       //讀操作使用的OVERLAPPED結構Rol
DWORD	dwTimeoutValue;					//定義接收超時時間,ms為單位,在事件線程中使用


/////////////////////////////////////////////////////////////////////////////
// CPC2PCView

IMPLEMENT_DYNCREATE(CPC2PCView, CEditView)

BEGIN_MESSAGE_MAP(CPC2PCView, CEditView)
	//{{AFX_MSG_MAP(CPC2PCView)
	ON_COMMAND(ID_SETUPCOM, OnSetupcom)
	ON_COMMAND(ID_SENDFILE, OnSendfile)
	ON_COMMAND(ID_OPENCOM, OnOpencom)
	ON_COMMAND(ID_CLOSECOM, OnClosecom)
	ON_UPDATE_COMMAND_UI(ID_SENDFILE, OnUpdateSendfile)
	ON_UPDATE_COMMAND_UI(ID_SETUPCOM, OnUpdateSetupcom)
	ON_UPDATE_COMMAND_UI(ID_OPENCOM, OnUpdateOpencom)
	ON_UPDATE_COMMAND_UI(ID_CLOSECOM, OnUpdateClosecom)
	ON_WM_CREATE()
	ON_WM_DESTROY()
	ON_UPDATE_COMMAND_UI(ID_APP_EXIT, OnUpdateAppExit)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_MYMSG,OnReceiveEvent)

END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CPC2PCView construction/destruction

CPC2PCView::CPC2PCView()
{
	// TODO: add construction code here
	myCom="COM4";            //默認設置
	myBaudRate=CBR_4800;
	myfParity=false;
	myParity=NOPARITY;
}

CPC2PCView::~CPC2PCView()
{
}

BOOL CPC2PCView::PreCreateWindow(CREATESTRUCT& cs)
{
	// TODO: Modify the Window class or styles here by modifying
	//  the CREATESTRUCT cs

	BOOL bPreCreated = CEditView::PreCreateWindow(cs);
	cs.style &= ~(ES_AUTOHSCROLL|WS_HSCROLL);	// Enable word-wrapping

	return bPreCreated;
}

/////////////////////////////////////////////////////////////////////////////
// CPC2PCView drawing

void CPC2PCView::OnDraw(CDC* pDC)
{
	CPC2PCDoc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);
	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CPC2PCView diagnostics

#ifdef _DEBUG
void CPC2PCView::AssertValid() const
{
	CEditView::AssertValid();
}

void CPC2PCView::Dump(CDumpContext& dc) const
{
	CEditView::Dump(dc);
}

CPC2PCDoc* CPC2PCView::GetDocument() // non-debug version is inline
{
	ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CPC2PCDoc)));
	return (CPC2PCDoc*)m_pDocument;
}
#endif //_DEBUG

/////////////////////////////////////////////////////////////////////////////
// CPC2PCView message handlers

void CPC2PCView::OnSetupcom() 
{
	// TODO: Add your command handler code here
	CString strStatus;
	if(mySetupDlg.DoModal()==IDOK)
	{
		switch (mySetupDlg.m_Com)
		{
		case 0:
			{
			strStatus="COM1";
			strStatus+="  ";
			myCom="COM1";
			break;
			}
		case 1:
			{
			strStatus="COM2";
			strStatus+="  ";
			myCom="COM2";
			break;
			}

		case 2:
			{
			strStatus="COM3";
			strStatus+="  ";
			myCom="COM3";
			break;
			}

		case 3:
			{
			strStatus="COM4";
			strStatus+="  ";
			myCom="COM4";
			break;
			}

		case 4:
			{
			strStatus="COM5";
			strStatus+="  ";
			myCom="COM5";
			}
			break;
		case 5:
			{
			strStatus="COM6";
			strStatus+="  ";
			myCom="COM6";
			}
			break;
		}
		switch(mySetupDlg.m_BaudRate)
		{

		case 0:
			{
			strStatus+="19200";
			strStatus+="  ";
			myBaudRate=CBR_19200;
			break;
			}
		case 1:
			{
			strStatus+="9600";
			strStatus+="  ";
			myBaudRate=CBR_9600;
			break;
			}
		case 2:
			{
			strStatus+="4800";
			strStatus+="  ";
			myBaudRate=CBR_4800;
			break;
			}
		case 3:
			{
			strStatus+="2400";
			strStatus+="  ";
			myBaudRate=CBR_2400;
			break;
			}
		}
		switch(mySetupDlg.m_Parity)
		{
		case 0:
			{
			myfParity=false;
			myParity=NOPARITY;
			strStatus+="N";
			strStatus+="-8-1";
			break;
			}
		case 1:
			{
			myfParity=TRUE;
			myParity=ODDPARITY;
			strStatus+="O";
			strStatus+="-8-1";
			break;
			}
		case 2:
			{
			myfParity=true;
			myParity=EVENPARITY;
			strStatus+="E";
			strStatus+="-8-1";
			break;
			}
		}

		CMainFrame* m_pGetFrame=(CMainFrame*) AfxGetApp()->m_pMainWnd ;
		CStatusBar* m_pStatus=&m_pGetFrame->m_wndStatusBar;
		m_pStatus->SetPaneText(1,strStatus);     //將通信參數顯示在狀態條上
		blnSeted=true;
		
	}
}

void CPC2PCView::OnSendfile() 
{
	// TODO: Add your command handler code here
	
	CFileDialog myFileDlg(true);      //打開文件對話框
	CEdit& myEdit=this->GetEditCtrl();
	BYTE bytFileNameLen;              //文件名字符串的長度
	BYTE bytTemp;
	DWORD dwTemp1,dwTemp2;
	int i;
	CString myStr,myFileName,myPathName;
	CFileException e;                 //文件異常變量
	bytActStatus=1;                   //置為發送態
	if(myFileDlg.DoModal()==IDOK)     //調出文件選擇對話框,選擇傳送的文件
	{
		myPathName=myFileDlg.GetPathName();
		myFileName=myFileDlg.GetFileName();
		if(myFileName.GetLength()>100)
		{
			AfxMessageBox("文件名長度應小于100!");	
			bytActStatus=10;          //恢復為接收態
			return;
		}
		else
		{
			bytFileNameLen=(BYTE)myFileName.GetLength();
		}
	}
	else
	{
		bytActStatus=10;              //恢復為接收態

		return;
	}
	myPathName.Replace("\\","\\\\");  //將文件名中的單“\”替換成雙“\\”

	//打開選定的文件
	if(!myFile.Open(myPathName,CFile::modeRead|CFile::typeBinary|CFile::shareDenyWrite,&e))
	{
		myStr.Format("%02X",e.m_cause);//文件打開錯誤處理,錯誤代碼為m_cause
		myStr+="error";
		AfxMessageBox(myStr);
		bytActStatus=10;               //恢復為接收態
		return;
	}
	dwFileLen=myFile.GetLength();
	if(dwFileLen>=67108864)
	{
		AfxMessageBox("文件必須小于64MB!");//檢查文件尺寸<64MB
		bytActStatus=10;                //恢復為接收態
		return;
	}
	arrSendData[0]=05;                  //ENQ
	arrSendData[4]=(BYTE)(dwFileLen/16777216);
	dwTemp1=dwFileLen%16777216;
	arrSendData[3]=(BYTE)(dwTemp1/65536);
	dwTemp2=dwTemp1%65536;
	arrSendData[2]=(BYTE)(dwTemp2/256);
	arrSendData[1]=(BYTE)(dwTemp2%256);
	arrSendData[5]=bytFileNameLen;
	
	for(i=6;i<=bytFileNameLen+5;i++)    //保存文件名稱
	{
		arrSendData[i]=myFileName.GetAt(i-6);
	}
	
	bytTemp=0;

	for(i=0;i<=bytFileNameLen+5;i++)
	{
		bytTemp^=arrSendData[i];
	}
	arrSendData[bytFileNameLen+6]=bytTemp;//計算出校驗位

	bytSendStatus=1;
	bytResendCount=0;

	Write(arrSendData,bytFileNameLen+7);
	myEdit.SetSel(1000000,1000000);
	myEdit.ReplaceSel("發出傳輸請求。\15\12");

	blnNoTimeout=false;

}

void CPC2PCView::OnOpencom() 
{
	// TODO: Add your command handler code here
	//打開串口操作
	hCom=CreateFile(myCom,              //打開串口COM2
		GENERIC_READ | GENERIC_WRITE, //使用讀寫方式
		0,
		NULL,
		OPEN_EXISTING,
		FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED, //使用重疊方式
		NULL);
	if( hCom !=INVALID_HANDLE_VALUE) 
	{
		SetupComm(hCom,1500,1500);      //設置發送緩沖1500,接收緩沖區1500
		DCB myDCB;
		GetCommState( hCom, &myDCB ); //獲取當前串口參數
		myDCB.BaudRate=myBaudRate;
		myDCB.fBinary=TRUE;
		myDCB.fParity=myfParity;
		myDCB.ByteSize=8;
		myDCB.Parity=myParity;
		myDCB.StopBits=ONESTOPBIT;
		SetCommState(hCom,&myDCB);     //設置串口通信參數
		blnOpened=true;

		//創建并立即執行線程函數
		DWORD dwParam;
		if (!SetCommMask(hCom,EV_RXCHAR))// | EV_TXEMPTY))//設置允許的事件類型
		{
			AfxMessageBox("建立事件掩碼失敗!");
		}
		hThreadEvent=CreateThread(NULL,                 //創建事件線程
			0,
			(LPTHREAD_START_ROUTINE )ThreadProcEvent,   //指定線程函數名稱
			&dwParam,
			0,                                               //創建線程函數后,立即執行
			&dwThreadID);
		if (hThreadEvent==INVALID_HANDLE_VALUE)
		{
			AfxMessageBox("事件線程創建失敗!");
		}
		fEventRun=true;                                    //允許事件函數執行循環體
		bytActStatus=10;
		bytSendStatus=0;
		bytRcvStatus=0;
		bytResendCount=0;
		uintStxCurNo=0;
	}
	else
	{
		AfxMessageBox("創建串口失敗!");
	}
	
}

void CPC2PCView::OnClosecom() 
{
	// TODO: Add your command handler code here
	fEventRun=false;                     //停止事件線程循環體的操作
	WaitForSingleObject(hThreadEvent,    //等待事件線程函數退出
		INFINITE);                        //無限時地等待,直到事件線程函數退出
	CloseHandle(hThreadEvent);        //關閉事件線程句柄
	CloseHandle(hCom);                  //關閉串口句柄
	blnOpened=false;
}

//事件線程函數
DWORD ThreadProcEvent(LPVOID pParam)
{
	DWORD dwErrors;
	COMSTAT Rcs;
	DWORD dwEvtMask,dwRes;
	Eol.hEvent=CreateEvent(NULL, //設置Eol.hEvent成員為無信號狀態
		TRUE, 
		FALSE, 
		NULL);
	while(fEventRun)
	{
		WaitCommEvent(hCom,                            //監視串口事件
			&dwEvtMask,                                 //存放事件掩碼組合值
			&Eol);                                       //OVERLAPPED結構
		dwRes=WaitForSingleObject(Eol.hEvent,        //等待的事件對象句柄
			dwTimeoutValue);                       //超時時間(ms)
		
		switch (dwRes)
		{
			case  WAIT_OBJECT_0:                      //成功得到事件監視結果
				{
					switch (dwEvtMask)
					{
					case EV_RXCHAR:                      //接收到數據
						{
							//向主線程發送消息,接收到數據
							ClearCommError(hCom,                //串口句柄
								&dwErrors,                        //存放出錯信息的掩碼組合
								&Rcs);                             //COMSTAT類型結構變量
							if(Rcs.cbInQue!=0)
							{
							::PostMessage(hWnd,         //目的窗口句柄
								WM_MYMSG,              //消息名稱
								0,                      //傳遞的參數1
								(LPARAM)EV_RXCHAR );    //傳遞的參數2
							}
							break;
						}
					case EV_TXEMPTY:                    //發送緩沖區已空
						{
							   //這里可加入發送緩沖區空的處理代碼,或向主線程發送消息
							break;
						}
					}
					break;
				}

			case WAIT_TIMEOUT:
				{
					//傳遞超時消息給主線程
					::PostMessage(hWnd,         //目的窗口句柄
						WM_MYMSG,              //消息名稱
						0,                      //傳遞的參數1
						(LPARAM)100 );         //傳遞的參數100
					break;
				}
		}
	}
	return true;
}

//消息響應函數
LONG CPC2PCView::OnReceiveEvent(WPARAM wParam,LPARAM lParam)
{
	CFileDialog myFileDlg(false);         //保存文件對話框
	BYTE myByte[1100];
	BYTE bytTemp;
	CString strDis,strDis1;
	char *myChar;                       //獲取文件名時使用
	char myName[300];
	char myExt[5];
	int i;
	CEdit& myEdit=this->GetEditCtrl();
	CMainFrame* m_pGetFrame=(CMainFrame*) AfxGetApp()->m_pMainWnd ;
	CStatusBar* m_pStatus=&m_pGetFrame->m_wndStatusBar;
	CFileException e;

	switch(bytActStatus)
	{
	case 1://發送操作
		{
			switch(bytSendStatus)//發送的不同狀態
			{
			case 1://發送操作的1態
				{
					switch(lParam)
					{
					case EV_RXCHAR://lParam=EV_RXCHAR即1,說明讀線程收到數據
						{
							blnNoTimeout=true;
							bytTimeoutCounter=0;
							switch(Detect(1))
							{
							case 0://收到指定數量的字符
								{
									break;
								}
							case 4://超時錯誤
								{
									DisSend(4);
									blnNoTimeout=false;
									return -1;
									break;
								}

							case 8://無效,輸入緩沖區中字符數量為0
								{
									blnNoTimeout=false;
									return 0;
									break;
								}

							}
							switch(Read(myByte,1))
							{
							case 0:
								{
									//繼續后面的操作
									break;
								}
							case 4://超時錯誤
								{
									DisSend(4);
									return -1;
									break;
								}
							case 16://讀操作失敗
								{
									DisSend(16);
									return -1;
									break;
								}
							}
							switch(myByte[0])
							{
							case 6://響應是ACK
								{
									//發送當前序號的數據
									uintStxCurNo=1;

									myEdit.SetSel(1000000,1000000);
									myEdit.ReplaceSel("正在傳送數據……\15\12");

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
va亚洲va日韩不卡在线观看| 3751色影院一区二区三区| 国产suv精品一区二区6| 国产成人在线视频网址| 香蕉av福利精品导航| 国产亚洲婷婷免费| 亚洲激情在线激情| 亚洲精品一区二区精华| 韩国午夜理伦三级不卡影院| 2017欧美狠狠色| 国产xxx精品视频大全| 国产精品美女久久福利网站| 91免费观看国产| 午夜视黄欧洲亚洲| 精品久久久久久久人人人人传媒| 国产在线播放一区| 国产精品乱子久久久久| 91国偷自产一区二区三区观看| 亚洲地区一二三色| 日韩欧美www| 成人涩涩免费视频| 亚洲午夜激情av| 欧美一区二区在线免费观看| 另类调教123区 | 国产欧美日本一区视频| 国产成人免费av在线| 亚洲另类春色校园小说| 91精品免费观看| 国产91精品久久久久久久网曝门| 一区二区三区免费网站| 欧美videossexotv100| 成人激情电影免费在线观看| 天堂成人国产精品一区| 国产欧美一区二区三区沐欲| 国产精品视频看| 欧美性大战久久久久久久蜜臀| 喷水一区二区三区| 亚洲视频一区在线| 日韩三级免费观看| 99精品视频在线播放观看| 日本欧美在线看| 一区在线中文字幕| 精品国产麻豆免费人成网站| 91免费观看国产| 蜜臀精品一区二区三区在线观看 | 欧美疯狂性受xxxxx喷水图片| 欧美午夜精品免费| 国产资源精品在线观看| 亚洲国产日韩综合久久精品| 中文字幕不卡三区| 日韩精品一区二区三区四区视频| 97久久精品人人做人人爽50路| 极品少妇一区二区| 亚洲3atv精品一区二区三区| 1024成人网色www| 久久―日本道色综合久久| 欧美理论在线播放| 色狠狠av一区二区三区| 成人av资源站| 国产福利91精品一区| 日产精品久久久久久久性色| 一二三四区精品视频| 国产精品高潮呻吟| 亚洲高清一区二区三区| 亚洲国产精品激情在线观看 | 欧美日韩高清在线| 国产精品国产三级国产| 国产一区二区三区久久悠悠色av| 亚洲成人一区二区在线观看| 综合欧美一区二区三区| 久久青草欧美一区二区三区| 欧美不卡一区二区三区| 91麻豆精品久久久久蜜臀| 欧美视频一区二区| 91无套直看片红桃| 91视视频在线直接观看在线看网页在线看 | 国产成人精品影院| 久久99国产精品麻豆| 日韩av一区二区三区四区| 亚洲国产美女搞黄色| 一区二区免费看| 亚洲精品国产无天堂网2021| 亚洲色图一区二区三区| 成人亚洲精品久久久久软件| 国产毛片一区二区| 国产传媒日韩欧美成人| 成人综合婷婷国产精品久久蜜臀 | 中文字幕一区二区三区精华液 | 国产乱码精品一区二区三区av | 精品盗摄一区二区三区| 欧美一区二区三区小说| 91精品国产品国语在线不卡| 欧美一区午夜视频在线观看| 欧美一区二区网站| 欧美xingq一区二区| 久久久久久久久久久久久久久99| 国产亚洲精品资源在线26u| 久久精品亚洲精品国产欧美kt∨ | 播五月开心婷婷综合| 99视频精品全部免费在线| 91免费国产视频网站| 欧美日韩在线一区二区| 欧美精品成人一区二区三区四区| 7777精品伊人久久久大香线蕉完整版| 亚洲一区日韩精品中文字幕| 麻豆一区二区三| 日本不卡1234视频| 久久99精品久久久久久动态图 | 亚洲日本丝袜连裤袜办公室| 一区二区在线观看av| 亚洲第一会所有码转帖| 久久精品999| 成人激情开心网| 欧美日韩国产综合一区二区三区 | 日本欧洲一区二区| 国产成人精品综合在线观看 | 国产剧情在线观看一区二区| 不卡电影免费在线播放一区| 欧美色综合影院| 久久色视频免费观看| 亚洲黄色性网站| 精品夜夜嗨av一区二区三区| 97久久超碰精品国产| 91精品麻豆日日躁夜夜躁| 奇米色一区二区| 欧美亚洲综合久久| 五月婷婷综合网| 亚洲区小说区图片区qvod| 琪琪久久久久日韩精品| 成人av电影在线播放| 欧美一区二区三级| 最近中文字幕一区二区三区| 免费成人小视频| 色成人在线视频| 久久久精品免费网站| 亚洲高清视频中文字幕| 国产福利视频一区二区三区| 欧美日韩电影一区| 国产精品久久精品日日| 免费国产亚洲视频| 色一情一乱一乱一91av| 国产午夜精品福利| 日韩经典一区二区| 色国产精品一区在线观看| 久久久久成人黄色影片| 午夜伦理一区二区| 日韩欧美电影在线| 亚州成人在线电影| 一本高清dvd不卡在线观看| 国产日韩欧美精品综合| 久久精品国产99久久6| 欧美日韩你懂的| 国产精品综合网| 亚洲视频一二三区| 欧美激情综合在线| 亚洲精品成人在线| 成人免费黄色在线| 久久人人97超碰com| 久久www免费人成看片高清| 欧美日韩视频第一区| 亚洲一区中文在线| 在线一区二区三区做爰视频网站| 中文久久乱码一区二区| 国产高清不卡一区| 久久久影院官网| 国产精品一区二区在线观看网站 | 久久亚洲私人国产精品va媚药| 日日摸夜夜添夜夜添国产精品 | 91精品在线免费| 天堂资源在线中文精品| 欧美日韩午夜在线视频| 亚洲一区二区黄色| 欧美色综合网站| 爽爽淫人综合网网站| 777午夜精品免费视频| 奇米精品一区二区三区四区| 91精品国产高清一区二区三区蜜臀 | 成人午夜电影久久影院| 精品理论电影在线观看| 日本欧美一区二区| 日韩一区二区三区在线视频| 毛片一区二区三区| 精品精品国产高清一毛片一天堂| 久久成人精品无人区| 欧美精品一区二区三区久久久| 国产在线精品一区二区夜色| 久久久国产精品午夜一区ai换脸| 国产剧情一区二区| 国产精品成人免费精品自在线观看 | 免费精品视频在线| 久久女同互慰一区二区三区| 成人一区二区三区视频在线观看 | 亚洲一区二区三区在线播放| 欧美精品123区| 极品少妇xxxx偷拍精品少妇| 国产精品国产三级国产普通话蜜臀| 91亚洲精品久久久蜜桃| 天天综合天天综合色| 精品99一区二区三区| www.99精品|