几个关于MSCOMM控件串口通信编程的有关问题?

几个关于MSCOMM控件串口通信编程的问题??
本帖最后由 li460135301 于 2013-01-08 16:33:26 编辑
在学习串口编程,碰到几个问题,还清大虾指教!!

COleVariant myVar;           //先定义一个变量
COleSafeArray safearray_inp;
LONG len, k;
BYTE rxdata[2048];
CString strTemp(_T(""));
if(m_ctrlComm.get_CommEvent() == 2)
{
myVar.Attach(m_ctrlComm.get_Input()); //我这个GetInput的返回值是VARIANT
safearray_inp = myVar;
len = safearray_inp.GetOneDimSize();
for(k = 0; k < len; k++)
{
safearray_inp.GetElement(&k, rxdata+k);
}
for(k = 0; k < len; k++)
{
BYTE bt = *(char *)(rxdata+k);
strTemp.Format(_T("%c"), bt);
m_strEditRxData += strTemp;
}

第一个问题:COleVariant和COleSafeArray 到底有什么区别??我知道COleVariant是一个封装了VARIANT结构体的类,主要用于OLE自动化中传输数据(书上说的),而COleSafeArray是一种用于OLE自动化安全类型,这个程序我如果直接只定义一个COleSafeArray变量把

myVar.Attach(m_ctrlComm.get_Input()); //我这个GetInput的返回值是VARIANT
safearray_inp = myVar;

直接改为:

safearray_inp = m_ctrlComm.get_Input();

或者

safearray_inp.Attach(m_ctrlComm.get_Input());

就是不用COleVariant中转,好像结果没有任何问题,跟上面的程序结果一样!所以不明白这两个类具体有什么差别???

第二个问题:程序中rxdata原本就是BYTE行的数组,为什么在增加到strTemp之前要用上这句话:

BYTE bt = *(char *)(rxdata+k);

他最后不是把BYTE型变量又强制转化为BYTE变量,不知道有什么用!!我觉得直接用

BYTE bt = rxdata[k];

不是更方便!!!甚至可以直接把上面程序简化为:

BYTE rxdata;
for(k = 0; k < len; k++)
{
safearray_inp.GetElement(&k, &rxdata);
strTemp += rxdata;
}
m_strEditRxData += strTemp;

这样程序貌似简化很多!!!测试效果也几乎一样,暂时没有发现有什么差别,所以不知道

BYTE bt = *(char *)(rxdata+k);

这条语句有什么意义??????


第三个问题:就我测试了这段代码?可以接受英文字符很正常,但是不能够接收中文字符,用什么方法可以把COleVariant(或者是COleSafeArray)类变量直接转化为CString类的变量,而且可以支持中文字符!!!
因为发送的时候用:

m_ctrlComm.put_Output(COleVariant(m_strEditTxData));

发送中文字符时很正常的,就是CString类本来是支持中文字符的,但是通过BYTE或者是CByteArray转化一下再存入CString字符串中就变成了乱码??我知道因为BYTE其实是unsigned char类型,所以不能存储中文国标码字符,而CString是支持Unicode编码的,是支持中文字符的,所以这种转化肯定不能接收中文字符!!
所以想请问一下大虾,有什么方法可以让串口接收到中文字符,并可以显示出来!!!谢谢!!
    我测试过网上有些串口调试助手是支持中文字符的!!不确定他们是不是用MSCOMM控件开发的,有可能是用Windows API开发的,我想知道如果用MSCOMM控件,怎么样才可以实现能够接收中文字符!!谢谢!!

    求大虾帮帮忙!!呵呵!初学者多多指教!!
MSCOMM 串口 VC 串口调试 SerialPort

------解决方案--------------------
问题1:
COleSafeArray继承COleVariant,但又属于COleVariant的一个类型VT_ARRAY。
而COleSafeArray的每个元素又可以是COleVariant。
在网络环境中,数组是不能直接传递的,而必须将其包装成SafeArray,赋给COleVariant。
问题2:
你说的都对,只是编程习惯问题,两者是等效的。
问题3:
中文是接受过来了,但是你不能像下边这样 一个字节一个字节的取。因为汉字至少是2字节(根据编码不同)
        BYTE bt = *(char *)(rxdata+k);