`

VC++.NET和VC++6.0串行通信控件的使用区别

阅读更多
1 MSComm介绍

在WINDOWS环境下,用户不能直接对PC的串行端口进行操作。Visual C++.NET中,通过使用微软公司提供的Microsoft Comm Control控件(简称MSComm),可以方便地实现PC与外部设备之间的串行通信,编程工作量相对较少。

2.Visual C++.NET中控件MSComm的函数与Visual C++6.0中的控件函数有所不同。

MSComm有二十多个属性,其中主要的属性有:

CommPort:设置和返回通信端口号,CommPort=1即使用串行端口Com1。

PortOpen:打开或关闭通信端口。

InBufferSize:设置接收缓冲区大小。

OutBufferSize:设置发送缓冲区大小。

Input:读取并删除缓存区中的数据。

Output:将数据写入发送缓存区。

Settings:设置波特率、奇偶校验、数据位和停止位参数,默认值为“9600,N,8,1”,即波特率9600b/s、不进行奇偶校验、8个数据位、1个停止位。

InputLen:设置每次从缓存区读取的字节数。

InputMode:设置和返回数据类型,设置为0时读取的数据为文本形式,设置为1时读取的数据为二进制数据。PC与单片机通信时,InputMode属性常设置为二进制数据形式。

Rthreshold:设置OnComm事件发生前,接收缓存区可以接收的字符数。若设置为0,则不产生OnComm事件。

串行通信控件MSComm有二种处理通信的工作方式:事件驱动方式和查询工作方式。事件驱动方式是指:当串行端口接收或发送完指定数量数据以及发生通信错误等情况时,MSComm控件触发OnComm事件,作出相应处理。查询工作方式是指:通过查询控件的某些属性值(如InBufferCount属性)来作出进一步的处理。以下的程序实例采用事件驱动方式来接收数据。

3.NET下添加步骤

按照已有的步骤注册串口控件MScomm32.ocx,注册完成后,新建一个MFC应用程序,选 工具—添加/移除工具箱项—COM组件—添加Microsoft Communication Control, version 6.0, 就会出现一个电话图标哦!!!

添加控件,右击添加变量m_com4,这个时候会生成2个重要的文件mscomm1.cpp和mscomm1.h(这是与6.0下不同点,mscomm.cpp mscomm1.h)

控件的函数不一样的啊,Set变为put_, Get变为get_ 就搞定。

///////VC.NET 的代码

void CRobotDlg::InitCom(void)

{   m_com4.put_CommPort(4);//1=表示是COM1,若要使用COM2,则将此参数改成2、以此类推  

         m_com4.put_InputMode(1);//设置输入方式为二进制 

         m_com4.put_InBufferSize(1024);//设置输入缓冲区大小

         m_com4.put_OutBufferSize(1024);//设置输出缓冲区大小

         m_com4.put_Settings("9600,n,8,1");//设置参数

if(!m_com4.get_PortOpen())//打开串口

         m_com4.put_PortOpen(true);

         m_com4.put_RThreshold(2);//2表示有2个字节引发一个事件

         m_com4.put_InputLen(0);//清除输入缓冲

}

void CRobotDlg::ComSend(BYTE data)

{

         CByteArray array1;              //定义字节流

         array1.RemoveAll();  //清空

         array1.SetSize(1);   //设置字节的长度

         array1.SetAt(0,data);  //以2进制方式发送0xAA 

         m_com4.put_Output(COleVariant(array1));   //发送

}

void CRobotDlg::OnBnClickedButton1()

{       // TODO: 在此添加控件通知处理程序代码

         InitCom();

         ComSend(0x00);

}

 

/////6.0的代码 

void CrobotDlg::InitCom4(void)

{       
       m_com4.SetCommPort(4);//1=表示是COM1,若要使用COM2,则将此参数改成
                                  //2、以此类推      
         m_com4.SetInputMode(1);//设置输入方式为二进制 

         m_com4.SetInBufferSize(1024);//设置输入缓冲区大小

         m_com4.SetOutBufferSize(1024);//设置输出缓冲区大小

         m_com4.SetSettings("9600,n,8,1");//设置参数

         if(!m_com4.GetPortOpen())//打开串口

                   m_com4.SetPortOpen(true);

         m_com4.SetRThreshold(2);//2表示有2个字节引发一个事件

         m_com4.SetInputLen(0);//清除输入缓冲

}

void CrobotDlg::OnBnClickedComsendButton()

{// TODO: 在此添加控件通知处理程序代码

         InitCom4();

         ComSend(0x00);

}

 

void CrobotDlg::ComSend(BYTE mydata)

{

         CByteArray array1;              //定义字节流

         array1.RemoveAll();  //清空

         array1.SetSize(1);   //设置字节的长度

         array1.SetAt(0,mydata);  //以2进制方式发送0xAA     

         m_com4.SetOutput(COleVariant(array1));   //发送

}

 


4.请看源代码的区别,详见mscomm1.h,  mscomm.cpp

如mscomm1.h下的一段串口定义函数代码

void put__CommPort(short newValue)

     {

         static BYTE parms[] = VTS_I2 ;

         InvokeHelper(0x0, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms, newValue);

     }

 

如mscomm.cpp下的一段串口定义函数的代码

void CMSComm::SetCommPort(short nNewValue)

{       static BYTE parms[] =          VTS_I2;

         InvokeHelper(0x4, DISPATCH_PROPERTYPUT, VT_EMPTY, NULL, parms,   nNewValue);

}

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics