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);
}