您的位置:首页 > 其它

MFC串口通信控件mscomm

2013-08-26 16:50 393 查看


这个控件在vs2010中已经不存在,如果想使用请参照网络上的方法自己添加该控件,这里我推荐使用serialport进行串口通信


转自:http://dev.yesky.com/231/2309731_2.shtml


深入浅出VC++串口编程之基于控件

2006-02-21 10:05 来源:天极开发 作者:宋宝华 责任编辑:方舟·yesky 评论(25)

  2.例程

  程序的功能和界面(如下图)都与本文连载三中《基于WIN32 API的串口编程》相同,不同的只是连载三的串口通信以API实现,而本节的串口通信则以MSComm控件实现。



  使用第1节的方法将控件添加入工程并添加mscomm.h和mscomm.cpp文件后,为了使用控件,我们将控件拖入对话框内任意一个位置(运行时"电话"图标会隐藏),其操作如下图:



  有趣而极富人性化的是我们可以直接右键单击这个"电话",来设置串口的属性,如下图:



  接着,我们需要为控件添加一个对应的成员变量m_mscom,其对应的变量类型为CMSComm,如下图:





  这样就建立了m_mscom和IDC_MSCOMM1控件的相互映射:

void CSerialPortActivexDlg::DoDataExchange(CDataExchange* pDX)

{

 CDialog::DoDataExchange(pDX);

 //{{AFX_DATA_MAP(CSerialPortActivexDlg)

  DDX_Text(pDX, IDC_RECV_EDIT, m_recv);

  DDX_Text(pDX, IDC_SEND_EDIT, m_send);

  DDX_Control(pDX, IDC_MSCOMM1, m_mscom);

 //}}AFX_DATA_MAP

}
  同时,在对话框的头文件也会由"MFC类向导"自动定义CSerialPortActivexDlg类的CMSComm型成员变量m_mscom:

CMSComm m_mscom;
  在对话框初始化时(即在CSerialPortActivexDlg::OnInitDialog函数中)打开串口1:

BOOL CSerialPortActivexDlg::OnInitDialog()

{

 CDialog::OnInitDialog();

 // Add "About..." menu item to system menu.

 // IDM_ABOUTBOX must be in the system command range.

 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);

 ASSERT(IDM_ABOUTBOX < 0xF000);

 CMenu* pSysMenu = GetSystemMenu(FALSE);

 if (pSysMenu != NULL)

 {

  CString strAboutMenu;

  strAboutMenu.LoadString(IDS_ABOUTBOX);

  if (!strAboutMenu.IsEmpty())

  {

   pSysMenu->AppendMenu(MF_SEPARATOR);

   pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX,

   strAboutMenu);

  }

 }

 // 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

 m_mscom.SetCommPort(1); //串口1

 m_mscom.SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes

 m_mscom.SetOutBufferSize(512); //设置输入缓冲区的大小,Bytes

 if(!m_mscom.GetPortOpen()) //打开串口

 {

  m_mscom.SetPortOpen(true);

 }

 m_mscom.SetInputMode(1); //设置输入方式为二进制方式

 m_mscom.SetSettings("9600,n,8,1"); //设置波特率等参数

 m_mscom.SetRThreshold(1); //为1表示有一个字符即引发事件

 m_mscom.SetInputLen(0);

 return TRUE; // return TRUE unless you set the focus to a control

}
  最核心的发送串口数据函数("发送"按钮单击事件)如下:

void CSerialPortActivexDlg::OnSendButton()

{

 // TODO: Add your control notification handler code here

 UpdateData(true);

 CByteArray sendArr;

 WORD wLength;

 wLength = m_send.GetLength();

 sendArr.SetSize(wLength);

 for(int i =0; i<wLength; i++)

 {

  sendArr.SetAt(i, m_send.GetAt(i));

 }

 m_mscom.SetOutput(COleVariant(sendArr));

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: