MFC串口通信控件mscomm

这个控件在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));
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值