<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>博客园-蓝天旭日</title><link>http://www.cnblogs.com/hocylan/</link><description>高手如云，自己只是个菜鸟而已！

没有人在意你曾经的努力和散漫，只有人关注你是否有成就......</description><language>zh-cn</language><lastBuildDate>Sun, 12 Oct 2008 07:53:08 GMT</lastBuildDate><pubDate>Sun, 12 Oct 2008 07:53:08 GMT</pubDate><ttl>60</ttl><item><title>C#绘制坐标简易曲线控件</title><link>http://www.cnblogs.com/hocylan/archive/2008/07/24/1250199.html</link><dc:creator>蓝天旭日</dc:creator><author>蓝天旭日</author><pubDate>Thu, 24 Jul 2008 01:36:00 GMT</pubDate><guid>http://www.cnblogs.com/hocylan/archive/2008/07/24/1250199.html</guid><wfw:comment>http://www.cnblogs.com/hocylan/comments/1250199.html</wfw:comment><comments>http://www.cnblogs.com/hocylan/archive/2008/07/24/1250199.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/hocylan/comments/commentRss/1250199.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hocylan/services/trackbacks/1250199.html</trackback:ping><description><![CDATA[<p>&nbsp;
<table style="border-right: medium none; border-top: medium none; margin-left: 16.5pt; border-left: medium none; border-bottom: medium none; border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing="0" cellpadding="0" align="center" border="1">
    <tr style="height: 15.05pt">
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 0.5pt solid; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.05pt" valign="top" width="175">
            <p class="MsoNormal"><span lang="EN-US"><span style="font-size: 10pt">winform</span></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.05pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 10pt"><a href="http://files.cnblogs.com/hocylan/hocylan_Curve.rar">Download</a>控件源码</span></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.05pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 10pt"><a href="http://files.cnblogs.com/hocylan/testusercontrol.rar">简单例子</a></span></span></p>
            </td>
        </tr>
        <tr style="height: 15.8pt">
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 0.5pt solid; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span lang="EN-US"><span style="font-size: 10pt">webForm</span></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 8pt"><span style="font-size: 10pt"><a href="http://files.cnblogs.com/hocylan/hocyWebControl.rar">Download</a>控件源码</span></span></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 8pt"><span style="font-size: 10pt"><a href="http://files.cnblogs.com/hocylan/webControltest1.rar">简单例子</a></span></span></span></p>
            </td>
        </tr>
        <tr style="height: 15.8pt">
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 0.5pt solid; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal">&nbsp;<span lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal">&nbsp;<span lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal">&nbsp;<span lang="EN-US"><o:p></o:p></span></p>
            </td>
        </tr>
    </table>
</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">思路概要：</span></p>
<p class="MsoNormal"><span lang="EN-US"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 21.75pt"><span lang="EN-US">1 </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">首先确定曲线轴的长度和宽度，确定原点，便于坐标转换</span></p>
<p class="MsoNormal" style="text-indent: 21.75pt"><span lang="EN-US">2 </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分别绘制</span><span lang="EN-US">X</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">轴</span><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span>Y</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">轴，并且绘制刻度</span></p>
<p class="MsoNormal" style="text-indent: 21.75pt"><span lang="EN-US">3 </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">根据实际数据在坐标轴上绘制数据标识</span></p>
<p class="MsoNormal" style="text-indent: 21.75pt"><span lang="EN-US">4 </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">绘制曲线，计算实际坐标与数轴坐标之间的转换</span></p>
<p class="MsoNormal" style="text-indent: 21.75pt"><span lang="EN-US">5 </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">响应各种鼠标事件</span></p>
<p class="MsoNormal" style="text-indent: 21.75pt"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现：</span></p>
<p class="MsoNormal" style="text-indent: 21.75pt"><span lang="EN-US">vs2005 +C# </span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">实现（包括</span><span lang="EN-US">winform</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">和</span><span lang="EN-US">webform</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">）两种控件</span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">注意问题：</span></p>
<p class="MsoNormal" style="margin-left: 34.5pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 34.5pt"><span lang="EN-US">1<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US">winform</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件问题需要解决闪烁问题，所以每次鼠标事件后都只重新绘制部分曲线或者坐标轴。背景上华坐标轴，</span><span lang="EN-US">pictureBox</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">上画曲线。</span></p>
<p class="MsoNormal" style="margin-left: 34.5pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 34.5pt"><span lang="EN-US">2<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">控件图标问题，添加</span><span lang="EN-US">16*16</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">象素</span><span lang="EN-US">bmp</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">格式图片，</span><span lang="EN-US">Build Action</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">设置为&#8220;</span><span lang="EN-US">Embedded Resource</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;</span><span lang="EN-US">,</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">曲线类头部引用为</span><span lang="EN-US"> </span></p>
<p class="MsoNormal" style="text-indent: 10.5pt; mso-char-indent-count: 1.0; mso-char-indent-size: 10.5pt"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8220;</span><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">[System.Drawing.<span style="color: teal">ToolboxBitmap</span>(<span style="color: blue">typeof</span>(hocylan_Curve.<span style="color: teal">Icon</span>), <span style="color: maroon">"UcDate.bmp"</span>)]</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">&#8221;</span></p>
<p class="MsoNormal" style="margin-left: 34.5pt; text-indent: -18pt; mso-list: l0 level1 lfo1; tab-stops: list 34.5pt"><span lang="EN-US">3<span style="font: 7pt 'Times New Roman'">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">部分变量定义和坐标转换：</span></p>
<p class="MsoNormal" style="margin-left: 34.5pt"><strong><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">坐标转换：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="margin-left: 34.5pt"><span lang="EN-US">float x,y</span><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">分别为鼠标在数轴上的实际值，返回该点对应坐标轴的值</span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 9pt; color: blue; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">private</span><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"> <span style="color: blue">string</span> TransPositionToValue(<span style="color: blue">float</span> x, <span style="color: blue">float</span> y)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">int</span> xPointIndex = <span style="color: teal">Convert</span>.ToInt32((x - XYO.X) / XSlice);//对应x轴的点号<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">string</span> xValue;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">float</span> yValue;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">try<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">if</span> (xPointIndex &lt; Keys.Length &amp;&amp; xPointIndex &gt; 0)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 90pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">xValue = Keys[xPointIndex];<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 90pt; text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">// Keys[xPointIndex];<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">else<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>xValue = <span style="color: maroon">"-"</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: green">//Y的实际值<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>yValue = ((XYO.Y - y) * YSliceValue) / YSlice + YSliceBegin;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</span><span style="color: blue">return</span> <span style="color: maroon">"("</span> + x.ToString() + <span style="color: maroon">","</span> + y.ToString() + <span style="color: maroon">"),("</span> + xValue.ToString() + <span style="color: maroon">","</span> + yValue.ToString(<span style="color: maroon">"#.##"</span>) + YUnit + <span style="color: maroon">")"</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">catch</span> (<span style="color: teal">Exception</span> ex)<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>{<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">return</span> <span style="color: maroon">"("</span> + x.ToString() + <span style="color: maroon">","</span> + y.ToString() + <span style="color: maroon">"),("</span> + ex.Message.ToString() + <span style="color: maroon">")"</span>;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}<o:p></o:p></span></p>
<p class="MsoNormal" style="margin-left: 16.5pt"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span>}</span></p>
<p class="MsoNormal" style="margin-left: 16.5pt"><strong><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">变量定义：</span><span lang="EN-US"><o:p></o:p></span></strong></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span><span lang="EN-US" style="font-size: 9pt; color: blue; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">private</span><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"> <span style="color: teal">Graphics</span> objGraphics; <span style="color: green">//Graphics 类提供将对象绘制到显示设备的方法<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Pen</span> pen1 = <span style="color: blue">new</span> <span style="color: teal">Pen</span>(<span style="color: teal">Color</span>.Red, 2);<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Point</span> XYO = <span style="color: blue">new</span> <span style="color: teal">Point</span>();<span style="color: green">//坐标原点<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Point</span> XZ = <span style="color: blue">new</span> <span style="color: teal">Point</span>(); <span style="color: green">//X轴终点<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Point</span> YZ = <span style="color: blue">new</span> <span style="color: teal">Point</span>(); <span style="color: green">//Y轴终点</span><o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Bitmap</span> objBitmap; <span style="color: green">//位图对象<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">int</span> m_Width = 624; <span style="color: green">//图像宽度<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">int</span> m_Height = 400; <span style="color: green">//图像高度<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">string</span> m_Title = <span style="color: maroon">"曲线图"</span>; <span style="color: green">//标题<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">float</span> m_XSlice; <span style="color: green">//X轴刻度宽度<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">float</span> m_YSlice; <span style="color: green">//Y轴刻度宽度<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;</span><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">int</span> xPointScaleNum = 15;<span style="color: green">//X轴点数(刻度数)<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">int</span> xInScaleNum = 1;<span style="color: green">//X轴大刻度间的小刻度<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">float</span> m_YSliceValue = 40; <span style="color: green">//Y轴刻度的数值宽度<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">float</span> m_YSliceBegin = 10; <span style="color: green">//Y轴刻度开始值<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">float</span> m_YSliceEnd = 200; <span style="color: green">//Y轴刻度最大值<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">int</span> yPointScaleNum;<span style="color: green">//Y轴大点数<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">int</span> m_YInSliceNum = 5; <span style="color: green">//Y轴刻度大刻度间的小刻度<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">float</span> m_Tension = 0.0f;<span style="color: green">//设置张力<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">string</span> m_yUnit = <span style="color: maroon">"KV"</span>; <span style="color: green">//单位<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">string</span> m_xUnit = <span style="color: maroon">""</span>; <span style="color: green">//单位<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; color: green; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">string</span> m_XAxisText = <span style="color: maroon">"X轴说明文字"</span>; <span style="color: green">//X轴说明文字<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; color: green; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">string</span> m_YAxisText = <span style="color: maroon">"Y轴说明文字"</span>; <span style="color: green">//Y轴说明文字<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; color: green; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">string</span>[] m_Keys = <span style="color: blue">new</span> <span style="color: blue">string</span>[] { <span style="color: maroon">"1"</span>, <span style="color: maroon">"2"</span>, <span style="color: maroon">"3"</span>, <span style="color: maroon">"4"</span>, <span style="color: maroon">"5"</span>, <span style="color: maroon">"6"</span>, <span style="color: maroon">"7"</span>, <span style="color: maroon">"8"</span>, <span style="color: maroon">"9"</span>, <span style="color: maroon">"10"</span>, <span style="color: maroon">"11"</span>, <span style="color: maroon">"12"</span>, <span style="color: maroon">"13"</span>, <span style="color: maroon">"14"</span>, <span style="color: maroon">"15"</span>, <span style="color: maroon">"16"</span>, <span style="color: maroon">"17"</span>, <span style="color: maroon">"18"</span>, <span style="color: maroon">"19"</span>, <span style="color: maroon">"20"</span>, <span style="color: maroon">"21"</span>, <span style="color: maroon">"22"</span>, <span style="color: maroon">"23"</span>, <span style="color: maroon">"24"</span>, <span style="color: maroon">"25"</span>, <span style="color: maroon">"26"</span>, <span style="color: maroon">"27"</span>, <span style="color: maroon">"28"</span>, <span style="color: maroon">"29"</span>, <span style="color: maroon">"30"</span>, <span style="color: maroon">"31"</span> }; <span style="color: green">//键 <o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: blue">float</span>[][] m_LineValue;<span style="color: green">//=new float[]{{120.5f, 23.0f, 23.90f, 0f, 22f, 100f },{ 20.5f, 123.0f, 3.90f, 92f, 122f, 190f },{200.5f, 123.0f, 90.90f, 100f, 0f, 50f }, };<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span>[] lineColor = <span style="color: blue">new</span> <span style="color: teal">Color</span>[] { <span style="color: teal">Color</span>.Yellow, <span style="color: teal">Color</span>.Red, <span style="color: teal">Color</span>.White, <span style="color: teal">Color</span>.Green, <span style="color: teal">Color</span>.Orange, <span style="color: teal">Color</span>.BlueViolet };<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_BgColor = <span style="color: teal">Color</span>.DeepSkyBlue; <span style="color: green">//背景<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_TextColor = <span style="color: teal">Color</span>.Black; <span style="color: green">//文字颜色<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_BorderColor = <span style="color: teal">Color</span>.Black; <span style="color: green">//整体边框颜色<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_AxisColor = <span style="color: teal">Color</span>.Blue; <span style="color: green">//轴线颜色<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_GriddingColor = <span style="color: teal">Color</span>.Blue; <span style="color: green">//轴线颜色<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_AxisTextColor = <span style="color: teal">Color</span>.Black; <span style="color: green">//轴说明文字颜色<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_SliceTextColor = <span style="color: teal">Color</span>.Black; <span style="color: green">//刻度文字颜色<o:p></o:p></span></span></p>
<p class="MsoNormal" style="text-align: left; mso-layout-grid-align: none" align="left"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_SliceColor = <span style="color: teal">Color</span>.Black; <span style="color: green">//刻度颜色<o:p></o:p></span></span></p>
<p class="MsoNormal" style="margin-left: 16.5pt"><span lang="EN-US" style="font-size: 9pt; font-family: 新宋体; mso-font-kerning: 0pt; mso-hansi-font-family: 'Times New Roman'"><span style="mso-spacerun: yes">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; </span><span style="color: blue">private</span> <span style="color: teal">Color</span> m_CurveColor = <span style="color: teal">Color</span>.Red; <span style="color: green">//曲线颜色</span></span></p>
<p class="MsoNormal" style="text-indent: 10.5pt; mso-char-indent-count: 1.0; mso-char-indent-size: 10.5pt"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal"><span style="color: #ff6600; font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'">代码和资源：</span><span lang="EN-US" style="color: #ff6600"><o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 10.5pt; mso-char-indent-count: 1.0; mso-char-indent-size: 10.5pt"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<table style="border-right: medium none; border-top: medium none; margin-left: 16.5pt; border-left: medium none; border-bottom: medium none; border-collapse: collapse; mso-border-alt: solid windowtext .5pt; mso-padding-alt: 0cm 5.4pt 0cm 5.4pt" cellspacing="0" cellpadding="0" border="1">
    <tr style="height: 15.05pt">
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 0.5pt solid; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.05pt" valign="top" width="175">
            <p class="MsoNormal"><span lang="EN-US"><span style="font-size: 10pt">winform</span></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.05pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 10pt"><a href="http://files.cnblogs.com/hocylan/hocylan_Curve.rar">Download</a>控件源码</span></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: windowtext 0.5pt solid; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.05pt; mso-border-left-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 10pt"><a href="http://files.cnblogs.com/hocylan/testusercontrol.rar">简单例子</a></span></span></p>
            </td>
        </tr>
        <tr style="height: 15.8pt">
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 0.5pt solid; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span lang="EN-US"><span style="font-size: 10pt">webForm</span></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 8pt"><span style="font-size: 10pt"><a href="http://files.cnblogs.com/hocylan/hocyWebControl.rar">Download</a>控件源码</span></span></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal"><span style="font-family: 宋体; mso-ascii-font-family: 'Times New Roman'; mso-hansi-font-family: 'Times New Roman'"><span style="font-size: 8pt"><span style="font-size: 10pt"><a href="http://files.cnblogs.com/hocylan/webControltest1.rar">简单例子</a></span></span></span></p>
            </td>
        </tr>
        <tr style="height: 15.8pt">
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: windowtext 0.5pt solid; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal">&nbsp;<span lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal">&nbsp;<span lang="EN-US"><o:p></o:p></span></p>
            </td>
            <td style="border-right: windowtext 0.5pt solid; padding-right: 5.4pt; border-top: medium none; padding-left: 5.4pt; padding-bottom: 0cm; border-left: medium none; width: 131.35pt; padding-top: 0cm; border-bottom: windowtext 0.5pt solid; height: 15.8pt; mso-border-left-alt: solid windowtext .5pt; mso-border-top-alt: solid windowtext .5pt" valign="top" width="175">
            <p class="MsoNormal">&nbsp;<span lang="EN-US"><o:p></o:p></span></p>
            </td>
        </tr>
    </table>
<p class="MsoNormal" style="text-indent: 10.5pt; mso-char-indent-count: 1.0; mso-char-indent-size: 10.5pt"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp;&nbsp; </span></span></p>
<p class="MsoNormal" style="margin-left: 16.5pt"><span lang="EN-US"><span style="mso-spacerun: yes">&nbsp; </span></span></p>
<p class="MsoNormal"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: 21.75pt"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<p class="MsoNormal" style="text-indent: -27pt; mso-char-indent-count: -2.57; mso-char-indent-size: 10.5pt"><span lang="EN-US">&nbsp;<o:p></o:p></span></p>
<img src ="http://www.cnblogs.com/hocylan/aggbug/1250199.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42950/" target="_blank">[新闻]Google开拓美政府机构市场 微软业务受冲击</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>使用SerialPort类设计串口通讯程序 (VS2005)[转载]</title><link>http://www.cnblogs.com/hocylan/archive/2008/03/13/1103624.html</link><dc:creator>蓝天旭日</dc:creator><author>蓝天旭日</author><pubDate>Thu, 13 Mar 2008 05:51:00 GMT</pubDate><guid>http://www.cnblogs.com/hocylan/archive/2008/03/13/1103624.html</guid><wfw:comment>http://www.cnblogs.com/hocylan/comments/1103624.html</wfw:comment><comments>http://www.cnblogs.com/hocylan/archive/2008/03/13/1103624.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/hocylan/comments/commentRss/1103624.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hocylan/services/trackbacks/1103624.html</trackback:ping><description><![CDATA[<span style="font-size: 12pt; line-height: 150%">一．<strong>概述</strong></span>
<div style="text-indent: 41.05pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">在</span><span style="font-size: 12pt; line-height: 150%">Visual Studio 6.0</span><span style="font-size: 12pt; line-height: 150%">中编写串口通讯程序，一般都使用</span><span style="font-size: 12pt; line-height: 150%">Microsoft&nbsp;Communication&nbsp;Control</span><span style="font-size: 12pt; line-height: 150%">（简称</span><span style="font-size: 12pt; color: black; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">）的通讯控件，只要通</span>&nbsp;<span style="font-size: 12pt; line-height: 150%">过对此控件的属性和事件进行相应编程操作，就可以轻松地实现串口通讯。但在</span><span style="font-size: 12pt; line-height: 150%">Microsoft.Net</span><span style="font-size: 12pt; line-height: 150%">技术广泛应用的今天，</span><span style="font-size: 12pt; line-height: 150%">Visual Studio.Net</span><span style="font-size: 12pt; line-height: 150%">没有将此控件加入控件库，所以人们采用了许多方法在</span><span style="font-size: 12pt; line-height: 150%">Visual Studio.Net</span><span style="font-size: 12pt; line-height: 150%">来编写串口通讯程序：</span><span style="font-size: 12pt; color: black; line-height: 150%">第一种方法是通过采用</span><span style="font-size: 12pt; line-height: 150%">Visual Studio 6.0</span><span style="font-size: 12pt; line-height: 150%">中原来的</span><span style="font-size: 12pt; color: black; line-height: 150%">MSComm</span><span style="font-size: 12pt; color: black; line-height: 150%">控件这是最简单的，最方便的方法，但需要注册；第二种方法是采用微软在</span><span style="font-size: 12pt; color: black; line-height: 150%">.NET</span><span style="font-size: 12pt; color: black; line-height: 150%">推出了一个串口控件，基于</span><span style="font-size: 12pt; color: black; line-height: 150%">.NET</span><span style="font-size: 12pt; color: black; line-height: 150%">的</span><span style="font-size: 12pt; color: black; line-height: 150%">P/Invoke</span><span style="font-size: 12pt; color: black; line-height: 150%">调用方法实现；第三种方法是自己用</span><span style="font-size: 12pt; color: black; line-height: 150%">API</span><span style="font-size: 12pt; color: black; line-height: 150%">写串口通信，虽然难度高，但可以方便实现自己想要的各种功能。</span></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">现在微软推出了最新版本的</span><span style="font-size: 12pt; line-height: 150%">Visual Studio 2005</span><span style="font-size: 12pt; line-height: 150%">开发工具，可以不再采用第三方控件的方法来设计串口通讯程序。</span><span style="font-size: 12pt; line-height: 150%">NET Framework 2.0 </span><span style="font-size: 12pt; line-height: 150%">类库包含了</span><span style="font-size: 12pt; line-height: 150%">SerialPort </span><span style="font-size: 12pt; line-height: 150%">类</span><span style="font-size: 12pt; line-height: 150%">,</span><span style="font-size: 12pt; line-height: 150%">方便地实现了所需要串口通讯的多种功能，为了使</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">编程方法快速转换到以</span><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类为核心的串口通讯的设计方法，本文着重讨论了</span><span style="font-size: 12pt; line-height: 150%">Visual Studio 6.0</span><span style="font-size: 12pt; line-height: 150%">的</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">控件和</span><span style="font-size: 12pt; line-height: 150%">SerialPort </span><span style="font-size: 12pt; line-height: 150%">类设计方法的异同点。</span></div>
<div style="text-indent: 30.85pt; line-height: 150%">&nbsp;</div>
<div style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%">二．</span><strong><span style="font-size: 12pt; line-height: 150%">SerialPort</span></strong><strong><span style="font-size: 12pt; line-height: 150%">常用属性、方法和事件</span></strong></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">1</span><span style="font-size: 12pt; line-height: 150%">．命名空间</span></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">System.IO.Ports</span><span style="font-size: 12pt; line-height: 150%">命名空间包含了控制串口重要的</span><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类，该类提供了</span><span style="font-size: 12pt; color: black; line-height: 150%">同步</span><span style="font-size: 12pt; color: black; line-height: 150%"> I/O </span><span style="font-size: 12pt; color: black; line-height: 150%">和事件驱动的</span><span style="font-size: 12pt; color: black; line-height: 150%"> I/O</span><span style="font-size: 12pt; color: black; line-height: 150%">、对管脚和中断状态的访问以及对串行驱动程序属性的访问，所以在程序代码起始位置需加入</span><span style="font-size: 12pt; color: black; line-height: 150%">Using System.IO.Ports</span><span style="font-size: 12pt; color: black; line-height: 150%">。</span></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">2</span><span style="font-size: 12pt; color: black; line-height: 150%">．串口的通讯参数</span></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">串口通讯最常用的参数就是</span><span style="font-size: 12pt; line-height: 150%">通讯端口号<span style="color: black">及通讯格式</span></span><span style="font-size: 12pt; color: black; line-height: 150%">(</span><span style="font-size: 12pt; color: black; line-height: 150%">波特率、数据位、停止位和校验位</span><span style="font-size: 12pt; color: black; line-height: 150%">)</span><span style="font-size: 12pt; color: black; line-height: 150%">，在</span><span style="font-size: 12pt; color: black; line-height: 150%">MSComm</span><span style="font-size: 12pt; color: black; line-height: 150%">中相关的属性是</span><span style="font-size: 12pt; line-height: 150%">CommPort</span><span style="font-size: 12pt; line-height: 150%">和</span><span style="font-size: 12pt; line-height: 150%">Settings</span><span style="font-size: 12pt; line-height: 150%">。</span><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类与</span><span style="font-size: 12pt; color: black; line-height: 150%">MSComm</span><span style="font-size: 12pt; color: black; line-height: 150%">有一些区别</span><span style="font-size: 12pt; color: black; line-height: 150%">:</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">a.</span><span style="font-size: 12pt; line-height: 150%">通讯端口号</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">[PortName]</span><span style="font-size: 12pt; line-height: 150%">属性</span><span style="font-size: 12pt; color: black; line-height: 150%">获取或设置通信端口，包括但不限于所有可用的</span><span style="font-size: 12pt; color: black; line-height: 150%"> COM </span><span style="font-size: 12pt; color: black; line-height: 150%">端口，请注意该属性返回类型为</span><span style="font-size: 12pt; color: black; line-height: 150%">String</span><span style="font-size: 12pt; color: black; line-height: 150%">，不是</span><span style="font-size: 12pt; color: black; line-height: 150%">Mscomm.CommPort</span><span style="font-size: 12pt; color: black; line-height: 150%">的</span><span style="font-size: 12pt; color: black; line-height: 150%">short</span><span style="font-size: 12pt; color: black; line-height: 150%">类型。通常情况下，</span><span style="font-size: 12pt; color: black; line-height: 150%">PortName</span><span style="font-size: 12pt; color: black; line-height: 150%">正常返回的值为</span><span style="font-size: 12pt; color: black; line-height: 150%">COM1</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">COM2</span><span style="font-size: 12pt; color: black; line-height: 150%">&#8230;&#8230;，</span><span style="font-size: 12pt; color: black; line-height: 150%">SerialPort</span><span style="font-size: 12pt; color: black; line-height: 150%">类最大支持的端口数突破了</span><span style="font-size: 12pt; color: black; line-height: 150%">CommPort</span><span style="font-size: 12pt; color: black; line-height: 150%">控件中</span><span style="font-size: 12pt; color: black; line-height: 150%">CommPort</span><span style="font-size: 12pt; color: black; line-height: 150%">属性不能超过</span><span style="font-size: 12pt; color: black; line-height: 150%">16</span><span style="font-size: 12pt; color: black; line-height: 150%">的限止，大大方便了用户串口设备的配置。</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">b. </span><span style="font-size: 12pt; color: black; line-height: 150%">通讯格式</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">SerialPort</span><span style="font-size: 12pt; color: black; line-height: 150%">类对分别用</span><span style="font-size: 12pt; color: black; line-height: 150%">[BaudRate]</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">[Parity]</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">[DataBits]</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">[StopBits]</span><span style="font-size: 12pt; color: black; line-height: 150%">属性设置通讯格式中的波特率、数据位、停止位和校验位，其中</span><span style="font-size: 12pt; color: black; line-height: 150%">[Parity]</span><span style="font-size: 12pt; color: black; line-height: 150%">和</span><span style="font-size: 12pt; color: black; line-height: 150%">[StopBits]</span><span style="font-size: 12pt; color: black; line-height: 150%">分别是枚举类型</span><span style="font-size: 12pt; color: black; line-height: 150%">Parity</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">StopBits</span><span style="font-size: 12pt; color: black; line-height: 150%">，</span><span style="font-size: 12pt; color: black; line-height: 150%">Parity</span><span style="font-size: 12pt; color: black; line-height: 150%">类型中枚举了</span><span style="font-size: 12pt; color: black; line-height: 150%">Odd(</span><span style="font-size: 12pt; color: black; line-height: 150%">奇</span><span style="font-size: 12pt; color: black; line-height: 150%">)</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">Even(</span><span style="font-size: 12pt; color: black; line-height: 150%">偶</span><span style="font-size: 12pt; color: black; line-height: 150%">)</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">Mark</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">None</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">Space</span><span style="font-size: 12pt; color: black; line-height: 150%">，</span><span style="font-size: 12pt; color: black; line-height: 150%">Parity</span><span style="font-size: 12pt; color: black; line-height: 150%">枚举了</span><span style="font-size: 12pt; color: black; line-height: 150%">None</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">One</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">OnePointFive</span><span style="font-size: 12pt; color: black; line-height: 150%">、</span><span style="font-size: 12pt; color: black; line-height: 150%">Two</span><span style="font-size: 12pt; color: black; line-height: 150%">。</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类提供了七个重载的构造函数，既</span><span style="font-size: 12pt; color: black; line-height: 150%">可以对已经实例化的</span><span style="font-size: 12pt; color: black; line-height: 150%">SerialPort</span><span style="font-size: 12pt; color: black; line-height: 150%">对象设置上述相关</span><span style="font-size: 12pt; line-height: 150%">属性的值，也可以</span><span style="font-size: 12pt; color: black; line-height: 150%">使用指定的端口名称、波特率和奇偶校验位数据位和停止位直接初始化</span><span style="font-size: 12pt; color: black; line-height: 150%"> SerialPort </span><span style="font-size: 12pt; color: black; line-height: 150%">类的新实例。</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">3</span><span style="font-size: 12pt; color: black; line-height: 150%">．串口的打开和关闭</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类没有采用</span><span style="font-size: 12pt; line-height: 150%">MSComm.PortOpen=True/False</span><span style="font-size: 12pt; line-height: 150%">设置属性值打开关闭串口，相应的是调用类的</span><span style="font-size: 12pt; line-height: 150%">Open()</span><span style="font-size: 12pt; line-height: 150%">和</span><span style="font-size: 12pt; line-height: 150%">Close()</span><span style="font-size: 12pt; line-height: 150%">方法。</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">4. </span><span style="font-size: 12pt; color: black; line-height: 150%">数据的发送和读取</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">Serial</span><span style="font-size: 12pt; color: black; line-height: 150%">类调用重载的</span><span style="font-size: 12pt; color: black; line-height: 150%">Write</span><span style="font-size: 12pt; color: black; line-height: 150%">和</span><span style="font-size: 12pt; color: black; line-height: 150%">WriteLine</span><span style="font-size: 12pt; color: black; line-height: 150%">方法发送数据，其中</span><span style="font-size: 12pt; color: black; line-height: 150%">WriteLine</span><span style="font-size: 12pt; color: black; line-height: 150%">可发送字符串并在字符串末尾加入换行符，读取串口缓冲区的方法有许多，其中除了</span><span style="font-size: 12pt; line-height: 150%">ReadExisting</span><span style="font-size: 12pt; line-height: 150%">和ReadTo,其余的方法都是同步调用，线程被阻塞直到缓冲区有相应的数据或大于ReadTimeOut属性设定的时间值后，引发ReadExisting异常。</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">5.DataReceived</span><span style="font-size: 12pt; line-height: 150%">事件</span></div>
<div style="text-indent: 27pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">该事件类似于</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">控件中的</span><span style="font-size: 12pt; line-height: 150%">OnComm</span><span style="font-size: 12pt; line-height: 150%">事件，</span><span style="font-size: 12pt; line-height: 150%">DataReceived</span><span style="font-size: 12pt; line-height: 150%">事件在</span><span style="font-size: 12pt; color: black; line-height: 150%">接收到了</span><span style="font-size: 12pt; color: black; line-height: 150%">[ReceivedBytesThreshold]</span><span style="font-size: 12pt; line-height: 150%">设置的<span style="color: black">字符个数或接收到了文件结束字符并将其放入了输入缓冲区时被触发。其中</span></span><span style="font-size: 12pt; color: black; line-height: 150%">[</span><span style="font-size: 12pt; line-height: 150%"><a href="ms-help://MS.VSCC.v80/MS.MSDN.v80/MS.NETDEVFX.v20.chs/cpref8/html/P_System_IO_Ports_SerialPort_ReceivedBytesThreshold.htm"><span style="color: windowtext; text-decoration: none; text-underline: none">ReceivedBytesThreshold</span></a>]</span><span style="font-size: 12pt; line-height: 150%">相当于</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">控件的</span><span style="font-size: 12pt; line-height: 150%">[Rthreshold]</span><span style="font-size: 12pt; line-height: 150%">属性，该事件的用法与</span><span style="font-size: 12pt; line-height: 150%">MsComm</span><span style="font-size: 12pt; line-height: 150%">控件的</span><span style="font-size: 12pt; line-height: 150%">OnComm</span><span style="font-size: 12pt; line-height: 150%">事件在</span><span style="font-size: 12pt; line-height: 150%">CommEvent</span><span style="font-size: 12pt; line-height: 150%">为</span><strong><span style="font-size: 12pt; line-height: 150%">comEvSend</span></strong><span style="font-size: 12pt; line-height: 150%">和<strong>comEvEof</strong>时是一致的。<span>&nbsp;&nbsp; </span></span></div>
<div style="text-indent: 30.85pt; line-height: 150%">&nbsp;</div>
<div style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%">三．</span><strong><span style="font-size: 12pt; line-height: 150%">SerialPort</span></strong><strong><span style="font-size: 12pt; line-height: 150%">的使用</span></strong></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">对于熟悉</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">控件的程序设计者，</span><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类是相当容易上手的。在进行串口通讯时，一般的流程是设置</span><span style="font-size: 12pt; line-height: 150%">通讯端口号<span style="color: black">及波特率、数据位、停止位和校验位，再打开端口连接，发送数据，接收数据，最后关闭端口连接这样几个步骤。</span></span></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; color: black; line-height: 150%">数据接收的设计方法在这里比较重要，采用轮询的方法比较浪费时间，在</span><span style="font-size: 12pt; color: black; line-height: 150%">Visual Basic</span><span style="font-size: 12pt; color: black; line-height: 150%">中的延时方法中一般会调用</span><span style="font-size: 12pt; color: black; line-height: 150%">API</span><span style="font-size: 12pt; color: black; line-height: 150%">并用</span><span style="font-size: 12pt; color: black; line-height: 150%">DOEvents</span><span style="font-size: 12pt; color: black; line-height: 150%">方法来处理，但程序不易控制，建议采用</span><span style="font-size: 12pt; line-height: 150%">DataReceived</span><span style="font-size: 12pt; color: black; line-height: 150%">事件触发的方法，合理的设置</span><span style="font-size: 12pt; color: black; line-height: 150%">ReceivedBytesThreshold</span><span style="font-size: 12pt; color: black; line-height: 150%">的值，若接收的是定长的数据，则将</span><span style="font-size: 12pt; color: black; line-height: 150%">ReceivedBytesThreshold</span><span style="font-size: 12pt; color: black; line-height: 150%">设为接收数据的长度，若接收数据的结尾是固定的字符或字符串则可采用</span><span style="font-size: 12pt; line-height: 150%">ReadTo</span><span style="font-size: 12pt; line-height: 150%">的方法或在</span><span style="font-size: 12pt; line-height: 150%">DataReceived</span><span style="font-size: 12pt; color: black; line-height: 150%">事件中判断接收的字符是否满足条件</span><span style="font-size: 12pt; line-height: 150%">。</span></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类读取数据的许多方法是同步阻塞调用，尽量避免在主线程中调用，可以使用异步处理或线程间处理调用这些读取数据的方法。</span></div>
<div style="text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">由于</span><span style="font-size: 12pt; line-height: 150%">DataReceived</span><span style="font-size: 12pt; line-height: 150%">事件在辅线程被引发，当收到完整的一条数据，返回主线程处理或在窗体上显示时，请注意跨线程的处理，</span><span style="font-size: 12pt; line-height: 150%">C#</span><span style="font-size: 12pt; line-height: 150%">可采用控件异步委托的方法</span><span style="font-size: 12pt; line-height: 150%">Control.BeginInvoke</span><span style="font-size: 12pt; line-height: 150%">及同步委托的方法</span><span style="font-size: 12pt; line-height: 150%">Invoke</span><span style="font-size: 12pt; line-height: 150%">。</span></div>
<div style="text-indent: 30.85pt; line-height: 150%">&nbsp;</div>
<div style="line-height: 150%"><span style="font-size: 12pt; line-height: 150%">四．<strong>结束语</strong></span></div>
<div style="layout-grid-mode: char; text-indent: 30.85pt; line-height: 150%"><span style="font-size: 12pt; line-height: 150%">在</span><span style="font-size: 12pt; line-height: 150%">.NET</span><span style="font-size: 12pt; line-height: 150%">平台下熟练使用</span><span style="font-size: 12pt; line-height: 150%">SerialPort </span><span style="font-size: 12pt; line-height: 150%">类，可以很好地开发出串口通讯类程序，对于过去使用</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">控件设计了一些通讯程序，也可以将</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">控件替换为</span><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类，当然为了避免对以前的项目做大的改动，可以使用</span><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类设计一些与</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">控件具有相同接口的类，在今后工业控制中，</span><span style="font-size: 12pt; line-height: 150%">SerialPort</span><span style="font-size: 12pt; line-height: 150%">类将广泛地应用于串口通讯程序的设计中，发挥着与</span><span style="font-size: 12pt; line-height: 150%">MSComm</span><span style="font-size: 12pt; line-height: 150%">控件一样的作用。</span></div>
<br />
<br />
<p id="TBPingURL">Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1113760</p>
<img src ="http://www.cnblogs.com/hocylan/aggbug/1103624.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42949/" target="_blank">[新闻]消息称苹果正在开发iTunes网络电视</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>文件复制管理</title><link>http://www.cnblogs.com/hocylan/archive/2008/03/12/1102354.html</link><dc:creator>蓝天旭日</dc:creator><author>蓝天旭日</author><pubDate>Wed, 12 Mar 2008 08:24:00 GMT</pubDate><guid>http://www.cnblogs.com/hocylan/archive/2008/03/12/1102354.html</guid><wfw:comment>http://www.cnblogs.com/hocylan/comments/1102354.html</wfw:comment><comments>http://www.cnblogs.com/hocylan/archive/2008/03/12/1102354.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/hocylan/comments/commentRss/1102354.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hocylan/services/trackbacks/1102354.html</trackback:ping><description><![CDATA[摘要:  问题:复制文件夹的时候,只需要覆盖修改过的文件即可,其他同名文件可以直接跳过,但是计算机总是问是否全部覆盖或者全部取消.全部覆盖浪费太多时间,全部取消则达不到我们的要求. 解决:文件复制管理1 选择源文件和目标文件2 碰到同目录同文件时,自动检查最后修改日期,不同则直接覆盖,相同则跳过3 自动遍历所有子文件夹或者文件方法:1 建立源文件树(treeview1) 源文件和目标文件树(treevie&nbsp;&nbsp;<a href='http://www.cnblogs.com/hocylan/archive/2008/03/12/1102354.html'>阅读全文</a><img src ="http://www.cnblogs.com/hocylan/aggbug/1102354.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42948/" target="_blank">[新闻]微软周一开电话会议 预计将发布Silverlight2.0</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>ARM7在嵌入式应用中启动程序的实现</title><link>http://www.cnblogs.com/hocylan/articles/1089981.html</link><dc:creator>蓝天旭日</dc:creator><author>蓝天旭日</author><pubDate>Tue, 04 Mar 2008 04:07:00 GMT</pubDate><guid>http://www.cnblogs.com/hocylan/articles/1089981.html</guid><wfw:comment>http://www.cnblogs.com/hocylan/comments/1089981.html</wfw:comment><comments>http://www.cnblogs.com/hocylan/articles/1089981.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/hocylan/comments/commentRss/1089981.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hocylan/services/trackbacks/1089981.html</trackback:ping><description><![CDATA[&nbsp;
<p><span style="font-size: 9pt; font-family: 宋体">王京林</span><span style="font-size: 9pt; font-family: 宋体">岳春生</span><span style="font-size: 9pt; font-family: 宋体">张海英</span><span style="font-size: 9pt">(</span><span style="font-size: 9pt; font-family: 宋体">解放军信息工程大学</span><span style="font-size: 9pt">)</span></p>
<p><span style="font-size: 9pt">&nbsp;</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">【摘要】</span><span style="font-size: 9pt; font-family: 宋体">本文给出了基于</span><span style="font-size: 9pt">ARM7</span><span style="font-size: 9pt; font-family: 宋体">嵌入式系统的启动程序的实现流程</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">并针对存储器控制单元的使用以及目标文件的分布装载等技术难点进行详细分析。</span></p>
<p><span style="font-size: 9pt">&nbsp;</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">【关键词】嵌入式系统、启动程序、</span><span style="font-size: 9pt">ARM7 </span></p>
<p><span style="font-size: 9pt; font-family: 宋体">　</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">嵌入式系统被定义为：以应用为中心、以计算机技术为基础、软件硬件可裁剪、适应应用系统对功能、可靠性、成本、体积、功耗严格要求的专用计算机系统。嵌入式系统的核心部件是各种类型的嵌入式处理器，随着嵌入式系统不断深入到人们生活中的各个领域，嵌入式处理器得到前所未有的飞速发展。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">典型的</span><span style="font-size: 9pt">32</span><span style="font-size: 9pt; font-family: 宋体">位</span><span style="font-size: 9pt">RISC</span><span style="font-size: 9pt; font-family: 宋体">芯片──</span><span style="font-size: 9pt">ARM</span><span style="font-size: 9pt; font-family: 宋体">处理器</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">不论是在</span><span style="font-size: 9pt">PDA,STB,DVD</span><span style="font-size: 9pt; font-family: 宋体">等消费类电子产品中</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">还是在</span><span style="font-size: 9pt">GPS,</span><span style="font-size: 9pt; font-family: 宋体">航空</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">勘探</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">测量等军方产品中都得到了广泛的应用。越来越多的芯片厂商早已看好</span><span style="font-size: 9pt">ARM</span><span style="font-size: 9pt; font-family: 宋体">的前景，如</span><span style="font-size: 9pt">Intel</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">NS</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">Ateml</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">Philips</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">NEC</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">CirrusLogic</span><span style="font-size: 9pt; font-family: 宋体">等公司都有相应的产品。在</span><span style="font-size: 9pt">1999</span><span style="font-size: 9pt; font-family: 宋体">年，</span><span style="font-size: 9pt">ARM</span><span style="font-size: 9pt; font-family: 宋体">突破</span><span style="font-size: 9pt">1.5</span><span style="font-size: 9pt; font-family: 宋体">亿个，市场份额超过了</span><span style="font-size: 9pt">50%</span><span style="font-size: 9pt; font-family: 宋体">，已经成为业界的龙头。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">在我们研制开发基于</span><span style="font-size: 9pt">ARM7</span><span style="font-size: 9pt; font-family: 宋体">的嵌入式系统过程中，发现技术难点主要在于系统启动程序的编写，为此本文详细论述了在</span><span style="font-size: 9pt">ARM7</span><span style="font-size: 9pt; font-family: 宋体">基础上开发嵌入式系统时启动程序的实现。</span></p>
<p><span style="font-size: 9pt">1.</span><span style="font-size: 9pt; font-family: 宋体">启动程序流程</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">嵌入式系统的资源有限</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">程序通常都是固化在</span><span style="font-size: 9pt">ROM</span><span style="font-size: 9pt; font-family: 宋体">中运行。</span><span style="font-size: 9pt">ROM</span><span style="font-size: 9pt; font-family: 宋体">中程序执行前，需要对系统硬件和软件运行环境进行初始化，这些工作由用汇编语言编写的启动程序完成。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">启动程序是嵌入式程序的开头部分，应与应用程序一起固化在</span><span style="font-size: 9pt">ROM</span><span style="font-size: 9pt; font-family: 宋体">中，并首先在系统上运行。它应包含进各模块中可能出现的所有段类，并合理安排它们的次序。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">写好启动程序是设计好嵌入式程序的关键</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">系统启动程序所执行的操作依赖于正在开发其软件的系统，一般流程如下</span><span style="font-size: 9pt">:</span></p>
<p><span style="font-size: 9pt">2</span><span style="font-size: 9pt; font-family: 宋体">．详细步骤</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">⑴设置入口指针</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">启动程序首先必须定义入口指针，而且整个应用程序只有一个入口指针。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">设置中断向量</span></p>
<p><span style="font-size: 9pt">ARM7</span><span style="font-size: 9pt; font-family: 宋体">要求中断向量表必须设置在从</span><span style="font-size: 9pt">0</span><span style="font-size: 9pt; font-family: 宋体">地址开始，连续</span><span style="font-size: 9pt">8</span><span style="font-size: 9pt; font-family: 宋体">&#215;</span><span style="font-size: 9pt">4</span><span style="font-size: 9pt; font-family: 宋体">字节的空间，分别是复位、未定义指令错误、软件中断、预取指令错误、数据存取错误、</span><span style="font-size: 9pt">IRQ</span><span style="font-size: 9pt; font-family: 宋体">、</span><span style="font-size: 9pt">FIQ</span><span style="font-size: 9pt; font-family: 宋体">和一个保留的中断向量。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">如果</span><span style="font-size: 9pt">ROM</span><span style="font-size: 9pt; font-family: 宋体">定位于</span><span style="font-size: 9pt">0</span><span style="font-size: 9pt; font-family: 宋体">地址，向量表包含一系列指令跳转到中断服务程序，否则向量必须被动态初始化。可以在启动程序中添加一段代码，使其在运行时将向量表拷贝到</span><span style="font-size: 9pt">0</span><span style="font-size: 9pt; font-family: 宋体">地址开始的存储器空间。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">对于各未用中断，使其指向一个只含返回指令的哑函数，以防止错误中断引起系统的混乱。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">初始化堆栈和寄存器</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">系统堆栈初始化取决于用户使用了哪些中断，以及系统需要处理哪些错误类型。一般来说管理者堆栈必须设置，如果使用了</span><span style="font-size: 9pt">IRQ</span><span style="font-size: 9pt; font-family: 宋体">中断，则</span><span style="font-size: 9pt">IRQ</span><span style="font-size: 9pt; font-family: 宋体">堆栈也必须设置。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">如果系统使用了</span><span style="font-size: 9pt">DRAM</span><span style="font-size: 9pt; font-family: 宋体">或其它外设，需要设置相关的寄存器，以确定其刷新频率，数据总线宽度等信息。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">初始化存储器系统</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">　</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">有些芯片可通过寄存器编程初始化存储器系统，而对于较复杂系统通常集成有</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">来管理内存空间。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">⑸</span><span style="font-size: 9pt; font-family: 宋体">如有必要改变处理器模式、状态</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">　</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">如果系统应用程序是运行在用户模式下，可在此处将系统改为用户模式并初始化用户堆栈指针。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">初始化</span><span style="font-size: 9pt">C</span><span style="font-size: 9pt; font-family: 宋体">语言所需的存储器空间。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">为正确运行应用程序，在初始化期间应将系统需要读写的数据和变量从</span><span style="font-size: 9pt">ROM</span><span style="font-size: 9pt; font-family: 宋体">拷贝到</span><span style="font-size: 9pt">RAM</span><span style="font-size: 9pt; font-family: 宋体">里；一些要求快速响应的程序，如中断处理程序，也需要在</span><span style="font-size: 9pt">RAM</span><span style="font-size: 9pt; font-family: 宋体">中运行；如果使用</span><span style="font-size: 9pt">FLASH</span><span style="font-size: 9pt; font-family: 宋体">，对</span><span style="font-size: 9pt">FLASH</span><span style="font-size: 9pt; font-family: 宋体">的擦除和写入操作也一定要在</span><span style="font-size: 9pt">RAM</span><span style="font-size: 9pt; font-family: 宋体">里运行。</span><span style="font-size: 9pt">ARM</span><span style="font-size: 9pt; font-family: 宋体">公司软件开发工具包中的链接器提供了分布装载功能，可以实现这一目的。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">呼叫</span><span style="font-size: 9pt">C</span><span style="font-size: 9pt; font-family: 宋体">程序。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">　</span></p>
<p><span style="font-size: 9pt">ARM</span><span style="font-size: 9pt; font-family: 宋体">有两种指令集</span><span style="font-size: 9pt">:16</span><span style="font-size: 9pt; font-family: 宋体">位</span><span style="font-size: 9pt">THUMB</span><span style="font-size: 9pt; font-family: 宋体">指令集和</span><span style="font-size: 9pt">32</span><span style="font-size: 9pt; font-family: 宋体">位</span><span style="font-size: 9pt">ARM</span><span style="font-size: 9pt; font-family: 宋体">指令集。使用</span><span style="font-size: 9pt">16</span><span style="font-size: 9pt; font-family: 宋体">位的存储器可以降低成本，</span><span style="font-size: 9pt; font-family: 宋体">在这种情况下，</span><span style="font-size: 9pt">Thumb</span><span style="font-size: 9pt; font-family: 宋体">指令集的整体执行速度比</span><span style="font-size: 9pt">ARM 32</span><span style="font-size: 9pt; font-family: 宋体">位指令集快，而且提高了代码密度，所以一般用</span><span style="font-size: 9pt">Thumb</span><span style="font-size: 9pt; font-family: 宋体">编译器将</span><span style="font-size: 9pt">C</span><span style="font-size: 9pt; font-family: 宋体">语言程序编译成</span><span style="font-size: 9pt">16</span><span style="font-size: 9pt; font-family: 宋体">位的代码。</span><span style="font-size: 9pt; font-family: 宋体">处理器一开始总在</span><span style="font-size: 9pt">arm</span><span style="font-size: 9pt; font-family: 宋体">状态，可使用</span><span style="font-size: 9pt">BX</span><span style="font-size: 9pt; font-family: 宋体">指令转换到</span><span style="font-size: 9pt">thumb</span><span style="font-size: 9pt; font-family: 宋体">状态呼叫</span><span style="font-size: 9pt">C</span><span style="font-size: 9pt; font-family: 宋体">程序。要注意的是用Ｃ语言编写嵌入式程序时，要避免使用不能被固化到ＲＯＭ中的库函数。</span></p>
<p><span style="font-size: 9pt">3</span><span style="font-size: 9pt; font-family: 宋体">．技术难点分析</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">⑴</span><span style="font-size: 9pt">.MMU</span><span style="font-size: 9pt; font-family: 宋体">的使用</span></p>
<p><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">是存储器管理单元的缩写，是用来管理虚拟内存系统的器件。</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">通常是</span><span style="font-size: 9pt">CPU</span><span style="font-size: 9pt; font-family: 宋体">的一部分，本身有少量存储空间存放从虚拟地址到物理地址的匹配表。此表称作</span><span style="font-size: 9pt">TLB(</span><span style="font-size: 9pt; font-family: 宋体">转换旁置缓冲区</span><span style="font-size: 9pt">)</span><span style="font-size: 9pt; font-family: 宋体">。所有数据请求都送往</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">，由</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">决定数据是在</span><span style="font-size: 9pt">RAM</span><span style="font-size: 9pt; font-family: 宋体">内还是在大容量存储器设备内。如果数据不在存储空间内，</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">将产生页面错误中断。</span></p>
<p><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">的两个主要功能是</span><span style="font-size: 9pt">:</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">将虚地址转换成物理地址。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">控制存储器存取允许。</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">关掉时，虚地址直接输出到物理地址总线。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">在实践中，使用</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">解决了如下几个问题：</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">①使用</span><span style="font-size: 9pt">DRAM</span><span style="font-size: 9pt; font-family: 宋体">作为大容量存储器时，如果</span><span style="font-size: 9pt">DRAM</span><span style="font-size: 9pt; font-family: 宋体">的行列是非平方的，会导致该</span><span style="font-size: 9pt">DRAM</span><span style="font-size: 9pt; font-family: 宋体">的物理地址不连续，这将给程序的编写调试造成极大不便，而适当配置</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">可将其转换成虚拟地址连续的空间。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">②</span><span style="font-size: 9pt">ARM</span><span style="font-size: 9pt; font-family: 宋体">内核的中断向量表要求放在</span><span style="font-size: 9pt">0</span><span style="font-size: 9pt; font-family: 宋体">地址，</span><span style="font-size: 9pt; font-family: 宋体">对于</span><span style="font-size: 9pt">ROM</span><span style="font-size: 9pt; font-family: 宋体">在</span><span style="font-size: 9pt">0</span><span style="font-size: 9pt; font-family: 宋体">地址的情况，无法调试中断服务程序，所以在调试阶段有必要将可读写的存储器空间映射到</span><span style="font-size: 9pt">0</span><span style="font-size: 9pt; font-family: 宋体">地址。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">③系统的某些地址段是不允许被访问的，否则会产生不可预料的后果</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">为了避免这类错误</span><span style="font-size: 9pt">,</span><span style="font-size: 9pt; font-family: 宋体">可以通过</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">匹配表的设置将这些地址段设为用户不可存取类型。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">启动程序中生成的匹配表中包含地址映射，存储页大小</span><span style="font-size: 9pt">(1M,64K,</span><span style="font-size: 9pt; font-family: 宋体">或</span><span style="font-size: 9pt">4K)</span><span style="font-size: 9pt; font-family: 宋体">以及是否允许存取等信息。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">例如</span><span style="font-size: 9pt">:</span><span style="font-size: 9pt; font-family: 宋体">目标板上的</span><span style="font-size: 9pt">16</span><span style="font-size: 9pt; font-family: 宋体">兆</span><span style="font-size: 9pt">DRAM</span><span style="font-size: 9pt; font-family: 宋体">的物理地址区间为</span><span style="font-size: 9pt">0xc000</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">0000</span><span style="font-size: 9pt; font-family: 宋体">～</span><span style="font-size: 9pt">0xc07f</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">ffff;0xc100</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">0000</span><span style="font-size: 9pt; font-family: 宋体">～</span><span style="font-size: 9pt">0xc17f</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">ffff;16</span><span style="font-size: 9pt; font-family: 宋体">兆</span><span style="font-size: 9pt">ROM</span><span style="font-size: 9pt; font-family: 宋体">的虚拟地址区间为</span><span style="font-size: 9pt">:0x0000</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">0000</span><span style="font-size: 9pt; font-family: 宋体">～</span><span style="font-size: 9pt">0x00ff</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">ffff</span><span style="font-size: 9pt; font-family: 宋体">。匹配表配置如下</span><span style="font-size: 9pt">:</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">可以看到左边是连续的虚拟地址空间，右边是不连续的物理地址空间，而且将</span><span style="font-size: 9pt">DRAM</span><span style="font-size: 9pt; font-family: 宋体">映射到了</span><span style="font-size: 9pt">0</span><span style="font-size: 9pt; font-family: 宋体">地址区间。</span><span style="font-size: 9pt"> MMU</span><span style="font-size: 9pt; font-family: 宋体">通过虚拟地址和页面表位置信息，按照转换逻辑获得对应物理地址，输出到地址总线上。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">应注意到的是使能</span><span style="font-size: 9pt">MMU</span><span style="font-size: 9pt; font-family: 宋体">后，程序继续运行，但是对于程序员来说程序计数器的指针已经改变，指向了</span><span style="font-size: 9pt">ROM</span><span style="font-size: 9pt; font-family: 宋体">所对应的虚拟地址。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">⑵目标文件的分布装载分析</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">首先创建一个文本文件，称为分布装载描述文件。它为应用程序的各部分指定装载区间和执行区间。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">举例如下</span><span style="font-size: 9pt">:</span></p>
<p><span style="font-size: 9pt">FLASH 0x01000000 0x011fffff </span><span style="font-size: 9pt; font-family: 宋体">；</span><span style="font-size: 9pt">2M</span><span style="font-size: 9pt"> FLASH</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">FLASH 0x01000000</span></p>
<p><span style="font-size: 9pt">{</span></p>
<p><span style="font-size: 9pt">boot.o(BOOT</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">+First)</span></p>
<p><span style="font-size: 9pt">* (+RO)</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">　</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt">DRAM 0x00000000</span></p>
<p><span style="font-size: 9pt">{ </span></p>
<p><span style="font-size: 9pt">vector.0(VECTOR</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">+First) </span></p>
<p><span style="font-size: 9pt">int_handler.o (+RO) </span></p>
<p><span style="font-size: 9pt">* (+RW</span><span style="font-size: 9pt; font-family: 宋体">，</span><span style="font-size: 9pt">+ZI)</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">　</span></p>
<p><span style="font-size: 9pt">}</span></p>
<p><span style="font-size: 9pt">} </span></p>
<p><span style="font-size: 9pt; font-family: 宋体">在</span><span style="font-size: 9pt">ARM</span><span style="font-size: 9pt; font-family: 宋体">链接器的命令行里加入&#8220;</span><span style="font-size: 9pt">-scov description-file </span><span style="font-size: 9pt; font-family: 宋体">&#8211;</span><span style="font-size: 9pt">scf</span><span style="font-size: 9pt; font-family: 宋体">&#8221;或&#8220;</span><span style="font-size: 9pt">-scatter description-file</span><span style="font-size: 9pt; font-family: 宋体">&#8221;，编译链接后，将产生一个分布装载文件。</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">链接器同时产生一组符号，给出每个分布描述文件中命名的区间的长度，装载地址和执行地址。由于链接器和</span><span style="font-size: 9pt">C</span><span style="font-size: 9pt; font-family: 宋体">库都没有将代码从它的装载区间拷贝到执行区间，或创建一个零初始化区域的功能，所以要由应用程序员利用这组符号产生的信息完成这项工作，这是在呼叫</span><span style="font-size: 9pt">C</span><span style="font-size: 9pt; font-family: 宋体">程序之前必须完成的，举例如下：</span></p>
<p><span style="font-size: 9pt">LDR r0, = |Load$$DRAM$$Base|</span></p>
<p><span style="font-size: 9pt">LDR r1, = |Image$$DRAM$$Base|</span></p>
<p><span style="font-size: 9pt">CMP r0, r1 ; </span><span style="font-size: 9pt; font-family: 宋体">检查装载地址和执行地址是否相同</span></p>
<p><span style="font-size: 9pt">BEQ do_zi_init ; </span><span style="font-size: 9pt; font-family: 宋体">相同，则不拷贝该区间，初始化零数据区</span></p>
<p><span style="font-size: 9pt">MOV r2, r1 </span><span style="font-size: 9pt; font-family: 宋体">；</span><span style="font-size: 9pt; font-family: 宋体">不相同，将装载区拷贝到执行区</span></p>
<p><span style="font-size: 9pt">LDR r4, = |Image$$DRAM$$length|</span></p>
<p><span style="font-size: 9pt">ADD r2, r2, r4</span></p>
<p><span style="font-size: 9pt">BL copy</span></p>
<p><span style="font-size: 9pt">do_zi_init</span></p>
<p><span style="font-size: 9pt">LDR r1, = |Image$$DRAM$$ZI$$Base|</span></p>
<p><span style="font-size: 9pt">MOV r2, r1</span></p>
<p><span style="font-size: 9pt">LDR r4, = |Image$$DRAM$$ZI$$length|</span></p>
<p><span style="font-size: 9pt">ADD r2, r2, r4</span></p>
<p><span style="font-size: 9pt">MOV r3, #0</span></p>
<p><span style="font-size: 9pt">BL zi_init ; </span><span style="font-size: 9pt; font-family: 宋体">调用零初始化子程序</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">　</span></p>
<p><span style="font-size: 9pt">4</span><span style="font-size: 9pt; font-family: 宋体">．结束语：</span></p>
<p><span style="font-size: 9pt; font-family: 宋体">本文介绍的启动程序已经在以</span><span style="font-size: 9pt">Cirrus Logic</span><span style="font-size: 9pt; font-family: 宋体">公司的</span><span style="font-size: 9pt">EP7211</span><span style="font-size: 9pt; font-family: 宋体">和</span><span style="font-size: 9pt">Ateml</span><span style="font-size: 9pt; font-family: 宋体">公司的</span><span style="font-size: 9pt">AT91M40400</span><span style="font-size: 9pt; font-family: 宋体">开发的系统上运行并测试通过。今后可以在这一基础上添加串行通信模块和</span><span style="font-size: 9pt">FLASH</span><span style="font-size: 9pt; font-family: 宋体">操作模块，开发系统监控程序，从而实现应用程序的在线升级。</span></p>
<img src ="http://www.cnblogs.com/hocylan/aggbug/1089981.html?type=2" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42947/" target="_blank">[新闻]开心网即将启用”shejiao.com”?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>什么是ARM</title><link>http://www.cnblogs.com/hocylan/articles/1088835.html</link><dc:creator>蓝天旭日</dc:creator><author>蓝天旭日</author><pubDate>Mon, 03 Mar 2008 07:09:00 GMT</pubDate><guid>http://www.cnblogs.com/hocylan/articles/1088835.html</guid><wfw:comment>http://www.cnblogs.com/hocylan/comments/1088835.html</wfw:comment><comments>http://www.cnblogs.com/hocylan/articles/1088835.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cnblogs.com/hocylan/comments/commentRss/1088835.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hocylan/services/trackbacks/1088835.html</trackback:ping><description><![CDATA[<span style="font-size: 12px">1.1 ARM－Advanced RISC Machines<br />
　　ARM（Advanced RISC Machines），既可以认为是一个公司的名字，也可以认为是对一类微处理器的通称，还可以认为是一种技术的名字。<br />
　　1991年ARM公司成立于英国剑桥，主要出售芯片设计技术的授权。目前，采用ARM技术知识产权（IP）核的微处理器，即我们通常所说的ARM微处理器，已遍及工业控制、消费类电子产品、通信系统、网络系统、无线系统等各类产品市场，基于ARM技术的微处理器应用约占据了32位RISC微处理器75％以上的市场份额，ARM技术正在逐步渗入到我们生活的各个方面。<br />
　　ARM公司是专门从事基于RISC技术芯片设计开发的公司，作为知识产权供应商，本身不直接从事芯片生产，靠转让设计许可由合作公司生产各具特色的芯片，世界各大半导体生产商从ARM公司购买其设计的ARM微处理器核，根据各自不同的应用领域，加入适当的外围电路，从而形成自己的ARM微处理器芯片进入市场。目前，全世界有几十家大的半导体公司都使用ARM公司的授权，因此既使得ARM技术获得更多的第三方工具、制造、软件的支持，又使整个系统成本降低，使产品更容易进入市场被消费者所接受，更具有竞争力。<br />
<br />
1.2 ARM微处理器的应用领域及特点<br />
　　1.2.1 ARM微处理器的应用领域<br />
　　到目前为止，ARM微处理器及技术的应用几乎已经深入到各个领域：<br />
　　 1、工业控制领域：作为32的RISC架构，基于ARM核的微控制器芯片不但占据了高端微控制器市场的大部分市场份额，同时也逐渐向低端微控制器应用领域扩展，ARM微控制器的低功耗、高性价比，向传统的8位/16位微控制器提出了挑战。<br />
　　2、无线通讯领域：目前已有超过85%的无线通讯设备采用了ARM技术， ARM以其高性能和低成本，在该领域的地位日益巩固。<br />
　　3、网络应用：随着宽带技术的推广，采用ARM技术的ADSL芯片正逐步获得竞争优势。此外，ARM在语音及视频处理上行了优化，并获得广泛支持，也对DSP的应用领域提出了挑战。<br />
　　4、消费类电子产品：ARM技术在目前流行的数字音频播放器、数字机顶盒和游戏机中得到广泛采用。<br />
　　5、成像和安全产品：现在流行的数码相机和打印机中绝大部分采用ARM技术。手机中的32位SIM智能卡也采用了ARM技术。<br />
　　除此以外，ARM微处理器及技术还应用到许多不同的领域，并会在将来取得更加广泛的应用。<br />
　　1.2.2 ARM微处理器的特点<br />
　　采用RISC架构的ARM微处理器一般具有如下特点：<br />
　　1、体积小、低功耗、低成本、高性能； <br />
　　2、支持Thumb（16位）/ARM（32位）双指令集，能很好的兼容8位/16位器件；<br />
　　3、大量使用寄存器，指令执行速度更快；<br />
　　4、大多数数据操作都在寄存器中完成；<br />
　　5、寻址方式灵活简单，执行效率高；<br />
　　6、指令长度固定；<br />
<br />
1.3 ARM微处理器系列<br />
　　ARM微处理器目前包括下面几个系列，以及其它厂商基于ARM体系结构的处理器，除了具有ARM体系结构的共同特点以外，每一个系列的ARM微处理器都有各自的特点和应用领域。<br />
　　－ ARM7系列<br />
　　－ ARM9系列<br />
　　－ ARM9E系列<br />
　　－ ARM10E系列<br />
　　－ SecurCore系列<br />
　　－ Inter的Xscale<br />
　　－ Inter的StrongARM<br />
　　其中，ARM7、ARM9、ARM9E和ARM10为4个通用处理器系列，每一个系列提供一套相对独特的性能来满足不同应用领域的需求。SecurCore系列专门为安全要求较高的应用而设计。<br />
　　以下我们来详细了解一下各种处理器的特点及应用领域。<br />
　　1.3.1 ARM7微处理器系列<br />
　　ARM7系列微处理器为低功耗的32位RISC处理器，最适合用于对价位和功耗要求较高的消费类应用。ARM7微处理器系列具有如下特点：<br />
　　－ 具有嵌入式ICE－RT逻辑，调试开发方便。<br />
　　－ 极低的功耗，适合对功耗要求较高的应用，如便携式产品。 <br />
　　－ 能够提供0.9MIPS/MHz的三级流水线结构。<br />
　　 － 代码密度高并兼容16位的Thumb指令集。<br />
　　 － 对操作系统的支持广泛，包括Windows CE、Linux、Palm OS等。<br />
　　－ 指令系统与ARM9系列、ARM9E系列和ARM10E系列兼容，便于用户的产品升级换代。<br />
　　 － 主频最高可达130MIPS，高速的运算处理能力能胜任绝大多数的复杂应用。<br />
　　ARM7系列微处理器的主要应用领域为：工业控制、Internet设备、网络和调制解调器设备、移动电话等多种多媒体和嵌入式应用。<br />
　　ARM7系列微处理器包括如下几种类型的核：ARM7TDMI、ARM7TDMI-S、<br />
　　ARM720T、ARM7EJ。其中，ARM7TMDI是目前使用最广泛的32位嵌入式RISC处理器，属低端ARM处理器核。TDMI的基本含义为：<br />
　　T： 支持16为压缩指令集Thumb；<br />
　　D： 支持片上Debug；<br />
　　M：内嵌硬件乘法器（Multiplier）<br />
　　I： 嵌入式ICE，支持片上断点和调试点；<br />
　　<br />
　　1.3.2 ARM9微处理器系列<br />
　　ARM9系列微处理器在高性能和低功耗特性方面提供最佳的性能。具有以下特点：<br />
　　－ 5级整数流水线，指令执行效率更高。<br />
　　－ 提供1.1MIPS/MHz的哈佛结构。<br />
　　－ 支持32位ARM指令集和16位Thumb指令集。<br />
　　－ 支持32位的高速AMBA总线接口。 <br />
　　－ 全性能的MMU，支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。<br />
　　－ MPU支持实时操作系统。<br />
　　－ 支持数据Cache和指令Cache，具有更高的指令和数据处理能力。<br />
　　ARM9系列微处理器主要应用于无线设备、仪器仪表、安全系统、机顶盒、高端打印机、数字照相机和数字摄像机等。<br />
　　ARM9系列微处理器包含ARM920T、ARM922T和ARM940T三种类型，以适用于不同的应用场合。<br />
　　1.3.3 ARM9E微处理器系列<br />
　　ARM9E系列微处理器为可综合处理器，使用单一的处理器内核提供了微控制器、DSP、Java应用系统的解决方案，极大的减少了芯片的面积和系统的复杂程度。ARM9E系列微处理器提供了增强的DSP处理能力，很适合于那些需要同时使用DSP和微控制器的应用场合。<br />
　　ARM9E系列微处理器的主要特点如下：<br />
　　－ 支持DSP指令集，适合于需要高速数字信号处理的场合。<br />
　　－ 5级整数流水线，指令执行效率更高。<br />
　　－ 支持32位ARM指令集和16位Thumb指令集。<br />
　　－ 支持32位的高速AMBA总线接口。<br />
　　－ 支持VFP9浮点处理协处理器。<br />
　　－ 全性能的MMU，支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。<br />
　　－ MPU支持实时操作系统。<br />
　　－ 支持数据Cache和指令Cache，具有更高的指令和数据处理能力。<br />
　　－ 主频最高可达300MIPS。<br />
　　ARM9系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、存储设备和网络设备等领域。<br />
　　ARM9E系列微处理器包含ARM926EJ-S、ARM946E-S和ARM966E-S三种类型，以适用于不同的应用场合。<br />
　　1.3.4 ARM10E微处理器系列<br />
　　ARM10E系列微处理器具有高性能、低功耗的特点，由于采用了新的体系结构，与同等的ARM9器件相比较，在同样的时钟频率下，性能提高了近50％，同时，ARM10E系列微处理器采用了两种先进的节能方式，使其功耗极低。<br />
　　ARM10E系列微处理器的主要特点如下： <br />
　　－ 支持DSP指令集，适合于需要高速数字信号处理的场合。<br />
　　－ 6级整数流水线，指令执行效率更高。<br />
　　－ 支持32位ARM指令集和16位Thumb指令集。<br />
　　－ 支持32位的高速AMBA总线接口。<br />
　　－ 支持VFP10浮点处理协处理器。<br />
　　－ 全性能的MMU，支持Windows CE、Linux、Palm OS等多种主流嵌入式操作系统。<br />
　　－ 支持数据Cache和指令Cache，具有更高的指令和数据处理能力<br />
　　－ 主频最高可达400MIPS。<br />
　　－ 内嵌并行读/写操作部件。<br />
　　ARM10E系列微处理器主要应用于下一代无线设备、数字消费品、成像设备、工业控制、通信和信息系统等领域。<br />
　　ARM10E系列微处理器包含ARM1020E、ARM1022E和ARM1026EJ-S三种类型，以适用于不同的应用场合。<br />
　　1.3.5 SecurCore微处理器系列<br />
　　SecurCore系列微处理器专为安全需要而设计，提供了完善的32位RISC技术的安全解决方案，因此，SecurCore系列微处理器除了具有ARM体系结构的低功耗、高性能的特点外，还具有其独特的优势，即提供了对安全解决方案的支持。<br />
　　SecurCore系列微处理器除了具有ARM体系结构各种主要特点外，还在系统安全方面具有如下的特点：<br />
　　－ 带有灵活的保护单元，以确保操作系统和应用数据的安全。<br />
　　－ 采用软内核技术，防止外部对其进行扫描探测。<br />
　　－ 可集成用户自己的安全特性和其他协处理器。<br />
　　SecurCore系列微处理器主要应用于一些对安全性要求较高的应用产品及应用系统，如电子商务、电子政务、电子银行业务、网络和认证系统等领域。<br />
　　SecurCore系列微处理器包含SecurCore SC100、SecurCore SC110、SecurCore SC200和SecurCore SC210四种类型，以适用于不同的应用场合。<br />
　　1.3.6 StrongARM微处理器系列<br />
　　Inter StrongARM SA-1100处理器是采用ARM体系结构高度集成的32位RISC微处理器。它融合了Inter公司的设计和处理技术以及ARM体系结构的电源效率，采用在软件上兼容ARMv4体系结构、同时采用具有Intel技术优点的体系结构。<br />
　　Intel StrongARM处理器是便携式通讯产品和消费类电子产品的理想选择，已成功应用于多家公司的掌上电脑系列产品。<br />
　　1.3.7 Xscale处理器<br />
　　Xscale 处理器是基于ARMv5TE体系结构的解决方案，是一款全性能、高性价比、低功耗的处理器。它支持16位的Thumb指令和DSP指令集，已使用在数字移动电话、个人数字助理和网络产品等场合。<br />
　　Xscale 处理器是Inter目前主要推广的一款ARM微处理器。<br />
<br />
1.4 ARM微处理器结构<br />
　　1.4.1 RISC体系结构<br />
　　传统的CISC（Complex Instruction Set Computer，复杂指令集计算机）结构有其固有的缺点，即随着计算机技术的发展而不断引入新的复杂的指令集，为支持这些新增的指令，计算机的体系结构会越来越复杂，然而，在CISC指令集的各种指令中，其使用频率却相差悬殊，大约有20％的指令会被反复使用，占整个程序代码的80％。而余下的80％的指令却不经常使用，在程序设计中只占20％，显然，这种结构是不太合理的。<br />
　　基于以上的不合理性，1979年美国加州大学伯克利分校提出了RISC（Reduced Instruction Set Computer，精简指令集计算机）的概念，RISC并非只是简单地去减少指令，而是把着眼点放在了如何使计算机的结构更加简单合理地提高运算速度上。RISC结构优先选取使用频最高的简单指令，避免复杂指令；将指令长度固定，指令格式和寻地方式种类减少；以控制逻辑为主，不用或少用微码控制等措施来达到上述目的。<br />
　　到目前为止，RISC体系结构也还没有严格的定义，一般认为，RISC体系结构应具有如下特点：<br />
　　－ 采用固定长度的指令格式，指令归整、简单、基本寻址方式有2～3种。<br />
　　－ 使用单周期指令，便于流水线操作执行。<br />
　　－ 大量使用寄存器，数据处理指令只对寄存器进行操作，只有加载/ 存储指令可以访问存储器，以提高指令的执行效率。<br />
　　除此以外，ARM体系结构还采用了一些特别的技术，在保证高性能的前提下尽量缩小芯片的面积，并降低功耗：<br />
　　－ 所有的指令都可根据前面的执行结果决定是否被执行，从而提高指令的执行效率。<br />
　　－ 可用加载/存储指令批量传输数据，以提高数据的传输效率。<br />
　　－ 可在一条数据处理指令中同时完成逻辑处理和移位处理。<br />
　　－ 在循环处理中使用地址的自动增减来提高运行效率。<br />
　　当然，和CISC架构相比较，尽管RISC架构有上述的优点，但决不能认为RISC架构就可以取代CISC架构，事实上，RISC和CISC各有优势，而且界限并不那么明显。现代的CPU往往采用CISC的外围，内部加入了RISC的特性，如超长指令集CPU就是融合了RISC和CISC的优势，成为未来的CPU发展方向之一。<br />
　　1.4.2 ARM微处理器的寄存器结构<br />
　　ARM处理器共有37个寄存器，被分为若干个组（BANK），这些寄存器包括：<br />
　　－ 31个通用寄存器，包括程序计数器（PC指针），均为32位的寄存器。<br />
　　－ 6个状态寄存器，用以标识CPU的工作状态及程序的运行状态，均为32位，目前只使用了其中的一部分。<br />
　　同时，ARM处理器又有7种不同的处理器模式，在每一种处理器模式下均有一组相应的寄存器与之对应。即在任意一种处理器模式下，可访问的寄存器包括15个通用寄存器（R0～R14）、一至二个状态寄存器和程序计数器。在所有的寄存器中，有些是在7种处理器模式下共用的同一个物理寄存器，而有些寄存器则是在不同的处理器模式下有不同的物理寄存器。<br />
　　关于ARM处理器的寄存器结构，在后面的相关章节将会详细描述。<br />
　　1.4.3 ARM微处理器的指令结构<br />
　　ARM微处理器的在较新的体系结构中支持两种指令集：ARM指令集和Thumb指令集。其中，ARM指令为32位的长度，Thumb指令为16位长度。Thumb指令集为ARM指令集的功能子集，但与等价的ARM代码相比较，可节省30％～40％以上的存储空间，同时具备32位代码的所有优点。<br />
　　关于ARM处理器的指令结构，在后面的相关章节将会详细描述。<br />
　　1.5 ARM微处理器的应用选型<br />
　　鉴于ARM微处理器的众多优点，随着国内外嵌入式应用领域的逐步发展，ARM微处理器必然会获得广泛的重视和应用。但是，由于ARM微处理器有多达十几种的内核结构，几十个芯片生产厂家，以及千变万化的内部功能配置组合，给开发人员在选择方案时带来一定的困难，所以，对ARM芯片做一些对比研究是十分必要的。<br />
　　以下从应用的角度出发，对在选择ARM微处理器时所应考虑的主要问题做一些简要的探讨。 <br />
　　ARM微处理器内核的选择<br />
　　从前面所介绍的内容可知，ARM微处理器包含一系列的内核结构，以适应不同的应用领域，用户如果希望使用WinCE或标准Linux等操作系统以减少软件开发时间，就需要选择ARM720T以上带有MMU（Memory Management Unit）功能的ARM芯片，ARM720T、ARM920T、ARM922T、ARM946T、Strong-ARM都带有MMU功能。而ARM7TDMI则没有MMU，不支持Windows CE和标准Linux，但目前有uCLinux等不需要MMU支持的操作系统可运行于ARM7TDMI硬件平台之上。事实上，uCLinux已经成功移植到多种不带MMU的微处理器平台上，并在稳定性和其他方面都有上佳表现。 <br />
　　本书所讨论的S3C4510B即为一款不带MMU的ARM微处理器，可在其上运行uCLinux操作系统。<br />
　　系统的工作频率<br />
　　系统的工作频率在很大程度上决定了ARM微处理器的处理能力。ARM7系列微处理器的典型处理速度为0.9MIPS/MHz，常见的ARM7芯片系统主时钟为20MHz-133MHz，ARM9系列微处理器的典型处理速度为1.1MIPS/MHz，常见的ARM9的系统主时钟频率为100MHz-233MHz，ARM10最高可以达到700MHz。不同芯片对时钟的处理不同，有的芯片只需要一个主时钟频率，有的芯片内部时钟控制器可以分别为ARM核和USB、UART、DSP、音频等功能部件提供不同频率的时钟。<br />
　　芯片内存储器的容量<br />
　　大多数的ARM微处理器片内存储器的容量都不太大，需要用户在设计系统时外扩存储器，但也有部分芯片具有相对较大的片内存储空间，如ATMEL的AT91F40162就具有高达2MB的片内程序存储空间，用户在设计时可考虑选用这种类型，以简化系统的设计。<br />
　　片内外围电路的选择<br />
　　除ARM微处理器核以外，几乎所有的ARM芯片均根据各自不同的应用领域，扩展了相关功能模块，并集成在芯片之中，我们称之为片内外围电路，如USB接口、IIS接口、LCD控制器、键盘接口、RTC、ADC和DAC、DSP协处理器等，设计者应分析系统的需求，尽可能采用片内外围电路完成所需的功能，这样既可简化系统的设计，同时提高系统的可靠性。</span>
<img src ="http://www.cnblogs.com/hocylan/aggbug/1088835.html?type=2" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42945/" target="_blank">[新闻]Google股价跌破329美元 61%员工期权价值归零</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>C#钩子实现简单鼠标键盘的监控和屏蔽 </title><link>http://www.cnblogs.com/hocylan/archive/2008/01/14/1038390.html</link><dc:creator>蓝天旭日</dc:creator><author>蓝天旭日</author><pubDate>Mon, 14 Jan 2008 07:40:00 GMT</pubDate><guid>http://www.cnblogs.com/hocylan/archive/2008/01/14/1038390.html</guid><wfw:comment>http://www.cnblogs.com/hocylan/comments/1038390.html</wfw:comment><comments>http://www.cnblogs.com/hocylan/archive/2008/01/14/1038390.html#Feedback</comments><slash:comments>2</slash:comments><wfw:commentRss>http://www.cnblogs.com/hocylan/comments/commentRss/1038390.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hocylan/services/trackbacks/1038390.html</trackback:ping><description><![CDATA[摘要: 第一步：安装钩子：SetWindowsHookEx(WH_Codes idHook, HookProc lpfn,IntPtr pInstance, int threadId);<br>第二步：回调和处理 CallNextHookEx(IntPtr pHookHandle, int nCode,Int32 wParam, IntPtr lParam);<br><br>&nbsp;&nbsp;<a href='http://www.cnblogs.com/hocylan/archive/2008/01/14/1038390.html'>阅读全文</a><img src ="http://www.cnblogs.com/hocylan/aggbug/1038390.html?type=1" width = "1" height = "1" /><br><br><a href="http://news.cnblogs.com/n/42944/" target="_blank">[新闻]十年祭:昔日明星软件今何在?</a><br/><a href="http://www.cnblogs.com" target="_blank">博客园首页</a>&nbsp;<a href="http://space.cnblogs.com" target="_blank">社区</a>&nbsp;<a href="http://news.cnblogs.com" target="_blank">新闻频道</a>&nbsp;<a href="http://space.cnblogs.com/group.htm" target="_blank">小组</a>&nbsp;<a href="http://space.cnblogs.com/q" target="_blank">博问</a>&nbsp;<a href="http://wz.cnblogs.com/" target="_blank">网摘</a>&nbsp;<a href="http://space.cnblogs.com/ing" target="_blank">闪存</a>]]></description></item><item><title>HOOK专题[来自微软中国社区]</title><link>http://www.cnblogs.com/hocylan/articles/1033895.html</link><dc:creator>蓝天旭日</dc:creator><author>蓝天旭日</author><pubDate>Thu, 10 Jan 2008 08:40:00 GMT</pubDate><guid>http://www.cnblogs.com/hocylan/articles/1033895.html</guid><wfw:comment>http://www.cnblogs.com/hocylan/comments/1033895.html</wfw:comment><comments>http://www.cnblogs.com/hocylan/articles/1033895.html#Feedback</comments><slash:comments>1</slash:comments><wfw:commentRss>http://www.cnblogs.com/hocylan/comments/commentRss/1033895.html</wfw:commentRss><trackback:ping>http://www.cnblogs.com/hocylan/services/trackbacks/1033895.html</trackback:ping><description><![CDATA[<hr color="#cccccc" size="1" />
<div class="text2">目录</div>
<div class="text4"></div>
<ul class="list1">
    <li class="list2"><strong></strong>基本概念
    <li class="list2"><strong></strong>运行机制
    <li class="list2"><strong></strong>钩子类型
    <li class="list2"><strong></strong>作者</li>
</ul>
<hr color="#cccccc" size="1" />
<div class="text2">基本概念</div>
<div class="text4"></div>
<div class="text4">钩子(Hook)，是Windows消息处理机制的一个平台,应用程序可以在上面设置子程以监视指定窗口的某种消息，而且所监视的窗口可以是其他进程所创建的。当消息到达后，