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

📄 modemstatusdlg.cpp

📁 串口开发的另一种方式.rar
💻 CPP
字号:
// ModemStatusDlg.cpp : implementation file
//

#include "stdafx.h"
#include "TestSerialPort2.h"
#include "ModemStatusDlg.h"

#include "ATCommands.h"
#include "superSP.h"

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

/////////////////////////////////////////////////////////////////////////////
// CModemStatusDlg dialog


CModemStatusDlg::CModemStatusDlg(CWnd* pParent /*=NULL*/)
	: CDialog(CModemStatusDlg::IDD, pParent),
	  pSSP(NULL)
{
	//{{AFX_DATA_INIT(CModemStatusDlg)
	m_stcCmdInfo = _T("");
	m_edtPhoneNum = _T("");
	m_edtMinRate = 0;
	m_edtMaxRate = 0;
	m_strCmd = _T("");
	m_autoMode = FALSE;
	//}}AFX_DATA_INIT
}


void CModemStatusDlg::DoDataExchange(CDataExchange* pDX)
{
	CDialog::DoDataExchange(pDX);
	//{{AFX_DATA_MAP(CModemStatusDlg)
	DDX_Control(pDX, IDC_COMBO_PROTOCOL, m_protocols);
	DDX_Control(pDX, IDC_LIST_ATCMD, m_lstAtCmd);
	DDX_Text(pDX, IDC_STATIC_CMD_INFO, m_stcCmdInfo);
	DDX_Text(pDX, IDC_EDIT_PHONE_NUMBER, m_edtPhoneNum);
	DDX_Text(pDX, IDC_EDIT_MODE_MINRATE, m_edtMinRate);
	DDX_Text(pDX, IDC_EDIT_MODE_MAXRATE, m_edtMaxRate);
	DDX_Text(pDX, IDC_EDIT_MEMO, m_strCmd);
	DDX_Check(pDX, IDC_CHECK_AUTO, m_autoMode);
	//}}AFX_DATA_MAP
}


BEGIN_MESSAGE_MAP(CModemStatusDlg, CDialog)
	//{{AFX_MSG_MAP(CModemStatusDlg)
	ON_NOTIFY(NM_CLICK, IDC_LIST_ATCMD, OnClickListAtcmd)
	ON_WM_CLOSE()
	ON_BN_CLICKED(IDC_BUTTON_SENDCMD, OnButtonSendcmd)
	ON_BN_CLICKED(IDC_BUTTON_SET_SENDRATE, OnButtonSetSendrate)
	ON_BN_CLICKED(IDC_BUTTON_CHECK_STATUS, OnButtonCheckStatus)
	//}}AFX_MSG_MAP
	ON_MESSAGE(WM_UM_RECEIVE_MODEM_RETURN, OnReceiveModemReturn)
	//ON_NOTIFY(NM_RETURN, IDC_EDIT_MEMO, OnSendATCmd)
END_MESSAGE_MAP()


//////////////////////////////////////////////////////////////////////////
// USER MESSAGE

void CModemStatusDlg::OnReceiveModemReturn(WPARAM wParam, LPARAM lParam)
{
}

//void CModemStatusDlg::OnSendATCmd(WPARAM wParam, LPARAM lParam)
//{
//	AfxMessageBox(_T("Catch the return"));
//}

/////////////////////////////////////////////////////////////////////////////
// CModemStatusDlg message handlers


//
void CModemStatusDlg::InitCommandList()
{
	int nItem;
	m_lstAtCmd.DeleteAllItems();
	for (int i=0; i<pAtCmdObj->Vcommands.size(); i++)
	{	
		nItem = m_lstAtCmd.InsertItem(i, 
			_T(pAtCmdObj->Vcommands[i]->strCommandName.c_str()));
		m_lstAtCmd.SetItemData(nItem, pAtCmdObj->Vcommands[i]->iCommandCode);
	}
}


//
void CModemStatusDlg::LocateCommand(UINT nItem)
{
	if (LB_ERR  != nItem)
	{
		DWORD dwCmdCode = m_lstAtCmd.GetItemData(nItem);
		for (int i=0; i<pAtCmdObj->Vcommands.size(); i++)
		{	
			if (pAtCmdObj->Vcommands[i]->iCommandCode == dwCmdCode)
			{
				m_stcCmdInfo = pAtCmdObj->Vcommands[i]->strExplain.c_str();
				UpdateData(FALSE);
				break;
			}
		}
	}
	else
	{
		m_stcCmdInfo = _T("没有命令被选中!");
		UpdateData(FALSE);
	}
}

//
void CModemStatusDlg::SendCommand(CString atCmd)
{
	atCmd.Insert(atCmd.GetLength(), 0x0d);
	   
	PACKAGE pack;
	pack.iLen = atCmd.GetLength();
	strcpy((char *)pack.pData, 
		   atCmd.GetBuffer(atCmd.GetLength()));
	   
	// 发送包
	if (pSSP->SendData(&pack))
	{
		pack.Clear();
		atCmd.Empty();
	}
}


BOOL CModemStatusDlg::OnInitDialog() 
{
	CDialog::OnInitDialog();
	pAtCmdObj = new CATCommand();
	
	// 没有为串口指针赋值
	if (pSSP == NULL)
	{
		AfxMessageBox(_T("串口对象没赋值"));
		return FALSE;
	}

	if (m_atCmdFile.IsEmpty() ||
		!pAtCmdObj->LoadFile(m_atCmdFile.GetBuffer(m_atCmdFile.GetLength())))
	{
		AfxMessageBox(_T("装载AT命令文件失败,需要一个\\AT\\ATCommands.txt文件"));
		delete pAtCmdObj;
	}
	else
	{
        InitCommandList();
	}

	// 附加到串口输出窗口列表
	m_attachId = pSSP->Attach(this, WM_UM_RECEIVE_MODEM_RETURN);

	// 初始化协议集合
	int index;
	index = m_protocols.InsertString(0, "V.21模式");
	m_protocols.SetItemData(index, 0);
	index = m_protocols.InsertString(1, "V.22模式");
	m_protocols.SetItemData(index, 1);
	index = m_protocols.InsertString(2, "V.22bis模式");
	m_protocols.SetItemData(index, 2);
	index = m_protocols.InsertString(3, "V.23模式");
	m_protocols.SetItemData(index, 3);
	index = m_protocols.InsertString(3, "V.32模式");
	m_protocols.SetItemData(index, 9);
	index = m_protocols.InsertString(4, "V.2bis模式");
	m_protocols.SetItemData(index, 10);
	index = m_protocols.InsertString(5, "V.34模式");
	m_protocols.SetItemData(index, 11);
	index = m_protocols.InsertString(6, "V.90模式");
	m_protocols.SetItemData(index, 12);
	index = m_protocols.InsertString(7, "Bell 103模式");
	m_protocols.SetItemData(index, 64);
	index = m_protocols.InsertString(8, "Bell 212模式");
	m_protocols.SetItemData(index, 68);
	
	m_protocols.SetCurSel(5);
	
	return TRUE;  // return TRUE unless you set the focus to a control
	              // EXCEPTION: OCX Property Pages should return FALSE
}


void CModemStatusDlg::OnClose() 
{
	if (0 == m_attachId)
	{
		pSSP->Detach(m_attachId);
	}
	CDialog::OnClose();
}

void CModemStatusDlg::OnOK()
{
}


void CModemStatusDlg::OnClickListAtcmd(NMHDR* pNMHDR, LRESULT* pResult) 
{
	// 选择改变时,命令信息也同时改变
	int nItem;
	POSITION pos;
	pos = m_lstAtCmd.GetFirstSelectedItemPosition();
	nItem = m_lstAtCmd.GetNextSelectedItem(pos);
	LocateCommand(nItem);
	*pResult = 0;
}



void CModemStatusDlg::OnButtonSendcmd() 
{
	UpdateData();
	SendCommand(m_strCmd);
	UpdateData(FALSE);
}

void CModemStatusDlg::OnButtonSetSendrate() 
{
   UpdateData();
   CString atCmd;
   atCmd.Format(_T("AT+MS=%d,%d,%d,%d"),
	   m_protocols.GetItemData(m_protocols.GetCurSel()),
	   m_autoMode,
	   m_edtMinRate,
	   m_edtMaxRate);

   SendCommand(atCmd);

}

void CModemStatusDlg::OnButtonCheckStatus() 
{
	CString atCmd = _T("AT&V1");
	SendCommand(atCmd);
}

⌨️ 快捷键说明

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