VC++ 的串口通讯(2)(

1、选择菜单项Project/Add to Project/Components and Controls……,将弹出一个对话框以选择系统中已有的组件(Components)和控件(Controls)。选择Registered ActiveX Controls文件夹下的Microsoft Communications Control项并按下Insert按钮,将MSComm控件支持加入到本项目中。这时将生成一个名为CMSComm的C++类,并且在对话框编辑器里的工具栏将出现MSComm控件图标。CMSComm类是由MSComm控件导出的一系列接口函数构成的,利用它将可以访问MSComm控件的属性(Property)和方法(Method)。

2、选取 controls 上 mscomm 控件在对话框上画出,双击mscomm控件,系统会自动生成:

        1>

           dialog.h 文件中生成

           afx_msg void OnOnCommMscomm1();
           DECLARE_EVENTSINK_MAP()

        2>

           dialog.cpp 文件中生成

           BEGIN_EVENTSINK_MAP(CMy1Dlg, CDialog)
           //{{AFX_EVENTSINK_MAP(CMy1Dlg)
           ON_EVENT(CMy1Dlg, IDC_MSCOMM1, 1 /* OnComm */, OnOnCommMscomm1, VTS_NONE)
           //}}AFX_EVENTSINK_MAP
           END_EVENTSINK_MAP()

        3>

           dialog.cpp 文件中生成

           void CMy1Dlg::OnOnCommMscomm1()
           {

            }

3、需手动添加的有:

        1>

         dialog.h 文件中

         #include   ""mscomm.h""

         public:
                CMSComm  m_Comm;
 

         2>

           dialog.cpp 文件中,OnInitDialog()函数内部:            

              DWORD style=WS_VISIBLE|WS_CHILD;

              if (!m_Comm.Create(NULL,style,CRect(0,0,0,0),this,IDC_MSCOMM1))
              {
                     TRACE0("Failed to create OLE Communications Control");
                      return -1;    // fail to create
              }

              m_Comm.SetCommPort(2);
              m_Comm. SetInBufferSize(1024); //设置输入缓冲区的大小,Bytes
              if (!m_Comm.GetPortOpen())
                {
                 m_Comm.SetSettings("9600,N,8,1");
                 m_Comm.SetPortOpen(true);  
                 m_Comm.SetInBufferCount(0);
                 m_Comm.SetRThreshold(1); //为1表示有一个字符引发一个事件
                 m_Comm.SetInputLen(0);

              }

         3>

           dialog.cpp 文件中, OnOnCommMscomm1() 函数内部:

              VARIANT vResponse;

              int k;
              CString   str,befstr;

              if(m_Comm.GetCommEvent()==2)
               {
  
                   k = m_Comm.GetInBufferCount(); //接收到的字符数目
 
                   if(k>0)
                    {

                     vResponse = m_Comm.GetInput();
                      str = V_BSTR(&vResponse);
 
                     GetDlgItemText(IDC_EDIT1,befstr);
                      //befstr = befstr + _T("/r/n");
                     befstr = befstr + str;
                     SetDlgItemText(IDC_EDIT1,befstr);
                     }
                }

*********************************另一个实例****************************

dialog.cpp 文件中,OnInitDialog()函数内部:  

 if(m_ctrlComm.GetPortOpen())
  m_ctrlComm.SetPortOpen(FALSE);

 m_ctrlComm.SetCommPort(3);   //选择com1

 if( !m_ctrlComm.GetPortOpen())
  m_ctrlComm.SetPortOpen(TRUE);//打开串口
 else
  AfxMessageBox("cannot open serial port");

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

void CSCommTestDlg::OnComm()
{
 VARIANT m_input1;
 COleSafeArray m_input2;
 long length,i;
 BYTE data[1024];
 CString str;

 if(m_ctrlComm.GetCommEvent()==2)//接收缓冲区内有字符
 {
  m_input1=m_ctrlComm.GetInput();//读取缓冲区内的数据
  m_input2=m_input1;//将VARIANT型变量转换为ColeSafeArray型变量
  length=m_input2.GetOneDimSize();//确定数据长度
  for(i=0;i<length;i++)
   m_input2.GetElement(&i,data+i);//将数据转换为BYTE型数组

  for(i=0;i<length;i++)//将数组转换为Cstring型变量
  {
   BYTE a=* (char *)(data+i);
   str.Format("%c",a);
   m_strRXData+=str;
  }
 }
 UpdateData(FALSE);//更新编辑框内容
}

//  m_ctrlComm.SetOutput(COleVariant(hexdata)); //发送十六进制数据

驱动器 D 的卷没有标签。 卷的序列号是 B837-9C57 D:\download\USB助手 源码 2008-12-30 08:44 . 2008-12-30 08:44 .. 2002-10-07 15:21 1,536 ChildFrm.cpp 2002-10-07 15:21 1,397 ChildFrm.h 2002-10-07 15:21 17,103 DevicesDlg.cpp 2002-10-07 15:21 2,330 DevicesDlg.h 2008-12-30 08:44 18 dir list.bat 2008-12-30 08:44 0 dir.txt 2002-10-07 15:21 5,469 Exporter.cpp 2002-10-07 15:21 2,098 Exporter.h 2002-10-07 15:21 4,947 ExportLogDlg.cpp 2002-10-07 15:21 1,712 ExportLogDlg.h 2002-10-07 15:21 6,135 MainFrm.cpp 2002-10-07 15:21 1,894 MainFrm.h 2002-10-07 15:21 2,954 MyMemFile.cpp 2002-10-07 15:21 1,682 MyMemFile.h 2002-10-07 15:21 1,582 ProgressStatusBar.cpp 2002-10-07 15:21 982 ProgressStatusBar.h 2002-10-07 15:21 4,754 ReadMe.txt 2002-10-07 15:21 2,271 ReadmeDlg.cpp 2002-10-07 15:21 1,264 ReadmeDlg.h 2008-12-30 08:41 Res 2002-10-07 15:21 4,735 Resource.h 2002-10-07 15:21 14,777 SetupDIMgr.cpp 2002-10-07 15:21 1,943 SetupDIMgr.h 2002-10-07 15:21 11,745 SnoopyPro.cpp 2002-10-07 15:21 7,277 SnoopyPro.dsp 2002-10-07 15:21 2,704 SnoopyPro.h 2002-10-07 15:21 23,501 SnoopyPro.rc 2002-10-07 15:21 704 SnoopyPro.reg 2008-12-11 19:15 16,773 SnoopyPro.vcproj 2002-10-07 15:21 211 StdAfx.cpp 2002-10-07 15:21 1,212 StdAfx.h 2002-10-07 15:21 57,986 URB.cpp 2002-10-07 15:21 9,642 URB.h 2002-10-07 15:21 3,613 URBLogListBox.cpp 2002-10-07 15:21 1,454 URBLogListBox.h 2002-10-07 15:21 13,776 URBLogListCtrl.cpp 2002-10-07 15:21 3,209 URBLogListCtrl.h 2002-10-07 15:21 3,192 URLStatic.cpp 2002-10-07 15:21 1,285 URLStatic.h 2002-10-07 15:21 11,998 USBLogDoc.cpp 2002-10-07 15:21 2,929 USBLogDoc.h 2002-10-07 15:21 28,721 USBLogView.cpp 2002-10-07 15:21 3,470 USBLogView.h 42 个文件 286,985 字节 3 个目录 12,592,160,768 可用字节
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值