关于VC串口编程CString转化为COleVariant的有关问题!

关于VC串口编程CString转化为COleVariant的问题!!!
    今天做一个VC的串口小程序,就是把一字节的数据发送给下位机,但是出现了很奇怪的问题!!!
就是当数据最高位为0时,发送数据才准确,当字节最高位为1时下位机收到的数据永远是0x3f;求指导!!!

     我调试了,结果发现时COleVariant 转化时出现了问题!!!
程序如下:


m_strText += m_nTemp;
COleVariant as(m_strText);
m_mscom.put_Output(as);


    其中m_nTemp是BYTE型变量, m_strText是CString型变量,m_mscom是CMscomm控件的类仿真结果如下:
关于VC串口编程CString转化为COleVariant的有关问题!



在执行到COleVariant as(m_strText);一句的时候m_strText种的值明明是0xdf,但转化为COleVariant类时就变成了0x3f;
     经验证;如果数据最高位(第7位)为0则转化时成功的,如果最高位(第7位)为1的话,数据就为0x3f。我纠结了好几个小时,求指导!!!
     对COleVariant不是很了解,只知道是对VARIANT结构的封装;可以包含各种变量,但是如果把

COleVariant as(m_strText);

改为
COleVariant as(m_nTemp);

的话,当执行到
m_mscom.put_Output(as);

句时程序就会报错!!!
     我要怎么修改才能解决这个问题??求指点!!!




------解决方案--------------------
MSCOMM的文字模式只支持ASCII,第七位为1的字符超出了ASCII的范围,所以会被转换成问号。如果你要写数据,那么用数据模式(InputMode =1)。

------解决方案--------------------
其中m_nTemp是BYTE型变量, m_strText是CString型变量
既然是这样,你也敢写 m_strText += m_nTemp;这样的代码?
只能说上帝保佑你!
------解决方案--------------------
直接用createfile("com1")打开串口,用系统提供的API读写串口,或许对串口通信了解的更深一点。
------解决方案--------------------
看你有用到 ATL m_strText 何不用 CComBSTR 而不要用 CString
或是可以用 ATL String Conversion Macros 中 的 A2OLE(m_nTemp); 就轉成 unicode
------解决方案--------------------
引用:
引用:MSCOMM的文字模式只支持ASCII,第七位为1的字符超出了ASCII的范围,所以会被转换成问号。如果你要写数据,那么用数据模式(InputMode =1)。
我的数据模式是1,改成数据模式后效果依然!!!
这是串口的初始化代码??
C/C++ code?1234567m_mscom.put_InBufferSize(1……

如果你要用的是數據模式,你用的 CString 就不對了

你只能用 BYTE array ,最好是 m_nTemp 改用 BYTE m_nTemp[]; 問題會少很多
如果還是要用 CString 你要保證 data 不會版 CString 轉換
 
你可以選擇要不要用 SAFEArray 傳 VT_ARRAY
------解决方案--------------------
VT_UI1 過去

如果一定要用 BSTR 要用就只能用 SysAllocStringByteLen

CString 版
VARIANT value;

::VariantInit(&value);
value.vt = VT_BSTR;
value.bstrVal = ::SysAllocStringByteLen( (LPCSTR)m_nTemp ,m_nTemp.Length() );
....
....
m_mscom.put_Output(value);
::VariantClear(&value);