20120908- 직렬 프로그래밍 - MSComm 사용 2 - Step by Step 수신

5258 단어 A11-MFC
기초가 너무 약하고 간단해 보이는 프로그램도 우여곡절이 많은데 MFC는 익숙해요?VC++6.0의 환경이 익숙합니까?MSComm 컨트롤에 익숙하십니까?어떤 사소한 일도 초보자에게는 쉽지 않다. 문제가 너무 간단하면 물어볼 사람이 없고, 인터넷에서 자료를 찾는 것은 너무 비용이 많이 든다.오늘 직렬 프로그래밍을 배웠는데, 원래는 아주 작은 프로그램이었는데, 나를 한참 동안 괴롭히며, 기록을 보관하였다.예는 이경봉, 양리나, 반항 저, 기계공업출판사 2010년 6월 제1판, 이 책의 예이다.
 
1. VC++6.0, NEW를 열고 TTYReceivemSComm라는 MFC 기반 대화상자 프로그램을 만듭니다.
 
2. 선택 대화 상자
 
3. 참고: MSComm은 ActiveX Controls 컨트롤이므로 ActiveX Controls 컨트롤을 지원해야 합니다. 그렇지 않으면 오류가 발생합니다.만약 선택하지 않으면 MSComm 컨트롤을 실례화할 때 다음과 같은 오류가 발생할 것이다. 이 문제는 MFC 프레임워크 내부를 가리키기 때문에 당분간 해결되지 않을 것이다.
 
오류:
 
4.NEXT
 
5.NEXT
 
6.NEXT
 
7. 프로젝트에 MSComm 컨트롤을 추가하는 방법은 <20120904-MSComm 컨트롤을 로드하는 방법> 참조
8. 메인 인터페이스는 다음과 같다.
 
9. 리소스 관리 탭에서 Dialog 가상 폴더, Insert Dialog를 마우스 오른쪽 버튼으로 클릭
 
10. 이 설정 인터페이스는 다음과 같다.
 
11. 컨트롤 변수를 만드는 것은 다음과 같다.
 
 
12. 다음과 같은 컨트롤 변수를 설정합니다.
 
13. 직렬 설정을 위한 IDD 더블 클릭DIALOG1 대화 상자의 빈 공간에 새 클래스를 만듭니다.
 
14. 이름 짓기
 
15. TTYReceive MSCommDlg에서h에서 다음 라이브러리 파일을 참조합니다
#include "mscomm.h"
#include "SetupDlg.h"
#include 

16. CTTYReceiveMSCommDlg 클래스의 구현 부분에 다음과 같은 변수를 추가
	CMSComm myComm;
	CSetupDlg mySetupDlg;
	BYTE myCom;
	CString myParity;
	CString myBaudRate;

 17.마스터 대화 상자가 설정될 때 MSComm 컨트롤을 인스턴스화하고 Oncreate() 함수를 추가합니다.
 
int CTTYReceiveMSCommDlg::OnCreate(LPCREATESTRUCT lpCreateStruct) 
{
	if (CDialog::OnCreate(lpCreateStruct) == -1)
		return -1;
	
	DWORD style=WS_VISIBLE|WS_CHILD;
	if (!myComm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
	{
		AfxMessageBox("  MSComm    !");
		m_Opencom.EnableWindow(false);
		m_Closecom.EnableWindow(false);
		m_Setupcom.EnableWindow(false);
		return -1;
	}
	m_Para="COM1,9600,N,8,1";
	
	return 0;
}

 
18. Setup() 함수 추가
 
void CTTYReceiveMSCommDlg::OnSetup() 
{
	CString strStatus,strTemp;
	double dblBaud;
	if(mySetupDlg.DoModal()==IDOK)
	{
		myCom=mySetupDlg.m_Com+1;
		dblBaud=pow(2,(double)mySetupDlg.m_BaudRate);
		dblBaud=19200/dblBaud;
		strStatus.Format("%.0f",dblBaud);
		myBaudRate=strStatus;
		
		switch(mySetupDlg.m_Parity)
		{
		case 0:
			{
				myParity="N";
				break;
			}
		case 1:
			{
				myParity="O";
				break;
			}
		case 2:
			{
				myParity="E";
				break;
			}
		}
		strStatus="COM";
		strTemp.Format("%d",myCom);
		strStatus+=strTemp;
		strStatus+=",";
		strStatus+=myBaudRate;
		strStatus+=",";
		strStatus+=myParity;
		strStatus+=",8,1";
		m_Para=strStatus;
		UpdateData(false);
	}	
}

19. 오픈컴 함수 추가
 
void CTTYReceiveMSCommDlg::OnOpencom() 
{	
	//            ,           ,
	//            。         。
	CString strPara;                          //    
	myComm.SetCommPort(myCom);                //     myCom
	strPara=myBaudRate;
	strPara+=",";
	strPara+=myParity;
	strPara+=",8,1";
	myComm.SetSettings(strPara);             //      
	myComm.SetInBufferSize(1024);            //         
	myComm.SetInBufferCount(0);              //       
	myComm.SetInputMode(1);                  //        
	myComm.SetInputLen(0);                   //        
	myComm.SetRThreshold(1);                 //    OnComm     
	myComm.SetPortOpen(1);                   //    
	m_Opencom.EnableWindow(false);           // “    ”    
	m_Closecom.EnableWindow(true);           // “    ”    
	m_Setupcom.EnableWindow(false);          // “  ”    
	m_Exit.EnableWindow(false);              // “  ”    
	AfxMessageBox("      !");	
}

 
20. 닫힌 직렬 추가
 
void CTTYReceiveMSCommDlg::OnClosecom() 
{
	myComm.SetPortOpen(0);
	AfxMessageBox("      !");
	m_Opencom.EnableWindow(true);
	m_Closecom.EnableWindow(false);
	m_Setupcom.EnableWindow(true);
	m_Exit.EnableWindow(true);
}

 
21. 종료 함수
void CTTYReceiveMSCommDlg::OnExit() 
{
	this->EndDialog(IDOK); 
}

 
22. 수신 응답 함수 추가
 
void CTTYReceiveMSCommDlg::OnOnCommMscomm1() 
{
	VARIANT input1;
	BYTE rxdata[2048];
	long len1,k;
	COleSafeArray safearray1;
	CString strDis;
	switch(myComm.GetCommEvent())
	{
	case 2:
		//   RThreshold    
		//        
		input1=myComm.GetInput();
		// VARAIANT     COleSafeArray    
		safearray1=input1;     
		//  COleSafeArray            
		len1=safearray1.GetOneDimSize();
		for(k=0;k=32)
				{
					strDis+=rxdata[k];
					m_Edit1.SetSel(1000000,1000000);
					m_Edit1.ReplaceSel(strDis);
					strDis="";
					UpdateData(false);
				}
			}
		}
	}	
}

 ************************************************************************************************
 ************************************************************************************************
코드를 자신의 자원에 업로드합니다.
지금부터 다시는 어떤 작은 일도 소홀히 하지 않도록 명심해라!
2012.09.08
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

좋은 웹페이지 즐겨찾기