20120908- 직렬 프로그래밍 - MSComm 사용 2 - Step by Step 수신
5258 단어 A11-MFC
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