<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title><![CDATA[FPGA Notes]]></title> 
<link>http://www.fpganotes.com/index.php</link> 
<description><![CDATA[Learning Notes about Xilinx FPGA, ISE, EDK and IC Industry]]></description> 
<language>zh-cn</language> 
<copyright><![CDATA[FPGA Notes]]></copyright>
<item>
<link>http://www.fpganotes.com/post/6/</link>
<title><![CDATA[VC6里用到的一些类型转换]]></title> 
<author>RickySu &lt;sutongqi+blog@gmail.com&gt;</author>
<category><![CDATA[技术经验]]></category>
<pubDate>Tue, 23 May 2006 14:59:53 +0000</pubDate> 
<guid>http://www.fpganotes.com/post/6/</guid> 
<description>
<![CDATA[ 
	[引子]<br/>在做毕设的时候，用到VC6里面的串口控件。我对VC几乎是一窍不通的，这次做毕设里面的类型转换也困扰了我好久。在此小小总结一下。<br/><br/>[主要内容]<br/>一、MSComm里用到的VARIANT, COleVariant类型与CString, BYTE之间的转换，以实现数据的发送和接收<br/>二、CString与int的转换，实现对接收来的数据的运算<br/><br/><br/><span style="color: #FF4500;">一、MSComm和VARIANT</span><br/>VC6自带的串口ActiveX MSComm的对象使用SetOutput()和GetInput()方法实现发送和接收。这两个函数的参数都是VARIANT类型。<br/><div class="code">void CMSComm::SetOutput(const VARIANT&amp; newValue)<br/>VARIANT CMSComm::GetInput()</div><br/><br/><span style="color: #2E8B57;">发送过程：</span><br/><br/>VARIANT其实是一个C++结构类型，COleVariant类型对VARIANT做了进一步的封装和扩展，提供了许多新的功能和操作方法，支持OLE自动化，且更容易向其数据成员填入数据。由于COleVariant类型由VARIANT派生而来，因此将COleVariant类型的变量传递给SetOutput函数更为方便。另外，SetOutput的参数newValue类型必须是存放字节类型数据的动态数组。因此，可以利用Visual C++提供CByteArray类型来构造COleVariant类型的对象，并将其传递给SetOutput函数。对CByteArray类型变量的操作相对来说要容易的多，比如其成员函数SetSize可用来设置动态数组的大小，下标操作符[]可用来为其元素赋值等等。<br/><br/>下面的程序代码可实现将存放在缓冲区strBuf中的100个字节的数据通过通讯控件发送出去：<br/><br/><div class="code">……<br/>BYTE strBuf&#91;128&#93;;<br/>CByteArray OutBuf;<br/>COleVariant varOutput;<br/>……<br/>OutBuf.SetSize(100);<br/>for(i=0;i&lt;100;i++)<br/>&nbsp;&nbsp;OutBuf&#91;i&#93; = strBuf&#91;i&#93;;//BYTE转CByteArray<br/>varOutput = OutBuf;//CByteArray转COleVariant<br/>m_pCommDlg-&gt;m_Comm.SetOutput(varOutput);<br/>……</div><br/><br/>利用通讯控件发送数据的关键在于构造COleVariant类型的变量，并向其中填入通讯数据，使其能满足通讯控件的成员函数SetOutput的需要。上面的程序语句varOutput = OutBuf可以直接写成：<br/><br/><div class="code">COleVariant varOutput（OutBuf）；</div><br/><br/>但这样必须将变量varOutput的定义语句COleVariant varOutput删除掉。<br/><hr/><br/>上例只能发送ASCII编码的字符，为了以十六进制发送数据，我参考一些资料后写了一个函数：<br/><br/><div class="code">void CSCommTestDlg::OutputBin(unsigned char *data,int len)<br/>&#123;<br/>&nbsp;&nbsp;CByteArray binData;<br/>&nbsp;&nbsp;binData.RemoveAll(); //清空binData<br/>&nbsp;&nbsp;for(int i=0;i&lt;len;i++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;binData.Add(*(data+i));<br/>&nbsp;&nbsp;COleVariant var(binData); //将binData转化为Variant数据类型<br/>&nbsp;&nbsp;m_ctrlComm.SetOutput(var);<br/>&#125;</div><br/><br/>使用时，只需要先定义一个字符数组，往数组里面填装数据，然后调用函数就可以将十六进制数据发送到串口：<br/><br/><div class="code">unsigned char cmd&#91;2&#93;;<br/>cmd&#91;0&#93;= 0x01;<br/>cmd&#91;1&#93;= 0x02;<br/>OutputBin(cmd,2);</div><br/><br/><br/><span style="color: #2E8B57;">接收过程：</span><br/>看到过两种转换方法分别是VARIANT转COleVariant转CByteArray(需用parray)和VARIANT转COleSafeArray转CString。我只用过后者。<br/><br/><div class="code">if(m_ctrlComm.GetCommEvent()==2) //事件值为2表示接收缓冲区内有字符<br/>&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;variant_inp=m_ctrlComm.GetInput(); //读缓冲区<br/>&nbsp;&nbsp;&nbsp;&nbsp;safearray_inp=variant_inp;&nbsp;&nbsp;//VARIANT型变量转换为ColeSafeArray型变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;len=safearray_inp.GetOneDimSize(); //得到有效数据长度<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&lt;len;k++)<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;safearray_inp.GetElement(&amp;k,rxdata+k);//转换为BYTE型数组<br/>&nbsp;&nbsp;&nbsp;&nbsp;for(k=0;k&lt;len;k++)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //将数组转换为Cstring型变量<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#123;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BYTE bt;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bt=*(char*)(rxdata+k);&nbsp;&nbsp;&nbsp;&nbsp;//字符型<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//strtemp.Format(&quot;%c&quot;,bt);&nbsp;&nbsp;&nbsp;&nbsp;//将字符送入临时变量strtemp存放<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;strtemp.Format(&quot;%02X &quot;,bt);&nbsp;&nbsp; //十六进制显示<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_strEditRXData+=strtemp;&nbsp;&nbsp;//加入接收编辑框对应字符串<br/>&nbsp;&nbsp;&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;&#125;<br/>&nbsp;&nbsp;UpdateData(FALSE);&nbsp;&nbsp;//更新编辑框内容 </div><br/><br/><span style="color: #FF4500;">二、CString和int的转换</span><br/><br/>将CString转换成整数可以用atoi函数<br/><br/><div class="code">CString ss=&quot;1212.12&quot;; <br/>int temp=atoi(ss); <br/>//也有人这样写：temp=atoi((LPCTSTR)ss);</div><br/><br/>将数字转换为CString变量，可以使用CString的Format函数。如 <br/><br/><div class="code">CString s; <br/>int i = 64; <br/>s.Format(&quot;%d&quot;, i) </div><br/><br/>Format函数的功能很强，值得研究一下。 <br/>如果是使用char数组，也可以使用sprintf函数。 <br/><br/><br/><br/>[参考资料]<br/><a href="http://blog.21ic.com/more.asp?name=unaided&id=9463" target="_blank">串口通讯之MSComm串行通讯控件(2)</a> [unaided的笔记]（转载，原始出处不详）<br/><a href="http://www.gjwtech.com/vcandc/scommassistantcode02.htm" target="_blank">串口调试助手源程序</a>[龚建伟技术]<br/><a href="http://www.china-askpro.com/msg36/qa87.shtml" target="_blank">如何进行CString变量和int变量的转换</a>[问专家]<br/><a href="http://www.experts-exchange.com/Programming/Programming_Languages/MFC/Q_21088888.html" target="_blank">MFC:CString to int</a>[ExpertsExchange]<br/>Tags - <a href="http://www.fpganotes.com/tags/uart/" rel="tag">uart</a> , <a href="http://www.fpganotes.com/tags/vc/" rel="tag">vc</a>
]]>
</description>
</item><item>
<link>http://www.fpganotes.com/post/6/#blogcomment44</link>
<title><![CDATA[[评论] VC6里用到的一些类型转换]]></title> 
<author>紫月 &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Mon, 24 Sep 2007 03:43:25 +0000</pubDate> 
<guid>http://www.fpganotes.com/post/6/#blogcomment44</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item><item>
<link>http://www.fpganotes.com/post/6/#blogcomment77</link>
<title><![CDATA[[评论] VC6里用到的一些类型转换]]></title> 
<author>afaf &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Fri, 19 Sep 2008 08:43:13 +0000</pubDate> 
<guid>http://www.fpganotes.com/post/6/#blogcomment77</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item><item>
<link>http://www.fpganotes.com/post/6/#blogcomment79</link>
<title><![CDATA[[评论] VC6里用到的一些类型转换]]></title> 
<author>dddd &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Mon, 06 Oct 2008 06:34:08 +0000</pubDate> 
<guid>http://www.fpganotes.com/post/6/#blogcomment79</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item><item>
<link>http://www.fpganotes.com/post/6/#blogcomment94</link>
<title><![CDATA[[评论] VC6里用到的一些类型转换]]></title> 
<author>金猴 &lt;user@domain.com&gt;</author>
<category><![CDATA[评论]]></category>
<pubDate>Tue, 03 Feb 2009 06:46:07 +0000</pubDate> 
<guid>http://www.fpganotes.com/post/6/#blogcomment94</guid> 
<description>
<![CDATA[ 
	
]]>
</description>
</item>
</channel>
</rss>