利用MSComm控件写串口小软件

时间:2023-01-05 17:54:15

先利用MFC建立对话框,然后添加MSComm控件。将控件拖入对话框作为宿主。

Add To Project->Components  and  Controls …->Gallery->Registered ActiveX Controls->Microsoft Communications Control, version 6.0->Insert.---OK.

然后给接收编辑框,发送编辑框,控件MSComm1添加关联变量。

分别是CString  m_strRxData。CString  m_strTxData。CMSComm  m_ctrComm。

通过以上操作,系统会自动在对话框头文件中添加#include"mscomm.h"

下面在OnInitDialog函数中添加如下代码对串口进行初始化:

//添加以下代码,对串口初始化 
 m_ctrComm.SetCommPort(4);  //选择COM4
 m_ctrComm.SetInputMode(1);  //输入方式为二进制方式
 m_ctrComm.SetInBufferSize(1024);  //设置输入缓冲区大小
 m_ctrComm.SetOutBufferSize(512);  //设置输出缓冲区大小

 m_ctrComm.SetSettings("9600,n,8,1");  //波特率9600,无校验,8个数据位,1个停止位
 
 if(!m_ctrComm.GetPortOpen())
 {
  m_ctrComm.SetPortOpen(TRUE);  //打开串口
 }
 m_ctrComm.SetRThreshold(1);  //参数1表示每当输入缓冲区有多与或等于一个字符时将引发一个接收数据的OnComm事件
 m_ctrComm.SetInputLen(0);   //设置当前接收区数据长度为0
 m_ctrComm.GetInput();    //先预读缓冲区以清除残留数据
///////////////////////////////////////

下面添加串口事件消息处理函数:

选择类向导,消息映射。选中当前对话框名字.

再在Object IDs中选择IDC_MSCOMM1,在message中为OnComm命令添加消息处理函数。

系统会自动在头文件中添加 afx_msg void OnCommMscomm1();

然后在OnCommMscomm1中添加如下处理代码:

/**********************************************
*  没接受一次数据触发一个Oncomm事件
*  下面代码是进行消息处理
***********************************************/
 //下面定义的各种数据变量主要是用来转换数据类型
 VARIANT variant_inp;
 COleSafeArray safearray_inp;
 LONG len,k;
 BYTE rxdata[2048];  //设置BYTE数组
 CString strtemp;
 if(2==m_ctrComm.GetCommEvent())  //事件值为2表示接收缓冲区内有字符
 {
  variant_inp=m_ctrComm.GetInput();  //读缓冲区
  safearray_inp=variant_inp;    //variant型变量转化为safearray型变量
  len=safearray_inp.GetOneDimSize();  //得到有效数据长度
  for(k=0;k<len;k++)
  {
   safearray_inp.GetElement(&k,rxdata+k);  //转换为BYTE型数组
  }

  for(k=0;k<len;k++)
  {
      BYTE bt=*(char*)(rxdata+k);   //字符型
      strtemp.Format("%c",bt);  //将字符送入临时变量strtemp中存放
      m_strRxData+=strtemp;
   }

 }
 UpdateData(FALSE);    //更新编辑框

/////////////////////////////////////////////////////////

 

然后给发送按钮添加消息响应函数

然后添加如下代码

void CPORTDlg::OnBtnSend()   //发送数据
{
 // TODO: Add your control notification handler code here
 UpdateData(TRUE); //读取编辑框内容
 m_ctrComm.SetOutput(COleVariant(m_strTxData));//发送数据
}

 

即可完成基本的通信功能。