MSComm编程的一个误解

    技术2022-05-11  33

    以前曾看到一篇文章,说如果使用一般的视而不使用CFormView或者Dialog,就无法使用MSComm控件。但事实并不是这么回事。如同标准控件一样,对于ActiveX控件也可以使用Create函数,从而在运行时创建控件,并且实现所有功能。

    下面介绍步骤:

    1>使用resource symbols加入IDC_MSCOMM

    2>在设置串口时加入CReate

    void Init_Com(){ m_Serial.Create("windowname",0,  CRect(0,0,0,0),this,IDC_MSCOMM); // 指定串口号 m_Serial.SetCommPort(2);

     // 关闭该串口 if(m_Serial.GetPortOpen())  m_Serial.SetPortOpen(FALSE);

     // 通信参数设置 m_Serial.SetSettings("9600,N,8,1"); // 指定接收缓冲区大小 m_Serial.SetInBufferSize(1024); // 清空接收缓冲区 m_Serial.SetInBufferCount(0); // 设置数据获取方式 m_Serial.SetInputMode(1); //参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件 m_Serial.SetRThreshold(1);  //设置当前接收区数据长度为0 m_Serial.SetInputLen(0);

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

     m_Serial.GetInput();//先预读缓冲区以清除残留数据}

    3>发送函数

    void Send_Data(){ m_Serial.SetOutput(COleVariant("got"));}

    4>加入对数据接收和错误消息的映射。须手工进行:

    在头文件中加入 afx_msg void OnComm();

    在实现文件中加入BEGIN_EVENTSINK_MAP(CxxxView, CView)    //{{AFX_EVENTSINK_MAP(CTestCommView) ON_EVENT(CxxxView, IDC_MSCOMM, 1 /* OnComm */, OnComm, VTS_NONE) //}}AFX_EVENTSINK_MAPEND_EVENTSINK_MAP()

    void CxxxView::OnComm() { // TODO: Add your control notification handler code here AfxMessageBox("got"); }

    大功告成!


    最新回复(0)