⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 modemvw.cpp

📁 Modem 通信的完整例子
💻 CPP
字号:
// modemvw.cpp : implementation of the CModem16View class
//

#include "stdafx.h"
#include "modem16.h"
#include "modem.h"
#include "modemdoc.h"
#include "zstabar.h"
#include "mainfrm.h"
#include "modemvw.h"
#include "pagec.h"
#include "dialnum.h"



#ifdef _DEBUG
#undef THIS_FILE
static char BASED_CODE THIS_FILE[] = __FILE__;
#endif

/////////////////////////////////////////////////////////////////////////////
// CModem16View

IMPLEMENT_DYNCREATE(CModem16View, CEditView)

BEGIN_MESSAGE_MAP(CModem16View, CEditView)
	//{{AFX_MSG_MAP(CModem16View)
	ON_WM_CREATE()
	ON_MESSAGE(WM_CHARSARRIVE,OnCharsArrive)
	ON_MESSAGE(WM_SHOWMESSAGE,OnShowMessage)
	ON_WM_CHAR()
	ON_COMMAND(ID_PHONE_DIAL, OnPhoneDial)
	ON_UPDATE_COMMAND_UI(ID_PHONE_DIAL, OnUpdatePhoneDial)
	ON_COMMAND(ID_PHONE_HANGUP, OnPhoneHangup)
	ON_UPDATE_COMMAND_UI(ID_PHONE_HANGUP, OnUpdatePhoneHangup)
	ON_COMMAND(ID_SETUP, OnSetup)
	ON_UPDATE_COMMAND_UI(ID_SETUP, OnUpdateSetup)
	ON_COMMAND(ID_T_RECEIVEFILE, OnTReceivefile)
	ON_UPDATE_COMMAND_UI(ID_T_RECEIVEFILE, OnUpdateTReceivefile)
	ON_COMMAND(ID_T_SENDFILE, OnTSendfile)
	ON_UPDATE_COMMAND_UI(ID_T_SENDFILE, OnUpdateTSendfile)
	ON_WM_DESTROY()
	ON_WM_TIMER()
	//}}AFX_MSG_MAP
END_MESSAGE_MAP()

/////////////////////////////////////////////////////////////////////////////
// CModem16View construction/destruction

CModem16View::CModem16View()
{
	// TODO: add construction code here
}

CModem16View::~CModem16View()
{
	KillTimer(MODEM_TIMER);
}

/////////////////////////////////////////////////////////////////////////////
// CModem16View drawing

void CModem16View::OnDraw(CDC* pDC)
{
	CModem16Doc* pDoc = GetDocument();
	ASSERT_VALID(pDoc);

	// TODO: add draw code for native data here
}

/////////////////////////////////////////////////////////////////////////////
// CModem16View diagnostics

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

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

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

/////////////////////////////////////////////////////////////////////////////
// CModem16View message handlers

int CModem16View::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
	if (CEditView::OnCreate(lpCreateStruct) == -1)
		return -1;
    MainFrame=(CMainFrame *)GetParent();
    ModemApp=(CModem16App *)AfxGetApp();
    m_com=ModemApp->GetProfileString("COM","Port","None");
    m_baud=ModemApp->GetProfileString("COM","Baud","2400");
    m_parity=ModemApp->GetProfileInt("COM","Parity",0);
    m_databits=ModemApp->GetProfileInt("COM","DataBits",3);
    m_stopbits=ModemApp->GetProfileInt("COM","StopBits",0);
    m_command=ModemApp->GetProfileString("MODEM","IniCommand",
    		  "Q0E1V1&FM1X4&C1&D2S0=0S6=2S7=50");
	// TODO: Add your specialized creation code here
	SetTimer(MODEM_TIMER,50,NULL);
	return 0;
}

LONG CModem16View::OnCharsArrive(UINT wParam,LONG lParam)
{
    static int i;
    static BYTE far * p;
    p=(BYTE far *)lParam;
    for(i=0;i<wParam;i++)SendMessage(WM_CHAR,p[i],10000);
	return 0;
}


LONG CModem16View::OnShowMessage(UINT wParam,LONG lParam)
{
    MainFrame->m_wndStatusBar.SetWindowText((char far *)lParam);
    return 0;
}

void CModem16View::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)
{
	// TODO: Add your message handler code here and/or call default
	static BYTE c;
	static UINT i;
	c=nChar;
	if(nRepCnt<10000){
		if(!Modem.IfCommand &&!Modem.IfTransFile && Modem.IfCom)
			for(i=0;i<nRepCnt;i++) Modem.Writen(&c,1);
	}
	else{
		if(c==CR && !Modem.DetectDcd()) return;
		if(c==LF) c=CR;
		CEditView::OnChar(nChar, nRepCnt, nFlags);
	}
}

void CModem16View::OnPhoneDial()
{
	// TODO: Add your command handler code here
//	if(!Modem)Modem=new MODEM(AfxGetInstanceHandle(),m_hWnd,"COM4","19200");
    DialNum Dialog;
    if(Dialog.DoModal()==IDOK)Modem.Dial(Dialog.m_phonenum.GetBuffer(40));
}

void CModem16View::OnUpdatePhoneDial(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	UINT nID;
	UINT nStyle;
	int iImage;
	MainFrame->m_wndToolBar.GetButtonInfo(0,nID,nStyle,iImage);
	pCmdUI->Enable(!Modem.IfCommand && Modem.IfModem && !Modem.DetectDcd());
//	if(Modem.IfCommand) return;
	if(Modem.DetectDcd() && nID==ID_PHONE_DIAL){ 
		pCmdUI->Enable(TRUE);
		MainFrame->m_wndToolBar.SetButtonInfo(0,ID_PHONE_HANGUP,TBBS_BUTTON,4);
		MainFrame->m_wndToolBar.Invalidate();
	}
}

void CModem16View::OnPhoneHangup()
{
	// TODO: Add your command handler code here
	Modem.HangUp();
}

void CModem16View::OnUpdatePhoneHangup(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	UINT nID;
	UINT nStyle;
	int iImage;
	MainFrame->m_wndToolBar.GetButtonInfo(0,nID,nStyle,iImage);
	pCmdUI->Enable(Modem.IfModem && Modem.DetectDcd() && !Modem.IfCommand);
//	if(Modem.IfCommand)	return;
	if(!Modem.DetectDcd() && nID==ID_PHONE_HANGUP){
		pCmdUI->Enable(TRUE);
		MainFrame->m_wndToolBar.SetButtonInfo(0,ID_PHONE_DIAL,TBBS_BUTTON,0);
		MainFrame->m_wndToolBar.Invalidate();
	}
}

void CModem16View::OnSetup()
{
	// TODO: Add your command handler code here
//	char *buf1,*buf2;
	PageC ConnectPage;
	ConnectPage.m_com=m_com;
	ConnectPage.m_databits=m_databits;
	ConnectPage.m_parity=m_parity;
	ConnectPage.m_stopbits=m_stopbits;
	ConnectPage.m_baud=m_baud;
	ConnectPage.m_command=m_command;
	if(ConnectPage.DoModal()==IDOK){
		m_com=ConnectPage.m_com;
		m_databits=ConnectPage.m_databits;
		m_parity=ConnectPage.m_parity;
		m_stopbits=ConnectPage.m_stopbits;
		m_baud=ConnectPage.m_baud;
		m_command=ConnectPage.m_command;
		IniConnection();
		MainFrame->m_wndToolBar.m_comboBox.SelectString(-1,m_baud.GetBuffer(20));
	}	
}

void CModem16View::OnUpdateSetup(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	static int i=0;
	CString string;
	pCmdUI->Enable(!Modem.DetectDcd() && !Modem.IfCommand);
	MainFrame->m_wndToolBar.m_comboBox.GetLBText(
			MainFrame->m_wndToolBar.m_comboBox.GetCurSel(),string);
	if(m_baud!=string){
		m_baud=string;
		Modem.ChangeBaud(string.GetBuffer(20));
	}
	if(!i){
		IniConnection();
		i++;
	}
}

void CModem16View::OnTReceivefile()
{
	// TODO: Add your command handler code here
	CString String;
	CFileDialog FileDialog(FALSE);
	FileDialog.m_ofn.lpstrTitle="Receive File";
	FileDialog.m_ofn.lpstrFilter="All Files(*.*)\0*.*\0\0";
	if(FileDialog.DoModal()==IDOK){
		String=FileDialog.GetFileTitle();
		fstream File(String.GetBuffer(String.GetLength()+1),ios::out|ios::binary);
		Modem.ReceAFile(File);
	}
}

void CModem16View::OnUpdateTReceivefile(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(!Modem.IfTransFile && Modem.DetectDcd());
//	pCmdUI->Enable(TRUE);
}

void CModem16View::OnTSendfile()
{
	// TODO: Add your command handler code here
	CString String;
	char *p;
	CFileDialog FileDialog(TRUE);
	FileDialog.m_ofn.lpstrTitle="Send File";
	FileDialog.m_ofn.lpstrFilter="All Files(*.*)\0*.*\0\0";
	if(FileDialog.DoModal()==IDOK){
		String=FileDialog.GetFileTitle();
		p=String.GetBuffer(String.GetLength()+1);
		fstream File(p,ios::in|ios::binary);
		Modem.SendAFile(File);
	}
	
}

void CModem16View::OnUpdateTSendfile(CCmdUI* pCmdUI)
{
	// TODO: Add your command update UI handler code here
	pCmdUI->Enable(!Modem.IfTransFile && Modem.DetectDcd());
//	pCmdUI->Enable(TRUE);
}


void CModem16View::IniConnection()
{
	CString string;
	string+=m_com;
	string+=": ";
	string+=m_baud;
	string+=",";
	switch(m_parity){
		case 0: string+="N";
				break;
		case 1: string+="E";
				break;
		case 2: string+="O";
				break;
	}
	string+=",";
	switch(m_databits){
		case 0:	string+="5";
				break;
		case 1: string+="6";
				break;
		case 2: string+="7";
				break;
		case 3: string+="8";
				break;
	}
	string+=",";
	switch(m_stopbits){
		case 0: string+="1";
				break;
		case 1: string+="1.5";
				break;
		case 2: string+="2";
				break;
	}
	Modem.IniCom(AfxGetInstanceHandle(),m_hWnd,string.GetBuffer(40));
	Modem.ConfigModem(m_command.GetBuffer(40));
}
	
void CModem16View::OnDestroy()
{
	
	// TODO: Add your message handler code here
	ModemApp->WriteProfileString("COM","Port",m_com.GetBuffer(10));
	ModemApp->WriteProfileString("COM","Baud",m_baud.GetBuffer(10));
	ModemApp->WriteProfileInt("COM","Parity",m_parity);	
	ModemApp->WriteProfileInt("COM","DataBits",m_databits);
	ModemApp->WriteProfileInt("COM","StopBits",m_stopbits);
	ModemApp->WriteProfileString("MODEM","IniCommand",m_command.GetBuffer(10));	
	Modem.Stop();
	CEditView::OnDestroy();
}

void CModem16View::OnTimer(UINT nIDEvent)
{
	// TODO: Add your message handler code here and/or call default
	CEditView::OnTimer(nIDEvent);
	Modem.OnTimer();	
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -