本站文章 大都标明转载及原创.如果转载的文章侵犯了你的权益,或有其他问题请与我联系(unaided@tom.com ).如果要转载本人原创文章,请注明出处.谢谢合作!
时 间 记 忆
最 新 评 论
专 题 分 类
最 新 日 志
最 新 留 言
搜 索
用 户 登 录
友 情 连 接
博 客 信 息
  • 日志:438
  • 评论:348
  • 留言:9
  • 访问:

 
[转载]串口通讯之MSComm串行通讯控件(2)
[ 2006-2-23 22:39:00 | By: 老蒋 ]
 
 

2.发送通讯数据

 

Visual C++ 中,通讯控件发送数据的任务是由其接口成员函数SetOutput来实现的,该函数使用的参数是const VARIANT &newValueVARIANT其实是一个C++结构类型,COleVariant类型对VARIANT做了进一步的封装和扩展,提供了许多新的功能和操作方法,支持OLE自动化,且更容易向其数据成员填入数据。由于COleVariant类型由VARIANT派生而来,因此将COleVariant类型的变量传递给SetOutput函数更为方便。另外,SetOutput的参数newValue类型必须是存放字节类型数据的动态数组。因此,可以利用Visual C++提供CByteArray类型来构造COleVariant类型的对象,并将其传递给SetOutput函数。对CByteArray类型变量的操作相对来说要容易的多,比如其成员函数SetSize可用来设置动态数组的大小,下标操作符[]可用来为其元素赋值等等。下面的程序代码可实现将存放在缓冲区strBuf中的100个字节的数据通过通讯控件发送出去:

 

……

 

BYTE strBuf[128];

 

CByteArray OutBuf;

 

COleVariant varOutput;

 

……

 

OutBuf.SetSize(100);

 

for(i=0;i<100;i++)OutBuf[i] = strBuf[i];

 

varOutput = OutBuf;

 

m_pCommDlg->m_Comm.SetOutput(varOutput);

 

……

 

利用通讯控件发送数据的关键在于构造COleVariant类型的变量,并向其中填入通讯数据,使其能满足通讯控件的成员函数SetOutput的需要。上面的程序语句varOutput = OutBuf可以直接写成:

 

COleVariant varOutputOutBuf);

 

但这样必须将变量varOutput的定义语句COleVariant varOutput删除掉。

 

3.接收通讯数据

 

通讯控件接收通讯数据的任务是通过其接口成员函数GetInput来实现的,该函数的返回值的类型为VARIANT,同样我们可以将其赋值给COleVariant类型的变量。进一步,我们必须知道,该函数返回值变量的有效成员为parray,其类型定义为SAFEARRAY FAR*,即parray为一个安全数组指针,且数组的元素类型为BYTE。因此,对GetInput函数返回值的访问,可以通过安全数组操作函数来实现,比如:读取数组的维数、下边界、上边界以及各个元素的实际的值等。该返回值变量所对应的安全数组的维数为1,下边界为0。根据上述分析,下面的程序代码基本能够实现利用通讯控件接收通讯数据:

 

CByteArray ByteBuf;

 

COleVariant varInput;

 

long ix,l,u;

 

BYTE bit;

 

……

 

varInput = m_pCommDlg->m_Comm.GetInput();

 

if(varInput.parray!=NULL)

 

{

 

SafeArrayGetLBound(varInput.parray,1,&l);

 

SafeArrayGetUBound(varInput.parray,1,&u);

 

for(ix=l;ix<=u;ix++)

 

{

 

SafeArrayGetElement(varInput.parray,&ix,&bit);

 

ByteBuf.Add(bit);

 

}

 

}

 

……

 

4.小结

 

本文讲述的利用通讯控件发送与接收通讯数据都是基于二进制来实现的,基于文本的情况基本与此类似。要想利用好通讯控件还有其他一些应该注意的地方,比如波特率的设置、接收与发送缓冲区的设置以及通讯过程中的延时问题的处理等等。

 

 
 
发表评论:
载入中...