www.pudn.com > modemphone.rar > modemDlg.cpp


// modemDlg.cpp : implementation file 
// 
 
#include "stdafx.h" 
#include "modem.h" 
#include "modemDlg.h" 
 
 
 
 
#ifdef _DEBUG 
#define new DEBUG_NEW 
#undef THIS_FILE 
static char THIS_FILE[] = __FILE__; 
#endif 
 
static BOOL bClicked = FALSE; 
 
 
 
///////////////////////////////////////////////////////////////////////////// 
// CModemDlg dialog 
 
CModemDlg::CModemDlg(CWnd* pParent /*=NULL*/) 
	: CDialog(CModemDlg::IDD, pParent) 
{ 
	//{{AFX_DATA_INIT(CModemDlg) 
	m_editchar = _T(""); 
	m_modem = _T(""); 
	m_com = _T(""); 
	m_phone = _T(""); 
	//}}AFX_DATA_INIT 
	// Note that LoadIcon does not require a subsequent DestroyIcon in Win32 
	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); 
} 
 
void CModemDlg::DoDataExchange(CDataExchange* pDX) 
{ 
	CDialog::DoDataExchange(pDX); 
	//{{AFX_DATA_MAP(CModemDlg) 
	DDX_Control(pDX, IDhangup, m_hangup); 
	DDX_Control(pDX, IDcall, m_call); 
	DDX_Control(pDX, IDC_EDIT1, m_editctrl); 
	DDX_Text(pDX, IDC_EDIT1, m_editchar); 
	DDV_MaxChars(pDX, m_editchar, 40); 
	DDX_Text(pDX, IDC_EDIT3, m_modem); 
	DDX_Text(pDX, IDC_EDIT2, m_com); 
	DDX_Text(pDX, IDC_EDIT4, m_phone); 
	//}}AFX_DATA_MAP 
} 
 
BEGIN_MESSAGE_MAP(CModemDlg, CDialog) 
	//{{AFX_MSG_MAP(CModemDlg) 
	ON_WM_PAINT() 
	ON_WM_QUERYDRAGICON() 
	ON_EN_CHANGE(IDC_EDIT1, OnChangeEdit1) 
	ON_BN_CLICKED(IDcall, Oncall) 
	ON_BN_CLICKED(IDhangup, Onhangup) 
	ON_WM_CREATE() 
	ON_WM_CLOSE() 
	ON_WM_TIMER() 
	ON_BN_CLICKED(IDEXIT, OnExit) 
	ON_WM_LBUTTONDOWN() 
	//}}AFX_MSG_MAP 
END_MESSAGE_MAP() 
 
///////////////////////////////////////////////////////////////////////////// 
// CModemDlg message handlers 
 
BOOL CModemDlg::OnInitDialog() 
{ 
	CDialog::OnInitDialog(); 
 
	// Set the icon for this dialog.  The framework does this automatically 
	//  when the application's main window is not a dialog 
	SetIcon(m_hIcon, TRUE);			// Set big icon 
	SetIcon(m_hIcon, FALSE);		// Set small icon 
	 
	// TODO: Add extra initialization here 
	GetDlgItem(IDcall)->EnableWindow(FALSE); 
    GetDlgItem(IDhangup)->EnableWindow(FALSE); 
    GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE); 
 
     
	 vcon=0; 
	 sound=20; 
	 vconcount=0; 
	 ring=0; 
	  
  
	return TRUE;  // return TRUE unless you set the focus to a control 
	              // EXCEPTION: OCX Property Pages should return FALSE 
 
} 
 
// If you add a minimize button to your dialog, you will need the code below 
//  to draw the icon.  For MFC applications using the document/view model, 
//  this is automatically done for you by the framework. 
 
void CModemDlg::OnPaint()  
{ 
	if (IsIconic()) 
	{ 
		CPaintDC dc(this); // device context for painting 
 
		SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); 
 
		// Center icon in client rectangle 
		int cxIcon = GetSystemMetrics(SM_CXICON); 
		int cyIcon = GetSystemMetrics(SM_CYICON); 
		CRect rect; 
		GetClientRect(&rect); 
		int x = (rect.Width() - cxIcon + 1) / 2; 
		int y = (rect.Height() - cyIcon + 1) / 2; 
 
		// Draw the icon 
		dc.DrawIcon(x, y, m_hIcon); 
	} 
	else 
	{ 
		CDialog::OnPaint(); 
	} 
} 
 
// The system calls this to obtain the cursor to display while the user drags 
//  the minimized window. 
HCURSOR CModemDlg::OnQueryDragIcon() 
{ 
	return (HCURSOR) m_hIcon; 
} 
 
void CModemDlg::OnChangeEdit1()  
{ 
	// TODO: If this is a RICHEDIT control, the control will not 
	// send this notification unless you override the CDialog::OnInitDialog() 
	// function to send the EM_SETEVENTMASK message to the control 
	// with the ENM_CHANGE flag ORed into the lParam mask. 
	 
	// TODO: Add your control notification handler code here 
 
 UpdateData(); 
  if(m_editchar.GetLength())GetDlgItem(IDcall)->EnableWindow(TRUE); 
  else GetDlgItem(IDcall)->EnableWindow(FALSE);//无输入时禁止按钮 
	 
 
} 
 
void CModemDlg::Oncall()  
{ 
	// TODO: Add your control notification handler code here 
   // m_editctrl.EnableWindow(FALSE);	 
	GetDlgItem(IDhangup)->EnableWindow(TRUE); 
    GetDlgItem(IDcall)->EnableWindow(FALSE); 
    GetDlgItem(IDC_EDIT1)->EnableWindow(FALSE); 
   
    m_editctrl.GetWindowText(m_editchar);   
   
  
   char strOutMsg[50];  
   DWORD dwBytesWritten; 
   wsprintf(strOutMsg,"ATDT%s\r",m_editchar); 
   
 
 
   BOOL bReturn=WriteFile(hCommDev,"AT#CLS=8#VLS=8#VGT=131#VSR=8000\r",strlen("AT#CLS=8#VLS=8#VGT=131#VSR=11025\r"),&dwBytesWritten,NULL); 
   if(!bReturn){ m_phone="语音模式设置......失败!"; 
 
	 } 
    else m_phone="语音模式设置......成功!"; 
 
    
	Sleep(500); 
 
   bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL); 
	 if(!bReturn){ 
		//    DWORD dwErrorID=GetLastError(); 
		//	MessageBox("无法与调制解调器通讯!"); 
		//	return; 
      m_phone="拨号连接......失败!";  
      UpdateData(FALSE); 
	  return; 
 
	 } 
 
 
   
 
 
 
    m_phone="正在呼叫连接...  "+m_editchar; 
	UpdateData(FALSE); 
 
 
	 
	 
 
} 
 
void CModemDlg::Onhangup()  
{ 
	// TODO: Add your control notification handler code here 
	GetDlgItem(IDhangup)->EnableWindow(FALSE); 
    GetDlgItem(IDcall)->EnableWindow(TRUE); 
	GetDlgItem(IDC_EDIT1)->EnableWindow(TRUE); 
    m_editctrl.EnableWindow(TRUE);	 
    m_editctrl.GetWindowText(m_editchar);   
 
    DWORD dwBytesWritten; 
 
   
	 
  BOOL bReturn=WriteFile(hCommDev,"\r",strlen("\r"),&dwBytesWritten,NULL); 
	 if(!bReturn){ 
		//    DWORD dwErrorID=GetLastError(); 
		//	MessageBox("无法与调制解调器通讯!"); 
		//	return; 
      m_phone="挂断连接......失败!";  
      UpdateData(FALSE); 
	  return; 
 
	 } 
 
 
 
   Sleep(1000); 
 
   bReturn=WriteFile(hCommDev,"+++",strlen("+++"),&dwBytesWritten,NULL); 
	 if(!bReturn){ 
	//	    DWORD dwErrorID=GetLastError(); 
	//		MessageBox("无法与调制解调器通讯!"); 
	//		return; 
      m_phone="无法与调制解调器通讯,挂断连接......失败!";  
      UpdateData(FALSE); 
	  return; 
	 } 
 
    m_phone="正在挂断连接...  "+m_editchar; 
	UpdateData(FALSE); 
 
    Sleep(1000); 
    bReturn=WriteFile(hCommDev,"ATZ\r",strlen("ATZ\r"),&dwBytesWritten,NULL); 
	 if(!bReturn){ 
		//    DWORD dwErrorID=GetLastError(); 
		//	MessageBox("无法与调制解调器通讯!"); 
		//	return; 
      m_phone="无法与调制解调器通讯,挂断连接......失败!";  
      UpdateData(FALSE); 
	  return; 
 
	 } 
 
 
	 vconcount=0; 
 
 
} 
 
 
 
 
 
int CModemDlg::OnCreate(LPCREATESTRUCT lpCreateStruct)  
{ 
	if (CDialog::OnCreate(lpCreateStruct) == -1) 
		return -1; 
	 
  
 
        DCB dcb;  
        char strOutNumber[50];  
        DWORD dwBytesWritten; 
        BOOL bReturn,flagcom=FALSE,flagmodem=FALSE; 
        char strOutMsg[20]="ATS0=0V1M0\r"; 
         
	                          
 
	hCommDev=CreateFile("COM1",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); 
	if(hCommDev!=(HANDLE)-1) 
                         { flagcom=TRUE; 
 
                           BuildCommDCB("COM1:115200,n,8,1",&dcb); 
                           SetCommState(hCommDev,&dcb);   //以上为初始化串口 
      
                           COMMTIMEOUTS CommTimeOuts; 
                           CommTimeOuts.ReadIntervalTimeout=MAXDWORD; 
                           CommTimeOuts.ReadTotalTimeoutMultiplier=0; 
                           CommTimeOuts.ReadTotalTimeoutConstant=0; 
                           CommTimeOuts.WriteTotalTimeoutMultiplier=0; 
                           CommTimeOuts.WriteTotalTimeoutConstant=1000; 
                           SetCommTimeouts(hCommDev,&CommTimeOuts); 
                           PurgeComm(hCommDev,PURGE_TXCLEAR); 
                           PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间 
 
 
                        
                         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL); 
                         if(!bReturn)flagmodem=FALSE; 
	                 else flagmodem=TRUE; 
                          }  
 
         else flagcom=FALSE; 
 
if(flagcom==FALSE||flagmodem==FALSE) 
       { 
        CloseHandle(hCommDev); 
	hCommDev=CreateFile("COM2",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); 
	if(hCommDev!=(HANDLE)-1) 
                         { flagcom=TRUE; 
 
                           BuildCommDCB("COM2:115200,n,8,1",&dcb); 
                           SetCommState(hCommDev,&dcb);   //以上为初始化串口 
      
                           COMMTIMEOUTS CommTimeOuts; 
                           CommTimeOuts.ReadIntervalTimeout=MAXDWORD; 
                           CommTimeOuts.ReadTotalTimeoutMultiplier=0; 
                           CommTimeOuts.ReadTotalTimeoutConstant=0; 
                           CommTimeOuts.WriteTotalTimeoutMultiplier=0; 
                           CommTimeOuts.WriteTotalTimeoutConstant=1000; 
                           SetCommTimeouts(hCommDev,&CommTimeOuts); 
                           PurgeComm(hCommDev,PURGE_TXCLEAR); 
                           PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间 
 
                      
                         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL); 
                         if(!bReturn)flagmodem=FALSE; 
	                 else flagmodem=TRUE; 
                          }  
 
         else flagcom=FALSE; 
			} 
 
if(flagcom==FALSE||flagmodem==FALSE) 
       { 
        CloseHandle(hCommDev); 
	hCommDev=CreateFile("COM3",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); 
	if(hCommDev!=(HANDLE)-1) 
                         { flagcom=TRUE; 
 
                           BuildCommDCB("COM1:115200,n,8,1",&dcb); 
                           SetCommState(hCommDev,&dcb);   //以上为初始化串口 
      
                           COMMTIMEOUTS CommTimeOuts; 
                           CommTimeOuts.ReadIntervalTimeout=MAXDWORD; 
                           CommTimeOuts.ReadTotalTimeoutMultiplier=0; 
                           CommTimeOuts.ReadTotalTimeoutConstant=0; 
                           CommTimeOuts.WriteTotalTimeoutMultiplier=0; 
                           CommTimeOuts.WriteTotalTimeoutConstant=1000; 
                           SetCommTimeouts(hCommDev,&CommTimeOuts); 
                           PurgeComm(hCommDev,PURGE_TXCLEAR); 
                           PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间 
 
                      
                         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL); 
                         if(!bReturn)flagmodem=FALSE; 
	                 else flagmodem=TRUE; 
                          }  
 
         else flagcom=FALSE; 
			} 
 
 
if(flagcom==FALSE||flagmodem==FALSE) 
       { 
        CloseHandle(hCommDev); 
	hCommDev=CreateFile("COM4",GENERIC_READ|GENERIC_WRITE,0,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL|FILE_FLAG_OVERLAPPED,NULL); 
	if(hCommDev==(HANDLE)-1){flagcom=FALSE; 
                             } 
	else flagcom=TRUE; 
	 
	BuildCommDCB("COM2:115200,n,8,1",&dcb); 
	SetCommState(hCommDev,&dcb);   //以上为初始化串口 
        COMMTIMEOUTS CommTimeOuts; 
	 CommTimeOuts.ReadIntervalTimeout=MAXDWORD; 
	 CommTimeOuts.ReadTotalTimeoutMultiplier=0; 
	 CommTimeOuts.ReadTotalTimeoutConstant=0; 
	 CommTimeOuts.WriteTotalTimeoutMultiplier=0; 
	 CommTimeOuts.WriteTotalTimeoutConstant=1000; 
	 SetCommTimeouts(hCommDev,&CommTimeOuts); 
	 PurgeComm(hCommDev,PURGE_TXCLEAR); 
         PurgeComm(hCommDev,PURGE_RXCLEAR); //设置读写串口超时时间 
 
         bReturn=WriteFile(hCommDev,strOutMsg,strlen(strOutMsg),&dwBytesWritten,NULL); 
	 if(!bReturn){flagmodem=FALSE; 
	              } 
	 else flagmodem=TRUE; 
         }    //若MODEM不在COM1口上,则在COM2口上搜索MODEM 
 
 
    if(flagcom==FALSE)m_com="初始化串口......失败!"; 
	else  m_com="初始化串口......成功!"; 
       
	if(flagmodem==FALSE)m_modem="初始化调制解调器......失败!"; 
	else m_modem="初始化调制解调器......成功!"; 
 
 
 
	 
    SetTimer(1,45,NULL);     //设置55毫秒定时器,用于读取串口数据 
    SetTimer(2,400,NULL);  
 
 
 
	return 0; 
} 
 
void CModemDlg::OnClose()  
{ 
	// TODO: Add your message handler code here and/or call default 
        
	CloseHandle(hCommDev); 
	KillTimer(1); 
	KillTimer(2); 
 
 
 
	CDialog::OnClose(); 
} 
 
 
void CModemDlg::OnTimer(UINT nIDEvent)  
{ 
	// TODO: Add your message handler code here and/or call default 
 
    DWORD dwBytesWritten; 
	if(nIDEvent==1){ 
     char strCommRecvMsg[50]; 
	 DWORD dwBytesRead; 
	 BOOL bReturn=ReadFile(hCommDev,strCommRecvMsg,50,&dwBytesRead,NULL); 
	 if(!bReturn)return; 
	 if(dwBytesRead<1)return; 
      
      CString strTmp,strTmp1;  
       
     strTmp=strCommRecvMsg;	  
     strTmp1=strTmp.Left(dwBytesRead);	  
        
 //    m_phone=strTmp1;   
 
     
 
	 if(strstr(strTmp1,"VCON")!=NULL){vcon=1;vconcount++; 
	                                   if(vconcount==1) m_phone="检测到对方摘机!"; 
	                                   else m_phone="挂断电话!";}     
	 else if(strstr(strTmp1,"RING")!=NULL){m_phone="检测到振铃信号!";ring++;}     
    else if(strstr(strTmp1,"BUSY")!=NULL)m_phone="检测到忙音!";   
    else if(strstr(strTmp1,"CONNECT")!=NULL)m_phone="开始语音传送!"; 
    else if(strstr(strTmp1,"NO DIALTONE")!=NULL)m_phone="无拨号音!"; 
 
	 
	 UpdateData(FALSE);	 
	} 
	else if(nIDEvent==2) 
	{ 
		if(vcon==1&&vconcount==1){ vcon=0; 
	       	// DWORD dwBytesWritten; 
              WriteFile(hCommDev,"AT#VTX\r",strlen("AT#VTX\r"),&dwBytesWritten,NULL); 
 
	 
		          } 
 
        		 
	} 
 
/*       switch(key) 
	   {   
	      
	 
		  case 12:if(vconcount==1){ 
			  //    DWORD dwBytesWritten; 
                  WriteFile(hCommDev,"\r",strlen("\r"),&dwBytesWritten,NULL); 
	              Sleep(500); 
                  WriteFile(hCommDev,"ATZ\r",strlen("ATZ\r"),&dwBytesWritten,NULL); 
				  vconcount=0; 
                 GetDlgItem(IDhangup)->EnableWindow(FALSE); 
                 GetDlgItem(IDcall)->EnableWindow(TRUE); 
                  } 
                  break; 
		 
		  default:break; 
	   }	   
 
*/ 
 
	CDialog::OnTimer(nIDEvent); 
} 
 
 
 
 
void CModemDlg::OnExit()  
{ 
	// TODO: Add your control notification handler code here 
	OnClose(); 
	EndDialog(1);	 
} 
 
void CModemDlg::OnLButtonDown(UINT nFlags, CPoint point)  
{ 
	// TODO: Add your message handler code here and/or call default 
		 
	CDialog::OnLButtonDown(nFlags, point); 
	PostMessage(WM_NCLBUTTONDOWN,HTCAPTION,MAKELPARAM(point.x,point.y)); 
 
	 
}