﻿<?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>C++博客-笑看风云淡</title><link>http://www.cppblog.com/totti1006/</link><description>宠辱不惊，看庭前花开花落；去留无意，望天空云卷云舒</description><language>zh-cn</language><lastBuildDate>Fri, 05 Dec 2008 07:34:35 GMT</lastBuildDate><pubDate>Fri, 05 Dec 2008 07:34:35 GMT</pubDate><ttl>60</ttl><item><title>Visual C++编译器常用选项设置</title><link>http://www.cppblog.com/totti1006/archive/2008/11/10/66523.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Mon, 10 Nov 2008 08:01:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/11/10/66523.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/66523.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/11/10/66523.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/66523.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/66523.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 编译参数的设置。主要通过IDE的菜单项Project-&gt;Settings-&gt;C/C++页来完成。我们可以看到这一页的最下面Project Options中的内容，一般如下：
<p>&#160;</p>
<p>　　/nologo /MDd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_AFXDLL" /D "_M</p>
<p>　　BCS" /Fp"Debug/WritingDlgTest.pch" /Yu"stdafx.h" /Fo"Debug/" /Fd"Debug/" /FD /GZ /c</p>
<p>　　各个参数代表的意义，可以参考Msdn。比如/nologo表示编译时不在输出窗口显示这些设置(我们可以把这个参数去掉来看看效果)等等。一般我们不会直接修改这些设置，而是通过这一页最上面的Category中的各项来完成。</p>
<p>　　1) General：一些总体设置。Warning level用来控制警告信息，其中Level 1是最严重的级别;Warnings as errors将警告信息当作错误处理;Optimizations是代码优化，可以在Category的Optimizations项中进行更细的设置;Generate browse info用以生成.sbr文件，记录类、变量等符号信息，可以在Category的Listing Files项中进行更多的设置。Debug info，生成调试信息：None，不产生任何调试信息(编译比较快);Line Numbers Only，仅生成全局的和外部符号的调试信息到.OBJ文件或.EXE文件，减小目标文件的尺寸;C 7.0- Compatible，记录调试器用到的所有符号信息到.OBJ文件和.EXE文件;Program Database，创建.PDB文件记录所有调试信息;Program Database for "Edit &amp; Continue"，创建.PDB文件记录所有调试信息，并且支持调试时编辑。</p>
<p>　　2) C++ Language：pointer_to_member representation用来设置类定义/引用的先后关系，一般为Best-Case Always表示在引用类之前该类肯定已经定义了;Enable Exception Handling，进行同步的异常处理;Enable Run-Time Type Information迫使编译器增加代码在运行时进行对象类型检查;Disable Construction Displacements，设置类构造/析构函数调用虚函数问题。</p>
<p>　　3) Code Generation：Processor表示代码指令优化，可以为80386、80486、Pentium、Pentium Pro，或者Blend表示混合以上各种优化。Use run-time library用以指定程序运行时使用的运行时库(单线程或多线程，Debug版本或Release版本)，有一个原则就是，一个进程不要同时使用几个版本的运行时库。Single-Threaded，静态连接LIBC.LIB库;Debug Single-Threaded，静态连接LIBCD.LIB库;Multithreaded，静态连接LIBCMT.LIB库;Debug Multithreaded，静态连接LIBCMTD.LIB库;Multithreaded DLL，动态连接MSVCRT.DLL库;Debug Multithreaded DLL，动态连接MSVCRTD.DLL库。连接了单线程库就不支持多线程调用，连接了多线程库就要求创建多线程的应用程序。</p>
<p>　　Calling convention可以用来设定调用约定，有三种：__cdecl、__fastcall和__stdcall。各种调用约定的主要区别在于，函数调用时，函数的参数是从左到右压入堆栈还是从右到左压入堆栈;在函数返回时，由函数的调用者来清理压入堆栈的参数还是由函数本身来清理;以及在编译时对函数名进行的命名修饰(可以通过Listing Files看到各种命名修饰方式)。Struct member alignment用以指定数据结构中的成员变量在内存中是按几字节对齐的，根据计算机数据总线的位数，不同的对齐方式存取数据的速度不一样。这个参数对数据包网络传输等应用尤为重要，不是存取速度问题，而是数据位的精确定义问题，一般在程序中使用#pragma pack来指定。</p>
<p>　　4) Customize：Disable Language Extensions，表示不使用微软为标准C做的语言扩展;Eliminate Duplicate Strings，主要用于字符串优化(将字符串放到缓充池里以节省空间)，使用这个参数，使得</p>
<p>　　char *sBuffer = "This is a character buffer";</p>
<p>　　char *tBuffer = "This is a character buffer";</p>
<p>sBuffer和tBuffer指向的是同一块内存空间;Enable Function-Level Linking ，告诉编译器将各个函数按打包格式编译;Enables minimal rebuild，通过保存关联信息到.IDB文件，使编译器只对最新类定义改动过的源文件进行重编译，提高编译速度;Enable Incremental Compilation，同样通过.IDB文件保存的信息，只重编译最新改动过的函数;Suppress Startup Banner and Information Messages，用以控制参数是否在output窗口输出。</p>
<p>　　5) Listing Files：Generate browse info的功能上面已经提到过。这里可以进行更多的设置。Exclude Local Variables from Browse Info表示是否将局部变量的信息放到.SBR文件中。Listing file type可以设置生成的列表信息文件的内容：Assembly-Only Listing仅生成汇编代码文件(.ASM扩展名);Assembly With Machine Code生成机器代码和汇编代码文件(.COD扩展名);Assembly With Source Code生成源代码和汇编代码文件(.ASM扩展名);Assembly, Machine Code,and Source生成机器码、源代码和汇编代码文件(.COD扩展名)。Listing file name为生成的信息文件的路径，一般为Debug或Release目录下，生成的文件名自动取源文件的文件名。</p>
<p>　　6) Optimizations：代码优化设置。可以选择Maximize Speed生成最快速的代码，或Minimize Size生成最小尺寸的程序，或者Customize定制优化。定制的内容包括：</p>
<p>　　Assume No Aliasing，不使用别名(提高速度);</p>
<p>　　Assume Aliasing Across Function Calls，仅函数内部不使用别名;</p>
<p>　　Global Optimizations，全局优化，比如经常用到的变量使用寄存器保存，或者循环内的计算优化，如</p>
<p>　　i = -100;</p>
<p>　　while( i &lt; 0 ){ i += x + y;}</p>
<p>　　会被优化为</p>
<p>　　i = -100;</p>
<p>　　t = x + y;</p>
<p>　　while( i &lt; 0 ){i += t;}</p>
<p>　　Generate Intrinsic Functions，使用内部函数替换一些函数调用(提高速度);</p>
<p>　　Improve Float Consistency，浮点运算方面的优化;</p>
<p>　　Favor Small Code，程序(exe或dll)尺寸优化优先于代码速度优化;</p>
<p>　　Favor Fast Code，程序(exe或dll)代码速度优化优先于尺寸优化;</p>
<p>　　Frame-Pointer Omission，不使用帧指针，以提高函数调用速度;</p>
<p>　　Full Optimization，组合了几种参数，以生成最快的程序代码。</p>
<p>　　Inline function expansion，内联函数扩展的三种优化(使用内联可以节省函数调用的开销，加快程序速度)：Disable不使用内联;Only __inline，仅函数定义前有inline或__inline标记使用内联;Any Suitable，除了inline或__inline标记的函数外，编译器&#8220;觉得&#8221;应该使用内联的函数，都使用内联。</p>
<p>　　7) Precompiled Headers：预编译头文件的设置。使用预编译可以提高重复编译的速度。IDE一般将一些公共的、不大变动的头文件(比如afxwin.h等)集中放到stdafx.h中，这一部分代码就不必每次都重新编译(除非是Rebuild All)。</p>
<p>　　8) Preprocessor：预编译处理。可以定义/解除定义一些常量。Additional include directories，可以指定额外的包含目录，一般是相对于本项目的目录，如..\Include。</p>
<p>　　连接参数的设置。主要通过IDE的菜单项Project-&gt;Settings-&gt;Link页来完成。我们可以看到这一页的最下面Project Options中的内容，一般如下：</p>
<p>　　/nologo /subsystem:windows /incremental:yes /pdb:"Debug/WritingDlgTest.pdb" /debug /machi</p>
<p>　　ne:I386 /out:"Debug/WritingDlgTest.exe" /pdbtype:sept</p>
<p>下面我们分别来看一下Category中的各项设置。</p>
<p>　　1) General：一些总体设置。可以设置生成的文件路径、文件名;连接的库文件;Generate debug info，生成Debug信息到.PDB文件(具体格式可以在Category-&gt;Debug中设置);Ignore All Default Libraries，放弃所有默认的库连接;Link Incrementally，通过生成. ILK文件实现递增式连接以提高后续连接速度，但一般这种方式下生成的文件(EXE或DLL)较大;Generate Mapfile，生成.MAP文件记录模块相关信息;Enable Profiling，这个参数通常与Generate Mapfile参数同时使用，而且如果产生Debug信息的话，不能用.PDB文件，而且必须用Microsoft Format。</p>
<p>　　2) Customize：这里可以进行使用程序数据库文件的设置。Force File Output ，强制产生输出文件(EXE或DLL);Print Progress Messages，可以将连接过程中的进度信息输出到Output窗口。</p>
<p>　　3) Debug：设置是否生成调试信息，以及调试信息的格式。格式可以有Microsoft Format、COFF Format(Common Object File Format)和Both Formats三种选择;Separate Types，表示将Debug格式信息以独立的.PDB文件存放，还是直接放在各个源文件的.PDB文件中。选中的话，表示采用后者的方式，这种方式调试启动比较快。</p>
<p>　　4) Input：这里可以指定要连接的库文件，放弃连接的库文件。还可以增加额外的库文件目录，一般是相对于本项目的目录，如..\Lib。Force Symbol References，可以指定连接特定符号定义的库。</p>
<p>　　5) Output：Base Address可以改变程序默认的基地址(EXE文件默认为0x400000，DLL默认为x10000000)，操作系统装载一个程序时总是试着先从这个基地址开始。Entry-Point Symbol可以指定程序的入口地址，一般为一个函数名(且必须采用__stdcall调用约定)。一般Win32的程序，EXE的入口为WinMain，DLL的入口为DllEntryPoint;最好让连接器自动设置程序的入口点。默认情况下，通过一个C的运行时库函数来实现：控制台程序采用mainCRTStartup (或wmainCRTStartup)去调用程序的main (或wmain)函数;Windows程序采用WinMainCRTStartup (或 wWinMainCRTStartup)调用程序的WinMain (或 wWinMain，必须采用__stdcall调用约定);DLL采用_DllMainCRTStartup调用DllMain函数(必须采用__stdcall调用约定)。Stack allocations，用以设置程序使用的堆栈大小(请使用十进制)，默认为1兆字节。Version Information告诉连接器在EXE或DLL文件的开始部分放上版本号。</p>
<p>　　值得注意的是，上面各个参数是大小写敏感的;在参数后加上&#8220;-&#8221;表示该参数无效;各个参数值选项</p>
<p>　　有&#8220;*&#8221;的表示为该参数的默认值;可以使用页右上角的&#8220;Reset&#8221;按钮来恢复该页的所有默认设置。</p>
<p>　　其它一些参数设置</p>
<p>　　1) Project-&gt;Settings-&gt;General，可以设置连接MFC库的方式(静态或动态)。如果是动态连</p>
<p>　　接，在你的软件发布时不要忘了带上MFC的DLL。</p>
<p>　　2) Project-&gt;Settings-&gt;Debug，可以设置调试时运行的可执行文件，以及命令行参数等。</p>
<p>　　3) Project-&gt;Settings-&gt;Custom Build，可以设置编译/连接成功后自动执行一些操作。比较有</p>
<p>　　用的是，写COM时希望IDE对编译通过的COM文件自动注册，可以如下设置：</p>
<p>　　Description: Register COM</p>
<p>　　Commands: regsvr32 /s /c $(TargetPath)</p>
<p>　　echo regsvr32 exe.time &gt; $(TargetDir)\$(TargetName).trg</p>
<p>　　Outputs: $(TargetDir)\$(TargetName).trg</p>
<p>　　4) Tools-&gt;Options-&gt;Directories，设置系统的Include、Library路径。<br></p>
<p><br><br>　　<strong>一些小窍门(针对Visual C++)</strong></p>
<p>　　1) 有时候，你可能在编译的时候，计算机突然非法关机了(可能某人不小心碰了电源或你的内存不稳定等原因)。当你重启机器后打开刚才的项目，重新进行编译，发现IDE会崩掉。你或许以为你的编译器坏了，其实不然(你试试编译其它项目，还是好的!)，你只要将项目的.ncb、.opt、.aps、.clw文件以及Debug、Release目录下的所有文件都删掉，然后重新编译就行了。</p>
<p>　　2) 如果你想与别人共享你的源代码项目，但是把整个项目做拷贝又太大。你完全可以删掉以下文件：.dsw、.ncb、.opt、.aps、.clw、. plg文件以及Debug、Release目录下的所有文件。</p>
<p>　　3) 当你的Workspace中包含多个Project的时候，你可能不能直观地、一眼看出来哪个是当前项目。可以如下设置：Tools-&gt;Options-&gt;Format，然后在Category中选择Workspace window，改变其默认的字体(比如设成Fixedsys)就行了。</p>
<p>　　4) 如何给已有的Project改名字?将该Project关掉。然后以文本格式打开.dsp文件，替换原来的Project名字即可。</p>
<p>　　5) VC6对类成员的智能提示功能很有用，但有时候会失灵。你可以先关掉项目，将.clw和.ncb删掉，然后重新打开项目，点击菜单项View-&gt;ClassWizard，在弹出的对话框中按一下&#8220;Add All&#8221;按钮;重新Rebuild All。应该可以解决问题。</p>
<img src ="http://www.cppblog.com/totti1006/aggbug/66523.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-11-10 16:01 <a href="http://www.cppblog.com/totti1006/archive/2008/11/10/66523.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>在VC中用CMarkup类操纵XML</title><link>http://www.cppblog.com/totti1006/archive/2008/10/10/63672.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Fri, 10 Oct 2008 09:29:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/10/10/63672.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/63672.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/10/10/63672.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/63672.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/63672.html</trackback:ping><description><![CDATA[&nbsp;&nbsp;&nbsp;&nbsp; 摘要: &nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 首先到http://www.firstobject.com/dn_markup.htm上面下载CMarkup类，将CMarkup.cpp和CMarkup.h导入到我们的工程中就可以了。编译可能会出现问题，解决的方法是在CMarkup.cpp的开头加上#include &lt;stdafx.h&gt;，或者关闭预编译也可以。1、创建一个X...&nbsp;&nbsp;<a href='http://www.cppblog.com/totti1006/archive/2008/10/10/63672.html'>阅读全文</a><img src ="http://www.cppblog.com/totti1006/aggbug/63672.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-10-10 17:29 <a href="http://www.cppblog.com/totti1006/archive/2008/10/10/63672.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初学XML，我的学习分享（二）</title><link>http://www.cppblog.com/totti1006/archive/2008/09/26/62815.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Fri, 26 Sep 2008 06:33:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/09/26/62815.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/62815.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/09/26/62815.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/62815.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/62815.html</trackback:ping><description><![CDATA[<p>下面再做一个小小的Schema来说明:<br>这个例子来自:A&nbsp;semantic&nbsp;Web&nbsp;Primer.<br>先看下图.是一个关于电子邮件的.</p>
<p><br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/2006431446824312.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/2006431446824312.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/2006431446824312.jpg"></a><br>下面构建这个Schema,并在构建的同时说明Schema语法</p>
我们在上面的图中分析一下那图,我们就可以通过XMLSPY去完成,首先email(complex&nbsp;tyep下有head,body而head(complex)下有from,to,subject.而在from,to(complex&nbsp;type)之下又有name,address.
<p>&nbsp;</p>
<p>那么从这里我们大致可以理解复杂类型的定义,里面包含其它元素及属性.<br>复杂类型共有4种:<br>1.仅元素,包含其它的元素及属性,但没有文本.<br>2.空元素,可能包含属性,但没有元素及文本<br>3.混合.元素.属性and/or文本<br>4.仅文本.<br>(不知对不对,自已的理解,因为我看的资料都是英文的,有错的地方请指正.英语不怎么样,另多说一句,这只是给和我一样的初手看的..高手就..不说了吧.呵呵)<br>还是从那例子开始吧(要么今天又写不完了...要回宿舍的)<br>从上面的分析,我们心里有了,要有几个复杂类型,都是什么了...所以做起来应是很轻松的.<br>打开XMLSPY,很容易就搞定他<br>1.新建,不用说了吧.Schemas.写根元素:email<br>2.接着建一系列的复杂元素(点图上最左上角那个图标),内容如下<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/2006452139058579.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/2006452139058579.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/2006452139058579.jpg"></a><br>3,email有emailType(head,body).点emailType进去建立.如下图<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/2006452144151183.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/2006452144151183.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/2006452144151183.jpg"></a><br>4.返回再再点headType<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064521455260495.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064521455260495.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064521455260495.jpg"></a><br>5.nameAddress.<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064521482227113.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064521482227113.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064521482227113.jpg"></a><br>这次不点进去了,点下面的框就可以了.如图mouse的位置<br>6.我们想在body下除了文本还要加一个符件,这样他又是复杂类型<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064521535721381.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064521535721381.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064521535721381.jpg"></a><br>7.对于这个body里面的attachment我们想可能有编码的问题,所以我们还要限定它;<br>还是一个复杂型.但这次我们要用一下简单型了....<br>
<table class=tablebody2 style="TABLE-LAYOUT: fixed; WORD-BREAK: break-all" width="90%" border=0>
    <tbody>
        <tr>
            <td style="FONT-SIZE: 9pt; LINE-HEIGHT: 12pt" width="100%"><img alt=发贴心情 src="http://bbs.xml.org.cn/face/face1.gif" border=0>&nbsp;<strong></strong><br>
            <div width="100%">
            <div style="FLOAT: right"></div>
            <div><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064616153713101.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064616153713101.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064616153713101.jpg"></a><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064616154773548.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064616154773548.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064616154773548.jpg"></a>
            <p>&nbsp;</p>
            <p>照着图上所表示的一样,完成这一步.<br>下边的那图你要注意,应用枚举..看图中发亮的部分点一下,而后是右面的细节那里你点<br>SimpleType</p>
            <p>到这里我们把小零件弄完了,那么现在装一下<br>8.组合,再加一些属性...<br>点最上面的eamil,进去以后,点右面的type,选emailType,如图<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064616205921958.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064616205921958.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064616205921958.jpg"></a><br>出来后再点emailType.做法同上,加进去<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064616224792349.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064616224792349.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064616224792349.jpg"></a><br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064616234097292.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064616234097292.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064616234097292.jpg"></a><br>再点headType..给from&nbsp;and&nbsp;to加上nameAddressType.<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064616261464736.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064616261464736.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064616261464736.jpg"></a><br>再加这里的subject加上一个类型,xs:string.<br>这这里算是完成了我们这个schemas.<br>最后用F8,验证一下!<br>这里的源代码很简单的...而后自己分析一下源代码....你可以做一步<br>就软到源码里去分析一下的...这样容易加深记忆..</p>
            </div>
            </div>
            </td>
        </tr>
    </tbody>
</table>
<br></p>
<div>另付上关于这个email的DTD:<br>&lt;!ELEMENT&nbsp;email&nbsp;(head,body)&gt;<br>&lt;!ELEMENT&nbsp;head&nbsp;(from,to+,subject)&gt;<br>&lt;!ELEMENT&nbsp;from&nbsp;EMPTY&gt;<br>&lt;!ATTLIST&nbsp;from<br>name&nbsp;CDATA&nbsp;#IMPLIED<br>address&nbsp;CDATA&nbsp;#REQUIRED&gt;<br>&lt;!ELEMENT&nbsp;to&nbsp;EMPTY&gt;<br>&lt;!ATTLIST&nbsp;to<br>name&nbsp;CDATA&nbsp;#IMPLIED<br>address&nbsp;CDATA&nbsp;#REQUIRED&gt;<br>&lt;!ELEMENT&nbsp;subject&nbsp;(#PCDATA)&gt;<br>&lt;!ELEMENT&nbsp;body&nbsp;(text,attachment*)&gt;<br>&lt;!ELEMENT&nbsp;text&nbsp;(#PCDATA)&gt;<br>&lt;!ELEMENT&nbsp;attachment&nbsp;EMPTY&gt;<br>&lt;!ATTLIST&nbsp;attachment<br>encoding&nbsp;(mime|binhex)&nbsp;"mime"<br>file&nbsp;CDATA&nbsp;#REQUIRED&gt;</div>
<p><br>（转载自&#8220;中国XML论坛&#8221;，作者&#8220;starting&#8221;）</p>
<img src ="http://www.cppblog.com/totti1006/aggbug/62815.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-09-26 14:33 <a href="http://www.cppblog.com/totti1006/archive/2008/09/26/62815.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>初学XML，我的学习过程分享（一）</title><link>http://www.cppblog.com/totti1006/archive/2008/09/26/62813.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Fri, 26 Sep 2008 06:13:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/09/26/62813.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/62813.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/09/26/62813.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/62813.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/62813.html</trackback:ping><description><![CDATA[很多朋友和我一样初学XML,我也是一个初学XML的新手,让我们在讨论中学习XML.
<p>&nbsp;</p>
<p>看过很多教程,大家还会问同样一个问题,XML是什么?XML是有什么用?这类问题.<br>我以自己的话来说明这些问题.</p>
<p>一个正确的概念很重要,其码不会失去方向.下面引用一位朋友的贴子来作回答:</p>
<p>XML初学者普遍存在的问题</p>
<p>1。XML是什么？（不要说是可扩展的标记语言之类的话）<br>2。XML可以做什么？怎么做？（不需要回答，只需要列举出一个简单的例子即可）</p>
<p><br>1:&nbsp;XML,是用来<font color=#ff0000>描迷数据</font>的.<br>2:举一个例子说明:有A数据库&nbsp;B数据库,他们之间的标准不同,不能互传.那么你可以把数据放在XML中,而后就可以让A,B之间可以共同传输数据了.</p>
<p>补充:<br>首先要有一个概念,你最好不要去用XML设计网页,不是说不可以,&nbsp;只是要说明,<font color=#ff0000>XML不是HTML的替代.</font></p>
<p>有了这个概念,就不会有很多的看完一个一个的教程,还不知道XML做什么,很明了<br><font size=4><font color=#ff6600>XML就是为了描述数据</font></font></p>
<p>开始学习XML:<br>1.工具:XMLSPY2005,个人喜欢英文版.(当前下的2006英文版,注册有问题)<br>2.学习XML从那里开始?<br>&nbsp;&nbsp;&nbsp;即我要说明的是:先写XML还是先写DTD或是XML&nbsp;Schemas.<br>&nbsp;&nbsp;&nbsp;大多的教程从XML说起,再说DTD...再说XML&nbsp;Schemas...<br>&nbsp;&nbsp;&nbsp;不过我个人觉的,先了解一下XML的基本语法,而后跳过DTD,从Schemas开始.<br>&nbsp;&nbsp;&nbsp;这样不会让DTD搞的没兴趣..而后再对DTD作一定了解.这里要说明,我觉的先写<br>&nbsp;&nbsp;好一个Schemas再写XML比较好.即,先建立模型.再去填数据.<br>(这只是我自己的爱好,朋友们别扔板砖)</p>
<p>下面的先从一个很简单的例子开始,让大家有点兴趣...<br>1.打开XMLSPY2005.点新建<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064115415119380.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064115415119380.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064115415119380.jpg"></a><br>选XSD&nbsp;W3C&nbsp;XML&nbsp;Schemas.<br>2.<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064115502052276.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064115502052276.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064115502052276.jpg"></a><br>作如图修改,而后点左侧的图标,进入下图<br>3.<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064115515210496.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064115515210496.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064115515210496.jpg"></a><br>在Book上点右键选择Add&nbsp;child--&gt;sequence.插入一个容器<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/2006411621349138.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/2006411621349138.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/2006411621349138.jpg"></a><br>4.在刚刚的容器上再点右键.作Add&nbsp;child--&gt;ELEMENT<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064115545652387.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064115545652387.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064115545652387.jpg"></a><br>5.做如下填加,如Setup&nbsp;4.<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064115594757184.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064115594757184.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064115594757184.jpg"></a><br>6.点选最下面的TEXT.如图<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/2006411612717442.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/2006411612717442.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/2006411612717442.jpg"></a><br>这里是源码.</p>
<p>到这里实际上我们做了一个XML&nbsp;Schemas.很简单,以后在说明<br>具体的意思.<br>我们现在可以点另存为,存为First.xsd.</p>
<p><br>下面建立关于这个这个Schemas的XML文件.<br>再次选新建(不用关闭刚刚的XSD文件),这次选XML&nbsp;DOCUMNET文件.<br>出现下图:<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/200642052079580.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/200642052079580.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/200642052079580.jpg"></a><br>选Schema.指定刚刚的XSD的保存路径.<br>这时打开是以TEXT方式,我还是选最下面的Gird,出现下图:<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/2006411692422526.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/2006411692422526.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/2006411692422526.jpg"></a><br>作如下图的改动:<br><br><img src="http://bbs.xml.org.cn/images/files/jpg.gif" border=0>此主题相关图片如下：<br><a class=contentlink href="http://bbs.xml.org.cn/uploadfile/20064116114071361.jpg" target=_blank><img alt=按此在新窗口浏览图片 src="http://bbs.xml.org.cn/uploadfile/20064116114071361.jpg" onload="javascript:if(this.width>screen.width-333)this.width=screen.width-333" border=0 src_cetemp="http://bbs.xml.org.cn/uploadfile/20064116114071361.jpg"></a><br>点保存为:First.xml</p>
<p>那么你此时可以点下边的TEXT.回到代码方式.就可以看到XML文件的内容.</p>
<p>你一定听说过"好的格式"与"有效格式"的概念.<br>到这里,你建立了一个Schemas文件,一个XML文件.<br>按F5,你可以检查这个XML文件是不是一个"好的格式",再按F8你可以查看他<br>是不是一个"有效的格式".</p>
先看一下First.xml的代码:<br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;!--&nbsp;edited&nbsp;with&nbsp;XMLSpy&nbsp;v2005&nbsp;rel.&nbsp;3&nbsp;U&nbsp;(<a class=contentlink href="http://www.altova.com/" target=_blank><u><font color=#000050>http://www.altova.com</font></u></a>)&nbsp;by&nbsp;&nbsp;()&nbsp;--&gt;<br>&lt;Book&nbsp;xmlns:xsi="<a class=contentlink href="http://www.w3.org/2001/XMLSchema-instance%22" target=_blank><u><font color=#4455aa>http://www.w3.org/2001/XMLSchema-instance"</font></u></a>&nbsp;xsi:noNamespaceSchemaLocation="First.xsd"&gt;<br>&nbsp;&lt;name&gt;XSLT&lt;/name&gt;<br>&nbsp;&lt;author&gt;Michael&nbsp;Kay&lt;/author&gt;<br>&nbsp;&lt;price&gt;$34.99USA&lt;/price&gt;<br>&lt;/Book&gt;
<p>&nbsp;</p>
<p>是不是很容易理解.可能不能理解就是那一长串的"网址",那是一个很重的概念.<br>NAMESPACE.这个先不说,我们看代码:<br>&lt;Book&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;name&gt;XSLT&lt;/name&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;author&gt;Michael&nbsp;Kay&lt;/author&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;price&gt;$34.99USA&lt;/price&gt;<br>&lt;/Book&gt;</p>
<p>&lt;Book&gt;...&lt;/Book&gt;是根元素.<br>&lt;name&gt;.&lt;author&gt;.&lt;price&gt;可以说是根元素下的子元素.</p>
<p>这里有几点注意:<br>1.一定要结束标记.如:&lt;Book&gt;...<font color=#ff0000>&lt;/Book&gt;</font><br>2.XML元素大小写是不一样的:&lt;Book&gt;...&lt;/book&gt;必定出错<br>3.要合理嵌套.&lt;Book&gt;&lt;name&gt;...&lt;/Book&gt;&lt;/name&gt;是错的<br>细节很多,不详细说明.<br>其实我们现在就可以很容易的写一个XML文档,基于这个方式.<br>但还是不提倡先写XML再写DTD或是Schemas.<br>打个比方:&nbsp;XML是一个人,DTD&nbsp;AND&nbsp;SCHEMAS是马甲.首先要理解的就是我们用DTD和Schema是为了定义和约束XML的.好,我们先把这个约束和定义做好,即先做马甲.而后再给那个人穿上..我想这样是容易的,如果你先写XML再写马甲的的话...呵呵</p>
<p>再看那个First.xsd:<br>&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>&lt;xs:schema&nbsp;xmlns:xs="<a class=contentlink href="http://www.w3.org/2001/XMLSchema%22" target=_blank><u><font color=#4455aa>http://www.w3.org/2001/XMLSchema"</font></u></a>&nbsp;elementFormDefault="qualified"&nbsp;attributeFormDefault="unqualified"&gt;<br>&nbsp;&lt;xs:element&nbsp;name="Book"&gt;<br>&nbsp;&nbsp;&lt;xs:annotation&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xs:documentation&gt;Comment&nbsp;describing&nbsp;your&nbsp;root&nbsp;element&lt;/xs:documentation&gt;<br>&nbsp;&nbsp;&lt;/xs:annotation&gt;<br>&nbsp;&nbsp;&lt;xs:complexType&gt;<br>&nbsp;&nbsp;&nbsp;&lt;xs:sequence&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="name"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="author"/&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:element&nbsp;name="price"/&gt;<br>&nbsp;&nbsp;&nbsp;&lt;/xs:sequence&gt;<br>&nbsp;&nbsp;&lt;/xs:complexType&gt;<br>&nbsp;&lt;/xs:element&gt;<br>&lt;/xs:schema&gt;</p>
<p>Schemas是以XML的表达形式定义和约束XML文件的.所以在语法上是相似的.</p>
<p>&lt;xs:schema&gt;...&lt;/xs:schema&gt;是Schemas申明.后面的接着是命名空间.<br>&lt;xs:element&nbsp;name="Book"&gt;..&lt;/xs:element&gt;是定义了元素Book.</p>
<p>&lt;xs:annotation&gt;<br>&nbsp;&nbsp;&nbsp;&nbsp;&lt;xs:documentation&gt;Comment&nbsp;describing&nbsp;your&nbsp;root&nbsp;element&lt;/xs:documentation&gt;<br>&lt;/xs:annotation&gt;<br>这个是注释.</p>
<p>&lt;xs:complexType&gt;..&lt;/xs:complex&gt;复杂类型申明.[有的朋友会问,还没学简单类型就学复杂类型,这不是...,不过说真的,先说复杂类型还是好理解.]</p>
<p>&lt;xs:sequence&gt;...&lt;/xs:sequence&gt;这其实就是在最初的时候所说的容器.相同的还有另外两个&lt;all&gt;...&lt;/all&gt;&nbsp;and&nbsp;&lt;choice&gt;..&lt;/choice&gt;&nbsp;sequence是顺序出现,all是乱序出现,choice选择性出现.如果你要在复杂类型里加入别的元素或是属性的话,那么必定有一个<br>容器!</p>
<p>&lt;xs:element&nbsp;name="name"/&gt;<br>&lt;xs:element&nbsp;name="author"/&gt;<br>&lt;xs:element&nbsp;name="price"/&gt;<br>这三个是在Sequence包围中,现在可以理解容器的概念了吧..<br>上面还有一个要说的.</p>
<p>&lt;xs:element&nbsp;name="name"/&gt;这其实是个空元素.在XML中空元素的申明就是这样子的.<br>这东西就不需要额外的结束标记了.</p>
<p><br>这是对两段代码的简单分析...</p>
写一XML文档作一小结:<br>1.元素,属性和值<br>&nbsp;&nbsp;&nbsp;&lt;name&nbsp;language="english"&gt;Tiger&lt;/name&gt;<br>2.书写XML的规则<br>&nbsp;&nbsp;&nbsp;1).根元素是必须的<br>&nbsp;&nbsp;&nbsp;2).结束标记是必须的<br>&nbsp;&nbsp;&nbsp;3).元素的嵌套要适当<br>&nbsp;&nbsp;&nbsp;4).大小写敏感<br>&nbsp;&nbsp;&nbsp;5).值必放在引号内<br>3.申明XML版本.<br>&nbsp;&nbsp;&nbsp;&lt;?xml&nbsp;version="1.0"&nbsp;encoding="UTF-8"?&gt;<br>也就这形式,注意后的UTF.如果你有中文内容,改成gb2312吧<br>这个encoding是可选的<br>只有这一个例外.没有结束标记<br>&lt;?&nbsp;&nbsp;.....&nbsp;?&gt;<br>4.增加属性,属性是给元素增加一个额外的信息<br>&lt;name<font color=#ff0000>&nbsp;language="English"</font>&gt;<br>5.空元素<br>两种表式法:<br>&nbsp;&nbsp;&nbsp;&lt;name&gt;&lt;/name&gt;<br>OR&lt;/name&gt;<br>两者是相同<br>6.注解:&lt;!--&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;--&gt;<br>7.五个特殊的符号
<p>&nbsp;</p>
<p>&nbsp;&nbsp;&nbsp;&amp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&nbsp;amp;<br>&nbsp;&nbsp;&nbsp;&lt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&nbsp;lt;<br>&nbsp;&nbsp;&nbsp;&gt;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&nbsp;gt;<br>&nbsp;&nbsp;&nbsp;"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&nbsp;quot;<br>&nbsp;&nbsp;&nbsp;'&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&amp;&nbsp;apos;</p>
<p><br>想在XML里表达出前面的符号,就用后面的代替.<br>差不多这就些吧..<br>&nbsp;&nbsp;</p>
<p>XML&nbsp;Schema</p>
<p>XML&nbsp;Schema提供一个更丰富的XML文档结构定义,Schema是XML所写,用XML规范改写的<br>DTD,同时增加扩充功能.<br>特点:1.一致性,与XML一致.可被XML编辑器编辑,可被XML分析器解析.<br>2.扩展性.对DTD进行扩充,引入数据类型<br>3.易用性.XML&nbsp;API(DOM&nbsp;AND&nbsp;SAX)只对XML实例有效.对DTD无效.<br>&nbsp;&nbsp;&nbsp;Schemas可用DOM&nbsp;和SAX方式<br>4.规范性,Schema用元素内容和属性来定义文档的整体结构,如那些元素可出现,元素间的关系,元素内容和属性,以及元素出现的顺序.<br>5.互换性.可交换彼此的Schema<br><br>（转载自&#8220;中国XML论坛&#8221;作者&#8220;starting&#8221;）</p>
<img src ="http://www.cppblog.com/totti1006/aggbug/62813.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-09-26 14:13 <a href="http://www.cppblog.com/totti1006/archive/2008/09/26/62813.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>vc++中的import的使用</title><link>http://www.cppblog.com/totti1006/archive/2008/08/28/60286.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Thu, 28 Aug 2008 09:27:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/08/28/60286.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/60286.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/08/28/60286.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/60286.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/60286.html</trackback:ping><description><![CDATA[<div class=postText>
<div>#import 指令</div>
<div>1. C++中使用 COM 簡單的方法是用 #import 導入 type library<br>2. # import 指令將 COM 產生對應的 C++類別，可以用接近於VBScript和Visual Basic的語句操作 COM<br>3. 使用 #import 命令就可以將該文件導入到我們的程式碼中。type library 的內容將被轉換為描述了 COM Interface 的 COM smart pointer<br>4. 語法<br>&nbsp;#import&nbsp; "filename" [attributes]<br>&nbsp;#import&nbsp; &lt;filename&gt; [attributes]</div>
<div>&nbsp;&nbsp; attributes:&nbsp;<br>&nbsp;用來通知編譯器修改 type library header 的內文。可以使用空白或逗號分隔 attribute。該選項為選擇性。如果 attribute 太多，可以使用 \ 斷行分隔<br>&nbsp;a) auto_rename<br>&nbsp;b) auto_search <br>&nbsp;c) embedded_idl<br>&nbsp;d) exclude<br>&nbsp;e) high_method_prefix<br>&nbsp;f) high_property_prefixes<br>&nbsp;g) implementation_only<br>&nbsp;h) include() <br>&nbsp;i) inject_statement<br>&nbsp;j) named_guids<br>&nbsp;k) no_auto_exclude<br>&nbsp;l) no_dual_interfaces<br>&nbsp;m) no_implementation no_namespace <br>&nbsp;n) no_search_namespace<br>&nbsp;o) no_smart_pointers<br>&nbsp;p) raw_dispinterfaces<br>&nbsp;q) raw_interfaces_only<br>&nbsp;r) raw_method_prefix<br>&nbsp;s) raw_native_types<br>&nbsp;t) raw_property_prefixes<br>&nbsp;u) rename<br>&nbsp;v) rename_namespace<br>&nbsp;w) rename_search_namespace<br>&nbsp;x) tlbid&nbsp; </div>
<div>&nbsp;&nbsp; filename:<br>&nbsp;你想要匯入的 type library，可以指定的值如下<br>&nbsp;a) type library (.tlb, .odl): #import "drawctl.tlb"<br>&nbsp;b) ProgID: #import "progid:my.prog.id.1.5"<br>&nbsp;&nbsp;&nbsp; 可以額外指定地區ID和版本號碼，如下：<br>&nbsp;&nbsp;&nbsp; #import "progid:my.prog.id" lcid("0") version("4.0)</div>
<div>&nbsp;&nbsp;&nbsp; 假如沒有指定地區 ID 會依循下列規則自動選擇<br>&nbsp;&nbsp;&nbsp; 1) 假如只有一個地區 ID 就直接使用 <br>&nbsp;&nbsp;&nbsp; 2) 假如有多個地區 ID，選擇版本編號的第一碼為 0, 9 或 499 的使用<br>&nbsp;&nbsp;&nbsp; 3) 假如有多個地區 ID，且版本編號的第一碼為 0, 9 或 499 有多個可以選擇，則選用最後一個<br>&nbsp;&nbsp;&nbsp; 4) 假如沒有指定版本號碼，則使用最近的版本號碼<br>&nbsp;c) type library ID: #import "libid:12341234-1234-1234-1234-123412341234" version("4.0") lcid("9")<br>&nbsp;d) 一個可執行檔(.exe)<br>&nbsp;e) 包含 type library 資訊的 dll<br>&nbsp;f) 內含 type library 的文件<br>&nbsp;g) 任何可被 LoadTypeLib 接受的檔案</div>
<div>&nbsp;filename 如果為一個實體檔案，會依循下面的規則進行搜尋<br>&nbsp;1) #import 中指定的路徑<br>&nbsp;2) 引用該檔案的程式所在路徑<br>&nbsp;3) PATH 環境變數<br>&nbsp;4) LIB 環境變數<br>&nbsp;5) 編譯器選項 /I 指定的路徑</div>
<div>5. #import 產生的 header 檔<br>&nbsp;&nbsp; 包含類似 MIDL(Microsoft Interface Definition Language) 產生的主要 header 檔，但是包含額外的編譯器產生的程式碼和資料。該檔案和 type library 具有相同的名稱但附檔名為 .tlh。第二個 header 檔也具有和 type library 相同的檔名，但附檔名為 .tli。他內含編譯器產生的成員函式的實作，且該 header 被包含在主要 header 檔(.tlh)中。<br>&nbsp;&nbsp; 假如併入(import)一個包含 byref 參數的 dispinterface property, #import 將不會產生 __declspec (property) 敘述<br>&nbsp;&nbsp; 這兩個 header 放置在&nbsp; /Fo 指定的目錄，<br>&nbsp;&nbsp; #import 在接到 type library 同時間會產生 header 檔。當 #import 處理完，編譯器會檢查檔案是否存在並且日期夠新。假如條件吻合則不重新建立。<br>&nbsp;&nbsp; #import 指令也可以放在預先編譯的 header 中，詳請參考 <a href="http://msdn.microsoft.com/library/en-us/vccore/html/_core_Creating_Precompiled_Header_Files.asp"><font color=#000080>http://msdn.microsoft.com/library/en-us/vccore/html/_core_Creating_Precompiled_Header_Files.asp</font></a></div>
<div>6. 主要的 header (.tlh)包含七個部分&nbsp;&nbsp; <br>&nbsp;&nbsp; a) 固定的標頭：包含註解、#include "COMDEF.h"和其他安裝資訊<br>&nbsp;&nbsp; b) 向前參照和 typdef<br>&nbsp;&nbsp; c) 智慧型指標宣告：樣板類別 _com_ptr_t 屬於一個智慧型指標，該類別封裝了介面指標並排除呼叫 AddRef, Release, QueryInterface 等繁瑣的步驟。另外也隱藏了 CoCreateInstance 建立一個新的 COM 物件的呼叫。這個部分使用 _COM_SMARTPTR_TYPEDEF 來產生特異化(Specialization)版本的 _com_ptr_t 類別。例如：<br>&nbsp;_COM_SMARTPTR_TYPEDEF(IMyInterface, __uuidof(IMyInterface));<br>&nbsp;編譯器會將上述的程式擴展成<br>&nbsp;typedef _com_ptr_t&lt;_com_IIID&lt;IMyInterface, __uuidof(IMyInterface)&gt; &gt; IMyInterfacePtr;<br>&nbsp;&nbsp; d) Typeinfo 宣告<br>&nbsp;&nbsp; e) 舊型 GUIDE 定義：選擇性部分，包含命名過的 GUID 常數 ，命名類似 CLSID_CoClass 和 IID_Interface，類似 MIDL 編譯器產生的資料<br>&nbsp;&nbsp; f) #include 第二個 header (*.tli)<br>&nbsp;&nbsp; g) 檔尾： #pragma pack(pop)</div>
<div>7. 使用 type library 可以用全域的解析或是明確的使用 namespace，如下<br>&nbsp;using namespace MyLib;<br>&nbsp;&nbsp; 該程式碼必須加在 #import 之後。<br>&nbsp;&nbsp; 可以使用 no_namespace attribute 不需指定 namespace，不過可能發生名稱衝突。也可以使用 rename_namespace attribute 變更 namespace 名稱。</div>
<div>參考資料：<br>[1] MSDN, <a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_The_.23.import_Directive.asp"><font color=#000080>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vclang/html/_predir_The_.23.import_Directive.asp</font></a><br>[2] Q242527 PRB: #import Wrapper Methods May Cause Access Violation <br>[3] Q269194 PRB: Compiler Errors When You Use #import with XML </div>
</div>
<img src ="http://www.cppblog.com/totti1006/aggbug/60286.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-08-28 17:27 <a href="http://www.cppblog.com/totti1006/archive/2008/08/28/60286.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DOM 读写XML文件</title><link>http://www.cppblog.com/totti1006/archive/2008/08/28/60247.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Thu, 28 Aug 2008 03:53:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/08/28/60247.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/60247.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/08/28/60247.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/60247.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/60247.html</trackback:ping><description><![CDATA[<p>//定义智能接口指针<br>#include&lt;comdef.h&gt;<br>#include&lt;msxml.h&gt;<br>_COM_SMARTPTR_TYPEDEF(IXMLDOMDocument,__uuidof(IXMLDOMDocument));<br>_COM_SMARTPTR_TYPEDEF(IXMLDOMElement,__uuidof(IXMLDOMElement));<br>_COM_SMARTPTR_TYPEDEF(IXMLDOMNodeList,__uuidof(IXMLDOMNodeList));<br>_COM_SMARTPTR_TYPEDEF(IXMLDOMNode,__uuidof(IXMLDOMNode));<br>//IXMLDOMElement 初始化指向根节点;注意相当于数据库database<br>//IXMLDOMNodeList 子节点链表;注意相当于表table;或者相当于记录recordset<br>//IXMLDOMNode 子节点链表中指定节点的指针;注意相当于得到表中指定的一条记录,也可以是单个字段</p>
<p>/*</p>
<p>#import &lt;msxml.dll&gt; named_guids<br>using namespace MSXML;<br>替代上面</p>
<p>*/</p>
<p>&nbsp;</p>
<p>bool GetxmlData(void)<br>{<br>&nbsp;bool loop=false;<br>&nbsp;//XML文档指针<br>&nbsp;HRESULT hr=S_OK;<br>&nbsp;&nbsp;&nbsp; IXMLDOMDocumentPtr ptrXMLFile=NULL;<br>&nbsp;hr=ptrXMLFile.CreateInstance(CLSID_DOMDocument);<br>&nbsp;if(SUCCEEDED(hr)&amp;&amp; ptrXMLFile!=NULL)<br>&nbsp;{<br>&nbsp;&nbsp;//得到XML文件的路径<br>&nbsp;&nbsp;CStringA path;<br>&nbsp;&nbsp;m_HttpRequest.GetPhysicalPath(path);<br>&nbsp;&nbsp;path.Append("Product.xml");<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;//加载XML文档<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; VARIANT_BOOL vbLoaded=VARIANT_FALSE;<br>&nbsp;&nbsp;ptrXMLFile-&gt;put_async(VARIANT_FALSE);<br>&nbsp;&nbsp;ptrXMLFile-&gt;load(_variant_t(path),&amp;vbLoaded);<br>&nbsp;&nbsp;<br>&nbsp;&nbsp;//成功加载后的处理<br>&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; vbLoaded==VARIANT_TRUE)<br>&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;//XML文档元素指针,初始化指向根节点;注意相当于数据库database<br>&nbsp;&nbsp;&nbsp;IXMLDOMElementPtr ptrDocRoot=NULL;<br>&nbsp;&nbsp;&nbsp;hr=ptrXMLFile-&gt;get_documentElement(&amp;ptrDocRoot);<br>&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp;ptrDocRoot!=NULL)<br>&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;//获取子节点链表;注意相当于表table;或者相当于记录recordset<br>&nbsp;&nbsp;&nbsp;&nbsp;IXMLDOMNodeListPtr ptrProductList=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrDocRoot-&gt;get_childNodes(&amp;ptrProductList);<br>&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; ptrProductList!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取子节点链表中的个数;注意相当于得到记录的个数<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;long productNum=0;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrProductList-&gt;get_length(&amp;productNum);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; productNum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取子节点链表中指定节点的指针;注意相当于得到表中指定的一条记录,<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//这里是相当整个字段<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IXMLDOMNodePtr ptrProduct=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;static long NodeNum=0;//注意事项记录号index<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrProductList-&gt;get_item(NodeNum,&amp;ptrProduct);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;loop=true;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NodeNum++;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(NodeNum&gt;productNum)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{ loop=false; }<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp;ptrProduct!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//单个字段,及name,这里也就是最小标签元素<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;IXMLDOMNodePtr Field=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;_bstr_t bField;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;BSTR Text=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bField="name";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取name元素的内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrProduct-&gt;selectSingleNode(bField,&amp;Field);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; Field!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field-&gt;get_text(&amp;Text);//修改用Field-&gt;put_text(&amp;Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_name=Text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Text=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取price1元素的内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bField="price1";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrProduct-&gt;selectSingleNode(bField,&amp;Field);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CString S1;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;wchar_t * S2;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; Field!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field-&gt;get_text(&amp;Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1=Text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S2=S1.GetBuffer(S1.GetLength());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_price[0]=_wtof(S2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysFreeString(Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Text=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取price2元素的内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; bField="price2";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrProduct-&gt;selectSingleNode(bField,&amp;Field);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; Field!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field-&gt;get_text(&amp;Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1=Text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S2=S1.GetBuffer(S1.GetLength());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_price[1]=_wtof(S2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysFreeString(Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Text=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取price3元素的内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bField="price3";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrProduct-&gt;selectSingleNode(bField,&amp;Field);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; Field!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field-&gt;get_text(&amp;Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1=Text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S2=S1.GetBuffer(S1.GetLength());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_price[2]=_wtof(S2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysFreeString(Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Text=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取price4元素的内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bField="price4";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrProduct-&gt;selectSingleNode(bField,&amp;Field);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; Field!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field-&gt;get_text(&amp;Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1=Text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S2=S1.GetBuffer(S1.GetLength());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_price[3]=_wtof(S2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysFreeString(Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Text=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获取price5元素的内容<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;bField="price5";<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;hr=ptrProduct-&gt;selectSingleNode(bField,&amp;Field);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(SUCCEEDED(hr)&amp;&amp; Field!=NULL)<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field-&gt;get_text(&amp;Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1=Text;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S2=S1.GetBuffer(S1.GetLength());<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;S1.ReleaseBuffer();<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;m_price[4]=_wtof(S2);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;SysFreeString(Text);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Text=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Field=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptrProduct=NULL;</p>
<p>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ptrProductList=NULL;<br>&nbsp;&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;&nbsp;&nbsp;ptrDocRoot=NULL;<br>&nbsp;&nbsp;&nbsp;}<br>&nbsp;&nbsp;}<br>&nbsp;&nbsp;ptrXMLFile=NULL;<br>&nbsp;}<br>&nbsp;m_start=true;<br>&nbsp;return loop; <br>}</p>
<img src ="http://www.cppblog.com/totti1006/aggbug/60247.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-08-28 11:53 <a href="http://www.cppblog.com/totti1006/archive/2008/08/28/60247.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>光模块和光纤连接器的应用指南</title><link>http://www.cppblog.com/totti1006/archive/2008/05/20/50498.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Tue, 20 May 2008 02:09:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/05/20/50498.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/50498.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/05/20/50498.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/50498.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/50498.html</trackback:ping><description><![CDATA[<p><strong>一、光收发一体模块定义</strong></p>
<p>光收发一体模块由光电子器件、功能电路和光接口等组成，光电子器件包括发射和接收两部分。发射部分是：输入一定码率的电信号经内部的驱动芯片处理后驱动半导体激光器（LD）或发光二极管（LED）发射出相应速率的调制光信号，其内部带有光功率自动控制电路，使输出的光信号功率保持稳定。接收部分是：一定码率的光信号输入模块后由光探测二极管转换为电信号。经前置放大器后输出相应码率的电信号，输出的信号一般为PECL电平。同时在输入光功率小于一定值后会输出一个告警信号。</p>
<p><strong>二、光收发一体模块分类</strong></p>
<p>按照速率分：以太网应用的100Base（百兆）、1000Base（千兆）、10GE SDH应用的155M、622M、2.5G、10G</p>
<p>按照封装分：1&#215;9、SFF、SFP、GBIC、XENPAK、XFP，各种封装见图1～6</p>
<p><strong>1&#215;9封装</strong>--焊接型光模块，一般速度不高于千兆，多采用SC接口</p>
<p><strong>SFF封装</strong>--焊接小封装光模块，一般速度不高于千兆，多采用LC接口</p>
<p><strong>GBIC封装</strong>--热插拔千兆接口光模块，采用SC接口</p>
<p><strong>SFP封装</strong>--热插拔小封装模块，目前最高数率可达4G，多采用LC接口</p>
<p><strong>XENPAK封装</strong>--应用在万兆以太网，采用SC接口</p>
<p><strong>XFP封装</strong>--10G光模块，可用在万兆以太网，SONET等多种系统，多采用LC接口</p>
<div align=left forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/fengsoul/pic/item/d4277bc4b3f94fbb8326ac69.jpg" border=0 small="0"><br>按照激光类型分：LED、VCSEL、FP LD、DFB LD
<p>按照发射波长分：850nm、1310nm、1550nm等等</p>
<p>按照使用方式分：非热插拔（1&#215;9、SFF），可热插拔（GBIC、SFP、XENPAK、XFP）</p>
<p><strong>三、光纤连接器的分类和主要规格参数</strong></p>
<p>光纤连接器是在一段光纤的两头都安装上连接头，主要作光配线使用。</p>
<p>按照光纤的类型分：单模光纤连接器（一般为G.652纤：光纤内径9um，外径125um），多模光纤连接器（一种是G.651纤其内径50um，外径125um；另一种是内径62.5um，外径125um）；</p>
<p>按照光纤连接器的连接头形式分：FC，SC，ST，LC，MU，MTRJ等等，目前常用的有FC，SC，ST，LC，见图7～10。</p>
<p><strong>FC型</strong>--最早由日本NTT研制。外部加强件采用金属套，紧固方式为螺丝扣。测试设备选用该种接头较多。</p>
<p><strong>SC型</strong>--由日本NTT公司开发的模塑插拔耦合式连接器。其外壳采用模塑工艺，用铸模玻璃纤维塑料制成，呈矩形；插针由精密陶瓷制成，耦合套筒为金属开缝套管结构。紧固方式采用插拔销式，不需要旋转。</p>
<p><strong>LC型</strong>--朗讯公司设计的。套管外径为1.25mm，是通常采用的FC-SC、ST套管外径2.5mm的一半。提高连接器的应用密度。</p>
<div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/fengsoul/pic/item/f0e33144d98b5590b3b7dc74.jpg" border=0 small="0"><br>
<p><strong>四、光模块主要参数</strong></p>
<p>1、 光模块传输数率：百兆、千兆、10GE等等</p>
<p>2、 光模块发射光功率和接收灵敏度：发射光功率指发射端的光强，接收灵敏度指可以探测到的光强度。两者都以dBm为单位，是影响传输距离的重要参数。光模块可传输的距离主要受到损耗和色散两方面受限。损耗限制可以根据公式：损耗受限距离＝（发射光功率-接收灵敏度）/光纤衰减量 来估算。光纤衰减量和实际选用的光纤相关。一般目前的G.652光纤可以做到1310nm波段0.5dB/km，1550nm波段0.3dB/km甚至更佳。50um多模光纤在850nm波段4dB/km 1310nm波段2dB/km。对于百兆、千兆的光模块色散受限远大于损耗受限，可以不作考虑。常见的光模块规格：</p>
<p>
<table cellSpacing=0 borderColorDark=#f3f3f3 cellPadding=2 width="50%" align=center borderColorLight=#cacaca border=1>
    <tbody>
        <tr align=middle bgColor=#ffffff>
            <td vAlign=top>传输数率</td>
            <td vAlign=top>发射波段</td>
            <td vAlign=top>传输使用光纤</td>
            <td vAlign=top>参考传输距离</td>
        </tr>
        <tr align=middle bgColor=#ffffff>
            <td vAlign=top>百兆</td>
            <td vAlign=top>1310nm</td>
            <td vAlign=top>多模</td>
            <td vAlign=top>2km</td>
        </tr>
        <tr align=middle bgColor=#ffffff>
            <td vAlign=top>百兆</td>
            <td vAlign=top>1310nm</td>
            <td vAlign=top>单模</td>
            <td vAlign=top>15km</td>
        </tr>
        <tr align=middle bgColor=#ffffff>
            <td vAlign=top>百兆</td>
            <td vAlign=top>1310nm</td>
            <td vAlign=top>单模</td>
            <td vAlign=top>40km</td>
        </tr>
        <tr align=middle bgColor=#ffffff>
            <td vAlign=top>百兆</td>
            <td vAlign=top>1550nm</td>
            <td vAlign=top>单模</td>
            <td vAlign=top>80km</td>
        </tr>
        <tr align=middle bgColor=#ffffff>
            <td vAlign=top>千兆</td>
            <td vAlign=top>850nm</td>
            <td vAlign=top>多模</td>
            <td vAlign=top>550m</td>
        </tr>
        <tr align=middle bgColor=#ffffff>
            <td vAlign=top>千兆</td>
            <td vAlign=top>1310</td>
            <td vAlign=top>单模/多模</td>
            <td vAlign=top>10km/550m</td>
        </tr>
        <tr align=middle bgColor=#ffffff>
            <td vAlign=top>千兆</td>
            <td vAlign=top>1550</td>
            <td vAlign=top>单模</td>
            <td vAlign=top>70km</td>
        </tr>
    </tbody>
</table>
</p>
<p>3、 10GE光模块遵循802.3ae的标准，传输的距离和选用光纤类型、光模块光性能相关。如10G－S传输距离的300m有如下条件</p>
<div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/fengsoul/pic/item/b67d3d4b25d07fe283025c70.jpg" border=0 small="0"><br>
<p>4、 饱和光功率值指光模块接收端最大可以探测到的光功率，一般为-3dBm。当接收光功率大于饱和光功率的时候同样会导致误码产生。因此对于发射光功率大的光模块不加衰减回环测试会出现误码现象。</p>
<p><strong>五、光模块功能失效重要原因</strong></p>
<p>光模块功能失效分为发射端失效和接收端失效，分析具体原因，最常出现的问题集中在以下几个方面：</p>
<p>1． 光口污染和损伤</p>
<p>由于光接口的污染和损伤引起光链路损耗变大，导致光链路不通。产生的原因有：</p>
<ol type=A>
    <li>光模块光口暴露在环境中，光口有灰尘进入而污染；
    <li>使用的光纤连接器端面已经污染，光模块光口二次污染；
    <li>带尾纤的光接头端面使用不当，端面划伤等；
    <li>使用劣质的光纤连接器； </li>
</ol>
<p>2． ESD损伤</p>
<p>ESD是ElectroStatic Discharge缩写即"静电放电"，是一个上升时间可以小于1ns（10亿分之一秒）甚至几百ps（1ps＝10000亿分之一秒）的非常快的过程，ESD可以产生几十Kv/m甚至更大的强电磁脉冲。静电会吸附灰尘，改变线路间的阻抗，影响产品的功能与寿命； ESD的瞬间电场或电流产生的热，使元件受伤，短期仍能工作但寿命受到影响；甚至破坏元件的绝缘或导体，使元件不能工作（完全破坏）。ESD是不可避免，除了提高电子元器件的抗ESD能力，重要的是正确使用，引起ESD损伤的因素有：</p>
<ol type=A>
    <li>环境干燥，易产生ESD；
    <li>不正常的操作，如：非热插拔光模块带电操作；不做静电防护直接用手接触光模块静电敏感的管脚[t2]；运输和存放过程中没有防静电包装；
    <li>设备没有接地或者接地不良； </li>
</ol>
<p><strong>六、光收发一体光模块应用注意点</strong></p>
<p>1． 光口问题</p>
<p>光链路上各处的损耗衰减都关系到传输的性能，因此要求：</p>
<ol type=A>
    <li>选择符合入网标准的光纤连接器；
    <li>光纤连接器要有封帽，不使用时盖上封帽，避免光纤连接器污染而二次污染光模块光口；封帽不使用时应放在防尘干净处保存；
    <li>光纤连接器插入是水平对准光口，避免端面和套筒划伤；
    <li>光模块光口避免长时间暴露，不使用时加盖光口塞；光口塞不使用时储存在防尘干净处；清洁光模块时根据光口类型选用合适的无尘棉棒（SC使用ф2.5mm的无尘棉棒[如NTT的14100400]，LC和MTRJ使用ф1.25mm的无尘棉棒[如NTT的14100401]）蘸上无水酒精插入光口内部，按同一方向旋转擦拭；然后再用干燥的无尘棉棒插入器件光口，按同一方向旋转擦拭；
    <li>光纤连接器的端面保持清洁，避免划伤；清洁端面时使用干燥无尘棉[如：小津产业株式会社的M－3]在手指未接触部分按如图9所示方法擦拭清洁，每次擦拭不能在同一位置；对脏污严重的接头，则将无尘棉浸无水酒精（不易过多），按相同方法进行擦拭清洁，并需更换另一干燥无尘棉按相同方法操作一次，保证接头端面干燥，再进行测试；此类清洁方法需注意擦拭长度要足够，才能保证清洁效果，并且不能在相同位置重复擦拭；此类无尘棉每张可按图示方向擦拭4次；场地不足时可将无尘棉放在手掌上，在手指未接触部分按如图10所示方法在手掌部位进行擦拭清洁，每次擦拭不能在同一位置；对脏污严重的接头，则将无尘棉浸无水酒精（不易过多），按相同方法进行擦拭清洁，并需更换另一干燥无尘棉按相同方法操作一次，保证接头端面干燥，再进行测试；此类清洁方法需注意擦拭长度要足够，才能保证清洁效果，并且不能在相同位置重复擦拭；此类无尘棉每张可按图示方向擦拭3次；也可以使用清洁器如图11～13所示； <br>
    <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/fengsoul/pic/item/0bbf100aaa47b02cb1351d94.jpg" border=0 small="0"><br>
    <p>2． ESD损伤</p>
    <p>ESD是自然界不可避免的现象，预防ESD从防止电荷积聚和让电荷快速放电两方面着手：</p>
    <ol type=A>
        <li>保持环境的湿度30～75％RH；
        <li>划定专门的防静电区域。选用防静电的地板或工作台；
        <li>使用的相关设备采用并联接地的公共接地点接地，保证接地路径最短，接地回路最小，不能串联接地，应避免采用外接电缆连接接地回路的设计方式；
        <li>在专门的防静电区域中操作，防静电工作区内禁止放置工作不必须的静电产生材料，如未作防静电处理的塑料袋、盒子、泡沫、带子、笔记本、纸片、个人用品等物品，这些材料必须距离静电敏感器件30厘米以上；
        <li>包装和周转的时候，采用防静电包装和防静电周转箱/车；
        <li>禁止对非热插拔的设备，进行带电插拔的操作；
        <li>避免用万用表表笔直接检测静电敏感的管脚；
        <li>对光模块操作时做静电防护工作（如：带静电环或将手通过预先接触机壳等手段释放静电），接触光模块壳体，避免接触光模块PIN脚； </li>
    </ol>
    <p><strong>七、简易光模块失效判断步骤</strong></p>
    <p>1．测试光功率是否在指标要求范围之内，如果出现无光或者光功率小的现象。处理方法：</p>
    <ol type=A>
        <li>检查光功率选择的波长和测量单位（dBm）
        <li>清洁光纤连接器端面，光模块光口，方法见第五节。
        <li>检查光纤连接器端面是否发黑和划伤，光纤连接器是否存在折断，更换光纤连接器做互换性试验
        <li>检查光纤连接器是否存在小的弯折。
        <li>热插拔光模块可以重新插拔测试。
        <li>同一端口更换光模块或者同一光模块更换端口测试。 </li>
    </ol>
    <p>2．光功率正常但是链路无法通，检查link灯。</p>
    <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/fengsoul/pic/item/b1b6443f5035a8d07d1e7196.jpg" border=0 small="0"><br>
    <p>3． 客户端光模块无光输出</p>
    <p>分析结果：故障品返回后故障复现，定位LD不发光。分解LD，其内部芯片电镜图分析为ESD和EOS导致故障。 </p>
    <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/fengsoul/pic/item/e0aa34c2a4bdde090ef47790.jpg" border=0 small="0"><br><strong>九、附件--光纤端面要求<br>
    <div forimg="1"><img class=blogimg src="http://hiphotos.baidu.com/fengsoul/pic/item/260a070a8deb290d95ca6b92.jpg" border=0 small="0"></div>
    </strong></div>
    </div>
    </div>
    </li>
</ol>
</div>
</div>
</div>
<img src ="http://www.cppblog.com/totti1006/aggbug/50498.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-05-20 10:09 <a href="http://www.cppblog.com/totti1006/archive/2008/05/20/50498.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>光模块</title><link>http://www.cppblog.com/totti1006/archive/2008/05/19/50395.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Mon, 19 May 2008 07:41:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/05/19/50395.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/50395.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/05/19/50395.html#Feedback</comments><slash:comments>4</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/50395.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/50395.html</trackback:ping><description><![CDATA[<p><strong><span>一、光收发一体模块定义</span></strong><strong><span><font face="Times New Roman"> </font></span></strong></p>
<p><span>光收发一体模块由光电子器件、功能电路和光接口等组成，光电子器件包括发射和接收两部分。发射部分是：输入一定码率的电信号经内部的驱动芯片处理后驱动半导体激光器（</span><span><font face="Times New Roman">LD</font></span><span>）或发光二极管（</span><span><font face="Times New Roman">LED</font></span><span>）发射出相应速率的调制光信号，其内部带有光功率自动控制电路，使输出的光信号功率保持稳定。接收部分是：一定码率的光信号输入模块后由光探测二极管转换为电信号。经前置放大器后输出相应码率的电信号，输出的信号一般为</span><span><font face="Times New Roman">PECL</font></span><span>电平。同时在输入光功率小于一定值后会输出一个告警信号。</span><span><font face="Times New Roman"> </font></span></p>
<p><strong><span>二、光收发一体模块分类</span></strong><strong><span><font face="Times New Roman"> </font></span></strong></p>
<p><span>按照速率分：以太网应用的</span><span><font face="Times New Roman">100Base</font></span><span>（百兆）、</span><span><font face="Times New Roman">1000Base</font></span><span>（千兆）、</span><span><font face="Times New Roman">10GE SDH</font></span><span>应用的</span><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="155" unitname="m"><span><font face="Times New Roman">155M</font></span></st1:chmetcnv><span>、</span><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="622" unitname="m"><span><font face="Times New Roman">622M</font></span></st1:chmetcnv><span>、</span><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="2.5" unitname="g"><span><font face="Times New Roman">2.5G</font></span></st1:chmetcnv><span>、</span><font face="Times New Roman"><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="10" unitname="g"><span>10G</span></st1:chmetcnv><span> </span></font></p>
<p><span>按照封装分：</span><span><font face="Times New Roman">1&#215;9</font></span><span>、</span><span><font face="Times New Roman">SFF</font></span><span>、</span><span><font face="Times New Roman">SFP</font></span><span>、</span><span><font face="Times New Roman">GBIC</font></span><span>、</span><span><font face="Times New Roman">XENPAK</font></span><span>、</span><span><font face="Times New Roman">XFP</font></span><span>，各种封装见图</span><span><font face="Times New Roman">1</font></span><span>～</span><span><font face="Times New Roman">6 </font></span></p>
<p><strong><span><font face="Times New Roman">1&#215;9</font></span></strong><strong><span>封装</span></strong><span><font face="Times New Roman">--</font></span><span>焊接型光模块，一般速度不高于千兆，多采用</span><span><font face="Times New Roman">SC</font></span><span>接口</span><span><font face="Times New Roman"> </font></span></p>
<p><strong><span><font face="Times New Roman">SFF</font></span></strong><strong><span>封装</span></strong><span><font face="Times New Roman">--</font></span><span>焊接小封装光模块，一般速度不高于千兆，多采用</span><span><font face="Times New Roman">LC</font></span><span>接口</span><span><font face="Times New Roman"> </font></span><span>。</span><span><font face="Times New Roman">SFF</font></span><span>（</span><span><font face="Times New Roman">Small Form Factor</font></span><span>）小封装光模块采用了先进的精密光学及电路集成工艺，尺寸只有普通双工</span><span><font face="Times New Roman">SC</font></span><span>（</span><span><font face="Times New Roman">1X9</font></span><span>）型光纤收发模块的一半，在同样空间可以增加一倍的光端口数，可以增加线路端口密度，降低每端口的系统成本。又由于</span><span><font face="Times New Roman">SFF</font></span><span>小封装模块采用了与铜线网络类似的</span><span><font face="Times New Roman">MT-RJ</font></span><span>接口，大小与常见的电脑网络铜线接口相同，有利于现有以铜缆为主的网络设备过渡到更高速率的光纤网络以满足网络带宽需求的急剧增长。</span></p>
<p><strong><span><font face="Times New Roman">GBIC</font></span></strong><strong><span>封装</span></strong><span><font face="Times New Roman">--</font></span><span>热插拔千兆接口光模块，采用</span><span><font face="Times New Roman">SC</font></span><span>接口</span><span><font face="Times New Roman"> </font></span><span>。</span><span><font face="Times New Roman">GBIC</font></span><span>是</span><span><font face="Times New Roman">Giga Bitrate Interface Converter</font></span><span>的缩写，是将千兆位电信号转换为光信号的接口器件。</span><span><font face="Times New Roman">GBIC</font></span><span>设计上可以为热插拔使用。</span><span><font face="Times New Roman">GBIC</font></span><span>是一种符合国际标准的可互换产品。采用</span><span><font face="Times New Roman"> GBIC</font></span><span>接口设计的千兆位交换机由于互换灵活，在市场上占有较大的市场分额。</span></p>
<p><strong><span><font face="Times New Roman">SFP</font></span></strong><strong><span>封装</span></strong><span><font face="Times New Roman">--</font></span><span>热插拔小封装模块，目前最高数率可达</span><st1:chmetcnv tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="4" unitname="g"><span><font face="Times New Roman">4G</font></span></st1:chmetcnv><span>，多采用</span><span><font face="Times New Roman">LC</font></span><span>接口</span><span><font face="Times New Roman"> </font></span><span>。</span><span><font face="Times New Roman">SFP</font></span><span>是</span><span><font face="Times New Roman">SMALL FORM PLUGGABLE</font></span><span>的缩写，可以简单的理解为</span><span><font face="Times New Roman">GBIC</font></span><span>的升级版本。</span><span><font face="Times New Roman">SFP</font></span><span>模块体积比</span><span><font face="Times New Roman">GBIC</font></span><span>模块减少一半，可以在相同的面板上配置多出一倍以上的端口数</span><span><font face="Times New Roman"> </font></span><span>量。</span><span><font face="Times New Roman">SFP</font></span><span>模块的其他功能基本和</span><span><font face="Times New Roman">GBIC</font></span><span>一致。有些交换机厂商称</span><span><font face="Times New Roman">SFP</font></span><span>模块为小型化</span><span><font face="Times New Roman">GBIC</font></span><span>（</span><span><font face="Times New Roman">MINI-GBIC</font></span><span>）</span></p>
<p><strong><span><font face="Times New Roman">XENPAK</font></span></strong><strong><span>封</span></strong><span>装</span><span><font face="Times New Roman">--</font></span><span>应用在万兆以太网，采用</span><span><font face="Times New Roman">SC</font></span><span>接口</span><span><font face="Times New Roman"> </font></span></p>
<p><strong><span><font face="Times New Roman">XFP</font></span></strong><strong><span>封装</span></strong><span><font face="Times New Roman">-<st1:chmetcnv tcsc="0" numbertype="1" negative="True" hasspace="False" sourcevalue="10" unitname="g">-10G</st1:chmetcnv></font></span><span>光模块，可用在万兆以太网，</span><span><font face="Times New Roman">SONET</font></span><span>等多种系统，多采用</span><span><font face="Times New Roman">LC</font></span><span>接口</span><span><font face="Times New Roman"> <br><br></p>
<p>1.发展的方向之一：小型化 </p>
<p>光收发模块作为光纤接入网的核心器件推动了干线光传输系统向低成本方向发展，使得光网络的配置更加完备合理。光收发模块由光电子器件、功能电路和光接口等结构件组成，光电子器件包括发射和接收两部分，发射部分包括LED、VCSEL、FP LD、DFB LD等几种光源；接收部分包括PIN型和APD型两种光探测器。 <br></p>
<p><br>
<table>
    <tbody>
        <tr>
            <td>　　类型</td>
            <td></td>
            <td>　　工作波长　　(nm)</td>
            <td>　　特点</td>
        </tr>
        <tr>
            <td>　　LED</td>
            <td>　　Light Emitting</td>
            <td>　　850</td>
            <td>　　低成本，性能一般，只能用于100M左右低速传输</td>
        </tr>
        <tr>
            <td>　　FP</td>
            <td>　　Fabry-Perot Laser</td>
            <td>　　1310</td>
            <td>　　通用，性能尚可，可用于中距离高速传输</td>
        </tr>
        <tr>
            <td rowSpan=2>　　DFB</td>
            <td rowSpan=2>　　Distribution-Feedback Leaser</td>
            <td>　　1310</td>
            <td rowSpan=2>　　成本较高，能提供较高功率，用于长途传输</td>
        </tr>
        <tr>
            <td>1550</td>
        </tr>
        <tr>
            <td rowSpan=2>　　VCSEL</td>
            <td rowSpan=2>　　Verical Cavity Suface Emitting Laser</td>
            <td>　　850</td>
            <td rowSpan=2>　　生产成本低，短距离传输，可用于高速</td>
        </tr>
        <tr>
            <td>1310</td>
        </tr>
        <tr>
            <td rowSpan=2>　　EML</td>
            <td rowSpan=2>　　Electro-Absorption Modulator with Laser</td>
            <td>　　1310</td>
            <td rowSpan=2>　　成本很高，且需要提供较高的电压，但可传输100KM以上的距离</td>
        </tr>
        <tr>
            <td>1550</td>
        </tr>
        <tr>
            <td>　　MZ</td>
            <td>　　Mach-Zender Modulator</td>
            <td></td>
            <td>　　使用很少，工艺复杂</td>
        </tr>
    </tbody>
</table>
<br>目前的光通信市场竞争越来越激烈，通信设备要求的体积越来越小，接口板包含的接口密度越来越高。传统的激光器和探测器分离的光模块，已经很难适应现代通信设备的要求。为了适应通信设备对光器件的要求，光模块正向高度集成的小封装发展。高度集成的光电模块使用户无须处理高速模拟光电信号，缩短研发和生产周期，减少元气件采购种类，减少生产成本，因此也越来越受到设备制造商的青睐。 </p>
<p>目前光收发模块中的光电器件的封装由较大尺寸的双列直插形式为主发展为以同轴封装形式为主；光接口等结构件从ST、FC发展到SC及更小尺寸的LC、MT-RJ型连接口形式，相应的光收发模块的封装形式也从金属封装发展到塑料封装，由单接口的分离模块发展到双接口的收发一体模块。管脚排列及封装由双列直插20脚、16脚分离模块发展到单排9脚(1X9)、双排9脚(2X9)以及今后的双排10脚和双排20脚的收发一体模块。SFF（Small Form Factor）小封装光模块采用了先进的精密光学及电路集成工艺，尺寸只有普通双工SC（1X9）型光纤收发模块的一半，在同样空间可以增加一倍的光端口数，可以增加线路端口密度，降低每端口的系统成本。又由于SFF小封装模块采用了与铜线网络类似的MT-RJ接口，大小与常见的电脑网络铜线接口相同，有利于现有以铜缆为主的网络设备过渡到更高速率的光纤网络以满足网络带宽需求的急剧增长。 </p>
<p>小封装光收发模块以其外观封装体积小的优势，使网络设备的光纤接口数目增加了一倍，单端口速率达到吉比特量级，能够满足INTERNET时代网络带宽需求的快速增长。可以说小封装光收发模块技术代表了新一代光通信器件的发展趋势，是下一代高速网络的基石。国外各大光模块供应商已生产了各种用于不同速率和距离的小封装光模块，国内一些光器件供应商（像上海大亚光电）也开始研发和生产各速率SFF小封装光模块。 </p>
<p>2.发展的方向之二：低成本、低功耗 </p>
<p>通信设备的体积越来越小，接口板包含的接口密度越来越高，要求光电器件向低成本、低功耗的方向发展。 </p>
<p>目前光器件一般均采用混合集成工艺和气密封装工艺，下一步的发展将是非气密的封装，需要依靠无源光耦合(非X-Y-Z方向的调整)等技术进一步提高自动化生产程度，降低成本。随着光收发模块市场需求的迅速增长，功能电路部分专用集成电路的供应商也逐渐增多，供应商在规模化、系列化方面的积极投资使得此类IC的性能越来越完善，成本也越来越低，从而缩短了光收发模块的开发周期，降低了成本。尤其是处理高速、小信号、高增益的前置放大器采用的是GaAs工艺和技术，SiGe技术的发展，使得这类芯片的成品率及制造成本得到很好的控制，同时可进一步降低功耗。另外采用非制冷激光器也进一步降低了光模块的制造成本。目前的小封装光模块也都采用低电压3.3v供电，保证了端口的增加不会提高系统的功耗。 </p>
<p>3.发展的方向之三：高速率 </p>
<p>人们对信息量要求越来越多，对信息传递速率要求越来越快，作为现代信息交换、处理和传输主要支柱的光通信网，一直不断向超高频、超高速和超大容量发展，传输速率越高、容量越大，传送每个信息的成本就越来越小。长途大容量方面当前的热点是10 Gbit/s 和40Gbit/s，据ElectroniCast最新的市场研究，10 Gbit/s数据通信收发模块的全球总消费量将从2001年的1.57亿美元增长到2010年的90亿美元。2001年早期使用10 Gbit/s数据通信收发器的数量不到10万个，但到2003年，10 Gbit/s数据通信收发模块将增加到200万个。在接下来的几年内仍将会猛烈增长，2005年将会达到700万个。在整个消费领域，继10-gigabit 光纤通道之后，10-gigabit以太网将会有强烈的影响。目前SDH单通道光系统正向40Gbit/s冲击。高速系统和器件方面,很多公司今年推出了40Gbit/s系统。40Gbit/s方面目前的重点产品技术是：大功率波长可调/固定激光器、 40G调制器（Inp EAM、LiNbO3EOM、Polymer EOM）、高速电路（InP、GeSi材料）、波长锁定器、低色散滤波器、动态均衡器、喇曼放大器、低色散开关、40Gbit/sPD（PIN、APD）、可调色散补偿器组件（TU-DCM），前向纠误（FEC）等。 </p>
<p>从现阶段电路技术来说，40Gbit/s已接近&#8220;电子瓶颈&#8221;的极限。速率再高，引起的信号损耗、功率耗散、电磁辐射（干扰）和阻抗匹配等问题难以解决，即使解决，则要花费非常大的代价。 </p>
<p>4.发展的方向之四：远距离 </p>
<p>光收发模块的另一个发展方向是远距离。如今的光网络铺设距离越来越远，这要求远程收发器来与之匹配。典型的远程收发器信号在未经放大的条件下至少能传输100公里，其目的主要是省掉昂贵的光放大器，降低光通讯的成本。基于传输距离上的考虑，很多远程收发器都选择了1550波段(波长范围约为1530到1565nm)作为工作波段，因为光波在该范围内传输时损耗最小，而且可用的光放大器都是工作在该波段。 </p>
<p>5.发展的方向之五：热插拔 </p>
<p>未来的光模块必须支持热插拔，即无需切断电源，模块即可以与设备连接或断开，由于光模块是热插拔式的，网络管理人员无需关闭网络就可升级和扩展系统，对在线用户不会造成什么影响。热插拔性也简化了总的维护工作，并使得最终用户能够更好地管理他们的收发模块。同时，由于这种热交换性能，该模块可使网络管理人员能够根据网络升级要求，对收发成本、链路距离以及所有的网络拓扑进行总体规划，而无需对系统板进行全部替换。支持这热插拔的光模块目前有GBIC和SFP（Small Form pluggable），由于SFP与SFF的外型大小差不多，它可以直接插在电路板上，在封装上较省空间与时间，且应用面相当广，因此，其未来发展很值得期待，甚至有可能威胁到SFF的市场。 </p>
<br><br>光纤是如何工作的？ [/b]<br>通讯用光纤由外覆塑料保护层的细如毛发的玻璃丝组成。玻璃丝实质上由两部分组成：核心直径为9到62.5&amp;micro;m，外覆直径为125&amp;micro;m的低折射率的玻璃材料。 虽然按所用的材料及不同的尺寸而分还有一些其它种类的光纤，但这里提到的是最常见的那几种。光在光纤的芯层部分以&#8220;全内反射&#8221;方式进行传输，也就是指光线 进入光纤的一端后，在芯层和包层界面之间来回反射，进而传输到光纤另一端。芯径为62.5&amp;micro;m，包层外径为125&amp;micro;m的光纤称为62.5/125&amp;micro;m 光纤。 <br><br>[b]2. 多模和单模的区别是什么？ [/b]<br>[b]多模： [/b]<br>几乎所有的多模光纤尺寸均为50/125&amp;micro;m或62.5/125&amp;micro;m，并且带宽（光纤的信息传输量）通常为200MHz到2GHz。多模光端机通过多模光纤可进行长达5公里的传输。以发光二极管或激光器为光源。 <br>[b]单模： [/b]<br>单模光纤的尺寸为9-10/125&amp;micro;m，并且较之多模光纤具有无限量带宽和更低损耗的特性。而单模光端机多用于长距离传输，有时可达到150至200公里。采用LD或光谱线较窄的LED作为光源。 <br>[b]区别与联系： [/b]<br>单模光纤价格便宜，但单模设备较之同类的 多模设备却昂贵很多。单模设备通常既可在单模光纤上运行，亦可在多模光纤上运行，而多模设备只限于在多模光纤上运行。 <br><br>[b]3. 使用光缆时传输损耗如何？ [/b]<br>这取决于传输光的波长以及所使用光纤的种类。 <br>850nm波长用于多模光纤时: 3.0分贝/公里 <br>1310nm波长用于多模光纤时: 1.0分贝/公里 <br>1310nm波长用于单模光纤时: 0.4分贝/公里 <br>1550nm波长用于单模光纤时: 0.2分贝/公里&nbsp;<br><br>[b]网络连接设备接口类型[/b] <br>[b]BNC接口[/b]<br>BNC接口是指同轴电缆接口，BNC接口用于75欧同轴电缆连接用，提供收（RX）、发（TX）两个通道，它用于非平衡信号的连接。<br>[b]光纤接口[/b] <br>光纤接口是用来连接光纤线缆的物理接口。通常有SC、ST、LC、FC等几种类型。对于10Base-F连接来说，连接器通常是ST类型，另一端FC连的是光纤步线架。FC是Ferrule Connector的缩写，其外部加强方式是采用金属套，紧固方式为螺丝扣。ST接口通常用于10Base-F，SC接口通常用于100Base-FX和GBIC，LC通常用于SFP 。<br>&nbsp;[b]RJ-45接口[/b]<br>RJ-45接口是以太网最为常用的接口，RJ-45是一个常用名称，指的是由IEC（60）603-7标准化，使用由国际性的接插件标准定义的8个位置（8针）的模块化插孔或者插头。<br><br>[b]RS-232接口[/b]<br>RS-232-C接口（又称 EIA RS-232-C）是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会（EIA）联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是&#8220;数据终端设备（DTE）和数据通讯设备（DCE）之间串行二进制数据交换 接口技术标准&#8221;。该标准规定采用一个25个脚的DB25连接器，对连接器的每个引脚的信号内容加以规定，还对各种信号的电平加以规定。<br><br>[b]RJ-11接口[/b]<br>RJ-11接口就是我们平时所说的电话线接口。RJ-11是用于西部电子公司（Western Electric）开发的接插件的通用名称。其外形定义为6针的连接器件。原名为WExW，这里的x表示&#8220;活性&#8221;，触点或者打线针。例如， WE6W 有全部6个触点，编号1到6, WE4W 界面只使用4针，最外面的两个触点(1和6) 不用，WE2W 只使用中间两针（即电话线接口用）。<br><br><br>以太网交换机常用的光模块有SFP，GBIC，XFP，XENPAK。它们的英文全称，中文名不常用，可以简单了解下<br>SFP: Small Form-factor Pluggable transceiver ，小封装可插拔收发器<br>GBIC ：GigaBit Interface Converter，千兆以太网接口转换器<br>XFP: 10-Gigabit&nbsp;&nbsp;small Form-factor Pluggable transceiver&nbsp;&nbsp;万兆以太网接口小封装可插拔收发器<br>XENPAK:&nbsp;&nbsp;10 Gigabit EtherNet Transceiver PAcKage万兆以太网接口收发器集合封装<br>通过diplay interface命令可以在软件中显示光模块的端口类型信息，显示格式为<br>XXXX_BASE_YY[_AAAA]_ZZZ[_BBBB]，各字段含义如下表所示<br>字段名称<br>含义<br>取值<br>取值说明<br>XXXX<br>光模块支持的最高速率<br>10G<br>10GE<br>&nbsp;&nbsp;<br>1000<br>1000M<br>&nbsp;&nbsp;<br>100<br>100M<br>YY<br>传输距离<br>SX<br>短距<br>&nbsp;&nbsp;<br>LX<br>中距<br>&nbsp;&nbsp;<br>LH+传输距离<br>长距<br>&nbsp;&nbsp;<br>T<br>电接口<br>ZZZ<br>连接器类型<br>SFP<br>SFP接口<br>&nbsp;&nbsp;<br>GBIC<br>GBIC接口<br>&nbsp;&nbsp;<br>XENPAK<br>XENPAK接口<br>&nbsp;&nbsp;<br>XFP<br>XFP接口<br>AAAA<br>接口光纤类型<br>MM+中心波长<br>多模光纤<br>&nbsp;&nbsp;<br>SM+中心波长<br>单模光纤<br>BBBB<br>附加特性（可选）<br>BIDI<br>单纤双向模块<br>&nbsp;&nbsp;<br>CWDM<br>CWDM 模块<br>&nbsp;&nbsp;<br>STACK<br>堆叠模块<br>对于没有插入光模块的接口，显示为ZZZ_NO_CONNECTOR，其中ZZZ与上述连接器类型一致。<br>对于不能识别的光模块，显示为ZZZ_UNKNOWN_CONNECTOR，其中ZZZ与上述连接器类型一致。<br>对于无附加特性项的模块，不显示附加特性项<br>如：显示以太网端口GigabitEthernet2/1/1的端口信息如下<br>[fabric-56]display intterface g2/1/1<br>GigabitEthernet2/1/1 current state : UP<br>IP Sending Frames' Format is PKTFMT_ETHNT_2, Hardware address is 00e0-fc10-4378<br>Media type is optical fiber, loopback not set<br>Port hardware type is 1000_BASE_SX_SFP<br>sx表示该端口为短距1000M SFP模块<br>参数<br>含义<br>850nm&nbsp;&nbsp;1310nm&nbsp;&nbsp;1550nm<br>光波波长<br>100Mbps&nbsp;&nbsp;1000Mbps<br>传输速率<br>10km&nbsp;&nbsp;30km&nbsp;&nbsp;70km<br>链路长度<br>SX&nbsp;&nbsp;LX<br>激光器类型（短波&nbsp;&nbsp;长波）<br>SM&nbsp;&nbsp;MM <br>工作模式（单模 多模）<br>光纤连接器<br>光纤连接器由光纤和光纤两端的插头组成，插头由插针和外围的锁紧结构组成。根据不同的锁紧机制，光纤连接器可以分为FC型、SC型、LC型、ST型和MTRJ型。<br>FC连接器采用螺纹锁紧机构，是发明较早、使用最多的一种光纤活动连接器。<br>SC是一种矩形的接头，由NTT研制，不用螺纹连接，可直接插拔，与FC连接器相比具有操作空间小，使用方便。低端以太网产品非常常见。<br>LC是由LUCENT开发的一种Mini型的SC连接器，具有更小的体积，已广泛在系统中使用，是今后光纤活动连接器发展的一个方向。低端以太网产品非常常见。<br>ST连接器是由AT&amp;T公司开发的，用卡口式锁紧机构，主要参数指标与FC和SC连接器相当，但在公司应用并不普遍，通常都用在多模器件连接，与其它厂家设备对接时使用较多。<br>MTRJ的插针是塑料的，通过钢针定位，随着插拔次数的增加，各配合面会发生磨损，长期稳定性不如陶瓷插针连接器。<br>光纤知识<br>光纤是传输光波的导体。光纤从光传输的模式来分可分为单模光纤和多模光纤。<br>在单模光纤中光传输只有一种基模模式，也就是说光线只沿光纤的内芯进行传输。由于完全避免了模式射散使得单模光纤的传输频带很宽因而适用与高速，长距离的光纤通迅。<br>在多模光纤中光传输有多个模式，由于色散或像差，这种光纤的传输性能较差，频带窄，传输速率较小，距离较短。<br>光纤的特性参数<br>光纤的结构预制的石英光纤棒拉制而成，通信用的多模光纤和单模光纤的外径都为125&#956;m。<br>纤体分为两个区域：纤芯(Core)和包层(Cladding layer)。单模光纤纤芯直径为8~10&#956;m，多模光纤纤芯径有两种标准规格，芯径分别为62.5&#956;m（美国标准）和50&#956;m（欧洲标准）。<br>我们在用户资料中经常看到对接口光纤规格有这样的描述：62.5&#956;m/125&#956;m多模光纤，其中62.5&#956;m就是指光纤的芯径，125&#956;m就是指光纤的外径。<br>单模光纤使用的光波长为1310nm或1550 nm。<br>多模光纤使用的光波长多为850 nm。<br>从颜色上可以区分单模光纤和多模光纤。单模光纤外体为黄色，多模光纤外体为橘红色。<br><br>千兆光口自协商<br>千兆光口可以工作在强制和自协商两种模式。802.3规范中千兆光口只支持1000M速率，支持全双工（Full）和半双工（Half）两种双工模式。<br>自协商和强制最根本的区别就是两者再建立物理链路时发送的码流不同，自协商模式发送的是/C/码，也就是配置（Configuration）码流，而强制模式发送的是/I/码，也就是idle码流。<br>千兆光口自协商过程<br>一、两端都设置为自协商模式<br>双方互相发送/C/码流，如果连续接收到3个相同的/C/码且接收到的码流和本端工作方式相匹配，则返回给对方一个带有Ack应答的/C/码，对端接收到Ack信息后，认为两者可以互通，设置端口为UP状态<br>二、一端设置为自协商，一端设置为强制<br>自协商端发送/C/码流，强制端发送/I/码流，强制端无法给对端提供本端的协商信息，也无法给对端返回Ack应答，故自协商端DOWN。但是强制端本身可以识别/C/码，认为对端是与自己相匹配的端口，所以直接设置本端端口为UP状态<br>三、两端均设置为强制模式<br>双方互相发送/I/码流，一端接收到/I/码流后，认为对端是与自己相匹配的端口，直接设置本端端口为UP状态<br></font></span>
<img src ="http://www.cppblog.com/totti1006/aggbug/50395.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-05-19 15:41 <a href="http://www.cppblog.com/totti1006/archive/2008/05/19/50395.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>TTL电平和CMOS电平</title><link>http://www.cppblog.com/totti1006/archive/2008/05/13/49695.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Tue, 13 May 2008 01:02:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/05/13/49695.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/49695.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/05/13/49695.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/49695.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/49695.html</trackback:ping><description><![CDATA[TTL电平：<br>&nbsp;&nbsp;&nbsp;输出高电平&nbsp;&nbsp;〉2.4V&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输出低电平&nbsp;〈0.4V<br>&nbsp;&nbsp;在室温下，一般输出高电平是3.5V&nbsp;&nbsp;输出低电平是0.2V。<br>&nbsp;&nbsp;&nbsp;最小输入高电平和低电平<br>&nbsp;&nbsp;&nbsp;输入高电平&nbsp;&nbsp;〉=2.0V&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;输入低电平&nbsp;&nbsp;《=0.8V&nbsp;&nbsp;&nbsp;<br>它的噪声容限是0.4V.<br>CMOS电平：<br>&nbsp;&nbsp;1逻辑电平电压接近于电源电压，0逻辑电平接近于0V。而且具有很宽的噪声容限。<br><br>电平转换电路：因为TTL和COMS的高低电平的值不一样（ttl&nbsp;5v《＝＝》cmos&nbsp;3。3v），所以互相连接时需要电平的转换：就<br>是用两个电阻对电平分压，没有什么高深的东西。<br><br><br>OC门，即集电极开路门电路，它必须外界上拉电阻和电源才能将开关电平作为高低电平用。否则它一般只作为开关大电压和<br>大电流负载，所以&nbsp;&nbsp;又叫做驱动门电路。<br><br>TTL和COMS电路比较：<br>1、TTL电路是电流控制器件，而coms电路是电压控制器件。<br>2、TTL电路的速度快，传输延迟时间短(5-10ns)，但是功耗大。<br>&nbsp;&nbsp;&nbsp;COMS电路的速度慢，传输延迟时间长(25--50ns),但功耗低。<br>&nbsp;&nbsp;&nbsp;COMS电路本身的功耗与输入信号的脉冲频率有关，频率越高，芯片集越热，这是正常现象。<br>3、COMS电路的锁定效应：<br>&nbsp;&nbsp;&nbsp;COMS电路由于输入太大的电流，内部的电流急剧增大，除非切断电源，电流一直在增大。这种效应就是锁定效应。当产生<br>锁定效应时，COMS的内部电流能达到40mA以上，很容易烧毁芯片。<br>防御措施：<br>&nbsp;&nbsp;(1)、在输入端和输出端加钳位电路，使输入和输出不超过不超过规定电压。<br>&nbsp;&nbsp;(2)、芯片的电源输入端加去耦电路，防止VDD端出现瞬间的高压。<br>&nbsp;&nbsp;(3)、在VDD和外电源之间加线流电阻，即使有大的电流也不让它进去。<br>&nbsp;&nbsp;(4)、当系统由几个电源分别供电时，开关要按下列顺序：开启时，先开启COMS电路得电源，再开启输入信号和负载的电<br>源；关闭时，先关闭输入信号和负载的电源，再关闭COMS电路的电源。<br><br>4、COMS电路的使用注意事项<br>&nbsp;&nbsp;(1)、COMS电路时电压控制器件，它的输入总抗很大，对干扰信号的捕捉能力很强。所以，不用的管脚不要悬空，要接上拉<br>电阻或者下拉电阻，给它一个恒定的电平。<br>&nbsp;&nbsp;(2)、输入端接低内组的信号源时，要在输入端和信号源之间要串联限流电阻，使输入的电流限制在1mA之内。<br>&nbsp;&nbsp;(3)、当接长信号传输线时，在COMS电路端接匹配电阻。<br>&nbsp;&nbsp;(4)、当输入端接大电容时，应该在输入端和电容间接保护电阻。电阻值为R=V0/1mA.V0是外界电容上的电压。<br>&nbsp;&nbsp;(5)、COMS的输入电流超过1mA，就有可能烧坏COMS。&nbsp;<br>&nbsp;&nbsp;&nbsp;<br><br><br>5、TTL门电路中输入端负载特性（输入端带电阻特殊情况的处理）：<br>&nbsp;&nbsp;1、悬空时相当于输入端接高电平。因为这时可以看作是输入端接一个无穷大的电阻。<br>&nbsp;&nbsp;2、在门电路输入端串联10K电阻后再输入低电平，输入端出呈现的是高电平而不是低电平。因为由TTL门电路的输入端负载<br>特性可知，只有在输入端接的串联电阻小于910欧时，它输入来的低电平信号才能被门电路识别出来，串联电阻再大的话输入<br>端就一直呈现高电平。这个一定要注意。<br>COMS门电路就不用考虑这些了。<br><br><br>6、TTL电路有集电极开路OC门，MOS管也有和集电极对应的漏极开路的OD门，它的输出就叫做开漏输出。<br>&nbsp;&nbsp;&nbsp;OC门在截止时有漏电流输出，那就是漏电流，为什么有漏电流呢？那是因为当三机管截止的时候，它的基极电流约等于<br>0，但是并不是真正的为0，经过三极管的集电极的电流也就不是真正的0，而是约0。而这个就是漏电流。<br>&nbsp;&nbsp;&nbsp;开漏输出：OC门的输出就是开漏输出；OD门的输出也是开漏输出。它可以吸收很大的电流，但是不能向外输出的电流。所<br>以，为了能输入和输出电流，它使用的时候要跟电源和上拉电阻一齐用。<br><br>&nbsp;&nbsp;&nbsp;OD门一般作为输出缓冲/驱动器、电平转换器以及满足吸收大负载电流的需要。<br>7、什么叫做图腾柱，它与开漏电路有什么区别？<br><br>TTL集成电路中，输出有接上拉三极管的输出叫做图腾柱输出，没有的叫做OC门。因为TTL就是一个三级&nbsp;&nbsp;&nbsp;关，图腾柱也就是<br>两个三级管推挽相连。所以推挽就是图腾。<br>一般图腾式输出，高电平400UA，低电平8MA&nbsp;<br>&nbsp;&nbsp;<br>TTL电平（L电平：小于等于0.8V&nbsp;；H电平：大于等于2V）&nbsp;<br>COMS电平（L电平：小于等于0.3Vcc&nbsp;；H电平：大于等于0.7Vcc）&nbsp;<br><br>CMOS&nbsp;器件不用的输入端必须连到高电平或低电平,&nbsp;这是因为&nbsp;CMOS&nbsp;是高输入阻抗器件,&nbsp;理想状态是没有输入电流的.&nbsp;如果不用的输入引脚悬空,&nbsp;很容易感应到干扰信号,&nbsp;影响芯片的逻辑运行,&nbsp;甚至静电积累永久性的击穿这个输入端,&nbsp;造成芯片失效.<br>另外,&nbsp;只有&nbsp;4000&nbsp;系列的&nbsp;CMOS&nbsp;器件可以工作在&nbsp;15伏电源下,&nbsp;74HC,&nbsp;74HCT&nbsp;等都只能工作在&nbsp;5伏电源下,&nbsp;现在已经有工作在&nbsp;3伏和&nbsp;2.5伏电源下的&nbsp;CMOS&nbsp;逻辑电路芯片了.&nbsp;<br>&nbsp;&nbsp;<br><strong>CMOS电平和<strong style="COLOR: black; BACKGROUND-COLOR: rgb(255,255,102)">TTL电平</strong>:</strong>&nbsp;CMOS电平电压范围在3～15V，比如4000系列当5V供电时，输出在4.6以上为高电平，输出在0.05V以下为低电平。输入在3.5V以上为高电&nbsp;平，输入在1.5V以下为低电平。而对于TTL芯片，供电范围在0～5V，常见都是5V，如74系列5V供电，输出在2.7V以上为高电平，输出在&nbsp;0.5V以下为低电平，输入在2V以上为高电平，在0.8V以下为低电平。因此，CMOS电路与TTL电路就有一个电平转换的问题，使两者电平域值能匹&nbsp;配。&nbsp;<br>&nbsp;&nbsp;<br>有关逻辑电平的一些概念&nbsp;：<br>要了解逻辑电平的内容，首先要知道以下几个概念的含义：<br>1：输入高电平（Vih）：&nbsp;保证逻辑门的输入为高电平时所允许的最小输入高电平，当输入电平高于Vih时，则认为输入电平为高电平。<br>2：输入低电平（Vil）：保证逻辑门的输入为低电平时所允许的最大输入低电平，当输入电平低于Vil时，则认为输入电平为低电平。<br>3：输出高电平（Voh）：保证逻辑门的输出为高电平时的输出电平的最小值，逻辑门的输出为高电平时的电平值都必须大于此Voh。<br>4：输出低电平（Vol）：保证逻辑门的输出为低电平时的输出电平的最大值，逻辑门的输出为低电平时的电平值都必须小于此Vol。<br>5：&nbsp;阀值电平(Vt)：数字电路芯片都存在一个阈值电平，就是电路刚刚勉强能翻转动作时的电平。它是一个界于Vil、Vih之间的电压值，对于CMOS电路的&nbsp;阈值电平，基本上是二分之一的电源电压值，但要保证稳定的输出，则必须要求输入高电平&gt;&nbsp;Vih，输入低电平&lt;Vil，而如果输入电平在阈值上下，也就是Vil～Vih这个区域，电路的输出会处于不稳定状态。<br>对于一般的逻辑电平，以上参数的关系如下：<br>Voh&nbsp;&gt;&nbsp;Vih&nbsp;&gt;&nbsp;Vt&nbsp;&gt;&nbsp;Vil&nbsp;&gt;&nbsp;Vol。<br>6：Ioh：逻辑门输出为高电平时的负载电流（为拉电流）。<br>7：Iol：逻辑门输出为低电平时的负载电流（为灌电流）。<br>8：Iih：逻辑门输入为高电平时的电流（为灌电流）。<br>9：Iil：逻辑门输入为低电平时的电流（为拉电流）。<br>门&nbsp;电路输出极在集成单元内不接负载电阻而直接引出作为输出端，这种形式的门称为开路门。开路的TTL、CMOS、ECL门分别称为集电极开路（OC）、漏极&nbsp;开路（OD）、发射极开路（OE），使用时应审查是否接上拉电阻（OC、OD门）或下拉电阻（OE门），以及电阻阻值是否合适。对于集电极开路（OC）&nbsp;门，其上拉电阻阻值RL应满足下面条件：<br>（1）：&nbsp;RL&nbsp;&lt;&nbsp;（VCC－Voh）/（n*Ioh＋m*Iih）<br>（2）：RL&nbsp;&gt;&nbsp;（VCC－Vol）/（Iol＋m*Iil）<br>其中n：线与的开路门数；m：被驱动的输入端数。<br>：常用的逻辑电平<br>&#183;逻辑电平：有TTL、CMOS、LVTTL、ECL、PECL、GTL；RS232、RS422、LVDS等。<br>&#183;其中TTL和CMOS的逻辑电平按典型电压可分为四类：5V系列（5V&nbsp;TTL和5V&nbsp;CMOS）、3.3V系列，2.5V系列和1.8V系列。<br>&#183;5V&nbsp;TTL和5V&nbsp;CMOS逻辑电平是通用的逻辑电平。<br>&#183;3.3V及以下的逻辑电平被称为低电压逻辑电平，常用的为LVTTL电平。<br>&#183;低电压的逻辑电平还有2.5V和1.8V两种。<br>&#183;ECL/PECL和LVDS是差分输入输出。<br>&#183;RS-422/485和RS-232是串口的接口标准，RS-422/485是差分输入输出，RS-232是单端输入输出。
<img src ="http://www.cppblog.com/totti1006/aggbug/49695.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-05-13 09:02 <a href="http://www.cppblog.com/totti1006/archive/2008/05/13/49695.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>逻辑电平的一些概念</title><link>http://www.cppblog.com/totti1006/archive/2008/05/12/49647.html</link><dc:creator>天之骄子</dc:creator><author>天之骄子</author><pubDate>Mon, 12 May 2008 09:20:00 GMT</pubDate><guid>http://www.cppblog.com/totti1006/archive/2008/05/12/49647.html</guid><wfw:comment>http://www.cppblog.com/totti1006/comments/49647.html</wfw:comment><comments>http://www.cppblog.com/totti1006/archive/2008/05/12/49647.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.cppblog.com/totti1006/comments/commentRss/49647.html</wfw:commentRss><trackback:ping>http://www.cppblog.com/totti1006/services/trackbacks/49647.html</trackback:ping><description><![CDATA[要了解逻辑电平的内容，首先要知道以下几个概念的含义： <br>1：输入高电平（Vih）： 保证逻辑门的输入为高电平时所允许的最小输入高电平，当输入电平高于Vih时，则认为输入电平为高电平。 <br>2：输入低电平（Vil）：保证逻辑门的输入为低电平时所允许的最大输入低电平，当输入电平低于Vil时，则认为输入电平为低电平。 <br>3：输出高电平（Voh）：保证逻辑门的输出为高电平时的输出电平的最小值，逻辑门的输出为高电平时的电平值都必须大于此Voh。 <br>4：输出低电平（Vol）：保证逻辑门的输出为低电平时的输出电平的最大值，逻辑门的输出为低电平时的电平值都必须小于此Vol。 <br>5：阀值电平(Vt)： 数字电路芯片都存在一个阈值电平，就是电路刚刚勉强能翻转动作时的电平。它是一个界于Vil、Vih之间的电压值，对于CMOS电路的阈值电平，基本上是二分之一的电源电压值，但要保证稳定的输出，则必须要求输入高电平&gt; Vih，输入低电平&lt;Vil，而如果输入电平在阈值上下，也就是Vil～Vih这个区域，电路的输出会处于不稳定状态。 <br>对于一般的逻辑电平，以上参数的关系如下： <br>Voh &gt; Vih &gt; Vt &gt; Vil &gt; Vol。 <br>6：Ioh：逻辑门输出为高电平时的负载电流（为拉电流）。 <br>7：Iol：逻辑门输出为低电平时的负载电流（为灌电流）。 <br>8：Iih：逻辑门输入为高电平时的电流（为灌电流）。 <br>9：Iil：逻辑门输入为低电平时的电流（为拉电流）。 <br>门电路输出极在集成单元内不接负载电阻而直接引出作为输出端，这种形式的门称为开路门。开路的TTL、CMOS、ECL门分别称为集电极开路（OC）、漏极开路（OD）、发射极开路（OE），使用时应审查是否接上拉电阻（OC、OD门）或下拉电阻（OE门），以及电阻阻值是否合适。对于集电极开路（OC）门，其上拉电阻阻值RL应满足下面条件： <br>（1）： RL &lt; （VCC－Voh）/（n*Ioh＋m*Iih） <br>（2）：RL &gt; （VCC－Vol）/（Iol＋m*Iil） <br>其中n：线与的开路门数；m：被驱动的输入端数。 <br>：常用的逻辑电平 <br>&#183;逻辑电平：有TTL、CMOS、LVTTL、ECL、PECL、GTL；RS232、RS422、LVDS等。 <br>&#183;其中TTL和CMOS的逻辑电平按典型电压可分为四类：5V系列（5V TTL和5V CMOS）、3.3V系列，2.5V系列和1.8V系列。 <br>&#183;5V TTL和5V CMOS逻辑电平是通用的逻辑电平。 <br>&#183;3.3V及以下的逻辑电平被称为低电压逻辑电平，常用的为LVTTL电平。 <br>&#183;低电压的逻辑电平还有2.5V和1.8V两种。 <br>&#183;ECL/PECL和LVDS是差分输入输出。 <br>&#183;RS-422/485和RS-232是串口的接口标准，RS-422/485是差分输入输出，RS-232是单端输入输出。
<img src ="http://www.cppblog.com/totti1006/aggbug/49647.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.cppblog.com/totti1006/" target="_blank">天之骄子</a> 2008-05-12 17:20 <a href="http://www.cppblog.com/totti1006/archive/2008/05/12/49647.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss>