CMSComm类的使用

转载:http://blog.sina.com.cn/s/blog_53a182df0102vs0o.html

最近使用com通讯,于是试验了CMSComm类的使用方法,进行总结

1、在项目中插入MSComm控件,选择Project菜单下Add To Project子菜单中的 Components and Controls…选项,在弹出的对话框中双击Registered ActiveX Controls项,则所有注册过的ActiveX控件出现在列表框中。选择Microsoft Communications Control, version 6.0,,单击Insert按钮将它插入到我们的Project中来,接受缺省的选项。

这时在ClassView视窗中就可以看到CMSComm类了,并且在控件工具栏Controls中出现了电话图标,用鼠标将此图标拖到对话框中,程序运行后,这个图标是看不到的。

​2、串口如何打开与关闭

void CTestVCcomDlg::OnButtonSerialopenclose() 

{

// TODO: Add your control notification handler code here

    UpdateData(TRUE); //读取编辑框内容

    

    if(m_ctrlCommA.GetPortOpen())

    {

        m_ctrlCommA.SetPortOpen(FALSE);

        SetDlgItemText(IDC_BUTTON_SERIALOPENCLOSE,"serialcom open");

    }

    else

    {

        CString Baudrate;

        Baudrate="115200,n,8,1";

        m_ctrlCommA.SetCommPort(m_ComANum);//设置端口号

        m_ctrlCommA.SetInBufferSize(10240);//设置接收缓冲区大小,若不能及时读取串口数据,则串口接收到的数据在缓冲区中越积越多,超过10240就会造成丢数,因此设置这个数字时,要考虑到多久读一次串口,是否可能发生缓冲区溢出的情况。

        m_ctrlCommA.SetOutBufferSize(1024);//设置发送缓冲区大小,若发送速度太快,旧的数据还未发出去,新的要发送的数据就来了,导致串口发送缓冲区沾满就会丢数。因此设置这个数字时,要考虑多久发送一次数据,发送间隔是否过小,是否造成发送缓冲区溢出。

        m_ctrlCommA.SetInputLen(0); //设置当前接收区数据长度为0,表示全部读取

        m_ctrlCommA.SetInputMode(1);//以二进制方式读写数据

        m_ctrlCommA.SetRThreshold(1);//参数1表示每当串口接收缓冲区中有多于或等于1个字符时将引发一个接收数据的OnComm事件

        m_ctrlCommA.SetSettings(Baudrate);//设置波特率、校验位

        m_ctrlCommA.SetPortOpen(TRUE);//打开串口

        m_ctrlCommA.GetInput();//清空串口数据

        if( !m_ctrlCommA.GetPortOpen())

        {

            AfxMessageBox("cannot open serial port A");

            return;

        }

         SetDlgItemText(IDC_BUTTON_SERIALOPENCLOSE,"serialcom close");

    }

​}

3、发送数据

由于以十六进制发送可以发送任意内容,因此此处以发送十六进制数为例

        CByteArray Hexdata;//要发送的信息保存于Hexdata中

        Hexdata.SetSize(6);//设置发送字节数

        Hexdata[0] = 0xAB;//分别赋值

        Hexdata[1] = 0xCD;

        Hexdata[2] = 0xEF;

        Hexdata[3] = 0x01;

        Hexdata[4] = 0x23;

        Hexdata[5] = 0x45;

        m_ctrlCommA.SetOutput(COleVariant(Hexdata));


4、接收数据

void CTestVCcomDlg::OnOnCommMscommA() 

{

    VARIANT cominput;

    COleSafeArray m_input;

    long length,i,j;

    char combyte;

    if(m_ctrlCommA.GetCommEvent()==2)//接收缓冲区内有字符

    {

        cominput=m_ctrlCommA.GetInput();//读取缓冲区内的数据

        m_input=(cominput);//将VARIANT型变量转换为ColeSafeArray型变量

        length=m_input.GetOneDimSize();//确定数据长度

        FILE *fp;

        fp =fopen("comAlog.txt","a");

        for(i=0;i <  length; i++)

        {

            m_input.GetElement(&i,&combyte);

            fwrite(&combyte,1,1,fp);

        }

        fclose(fp);

     }

}

​上述就完成了串口的接收与发送。所有串口的开发都离不开上述代码。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值