标题：COM接口
COM接口
定义COM接口是指Component Object Model接口，是微软定义的标准接口。COM接口(8张)
简介串口叫做串行接口，现在的PC 一般有两个串行口COM 1 和COM 2 。串行口不同于并行口之处在于它的数据和控制信息是一位接一位地传送出去的。 虽然这样速度会慢一些，但传送距离较并行口更长，因此若要进行较长距离的通信时，应使用串行口。
通常 COM 1 使用的是9 针D 形连接器，也称之为RS-232接口，而COM 2 有的使用的是老式的DB25 针连接器，也称之为RS-422接口，这种接口目前已经很少使用。
一般机箱有两个，新机箱有可能只有一个。笔记本电脑有可能没有。 
有很多工业仪器将它作为标准通信端口。通信的内容与格式一般附在仪器的用户说明书中。
RS-232电平规定
计算机与计算机或计算机与终端之间的数据传送可以采用串行通讯和并行通讯二种方式。由于串行通讯方式具有使用线路少、成本低，特别是在远程传输时，避免了多条线路特性的不一致而被广泛采用。 在串行通讯时，要求通讯双方都采用一个标准接口，使不同 的设备可以方便地连接起来进行通讯。 RS-232-C接口（又称 EIA RS-232-C）是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会（EIA）联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标 准。它的全名是“数据终端设备（DTE）和数据通讯设备（DCE）之间 串行二进制数据交换接口技术标准”该标准规定采用一个25个脚的 DB25连接器，对连接器的每个引脚的信号内容加以规定，还对各种信 号的电平加以规定。
（1）接口的信号内容实际上RS-232-C的25条引线中有许多是很少使用的，在计算机与终端通讯中一般只使用3-9条引线。RS-232-C最常用的9条引线的信号内容见附表1所示
（2）接口的电气特性在RS-232-C中任何一条信号线的电压均为负逻辑关系。即：逻 辑“1”，-5— -15V；逻辑“0” +5— +15V 。噪声容限为2V。即 要求接收器能识别低至+3V的信号作为逻辑“0”，高到-3V的信号 作为逻辑“1”
（3）接口的物理结构RS-232-C接口连接器一般使用型号为DB-25的25芯插头座,通常插头在DCE端,插座在DTE端. 一些设备与PC机连接的RS-232-C接口,因为不使用对方的传送控制信号,只需三条接口线,即“发送数据”、“接收数据”和“信号地”。所以采用DB-9的9芯插头座，传输线采用屏蔽双绞线。
（4）传输电缆长度由RS-232C标准规定在码元畸变小于4%的情况下，传输电缆长度应为50英尺，其实这个4%的码元畸变是很保守的，在实际应用中，约有99%的用户是按码元畸变10-20%的范围工作的，所以实际使用中最大距离会远超过50英尺，美国DEC公司曾规定允许码元畸变为10%而得出附表2 的实验结果。其中1号电缆为屏蔽电缆，型号为DECP.NO.9107723 内有三对双绞线，每对由22# AWG 组成，其外覆以屏蔽网。2号电缆为不带屏蔽的电缆。型号为DECP.NO.9105856-04是22#AWG的四芯电缆。 
1.RS-232-C是美国电子工业协会EIA（Electronic Industry Association）制定的一种串行物理接口标准。RS是英文“推荐标准”的缩写，232为标识号，C表示修改次数。RS-232-C总线标准设有25条信号线，包括一个主通道和一个辅助通道，在多数情况下主要使用主通道，对于一般双工通信，仅需几条信号线就可实现，如一条发送线、一条接收线及一条地线。RS-232-C标准规定的数据传输速率为每秒50、75、100、150、300、600、1200、2400、4800、9600、19200波特。RS-232-C标准规定，驱动器允许有2500pF的电容负载，通信距离将受此电容限制，例如，采用150pF/m的通信电缆时，最大通信距离为15m；若每米电缆的电容量减小，通信距离可以增加。传输距离短的另一原因是RS-232属单端信号传送，存在共地噪声和不能抑制共模干扰等问题，因此一般用于20m以内的通信。 
2.RS-485总线,在要求通信距离为几十米到上千米时，广泛采用RS-485 串行总线标准。RS-485采用平衡发送和差分接收，因此具有抑制共模干扰的能力。加上总线收发器具有高灵敏度，能检测低至200mV的电压，故传输信号能在千米以外得到恢复。 RS-485采用半双工工作方式，任何时候只能有一点处于发送状态，因此，发送电路须由使能信号加以控制。RS-485用于多点互连时非常方便，可以省掉许多信号线。应用RS-485可以联网构成分布式系统，其允许最多并联32台驱动器和32台接收器。
设备连接以往，PC与智能设备通讯多借助RS232、RS485、以太网等方式，主要取决于设备的接口规范。但RS232、RS485只能代表通讯的物理介质层和链路层，如果要实现数据的双向访问，就必须自己编写通讯应用程序，但这种程序多数都不能符合ISO/OSI的规范，只能实现较单一的功能，适用于单一设备类型，程序不具备通用性。在RS232或RS485设备联成的设备网中，如果设备数量超过2台，就必须使用RS485做通讯介质，RS485网的设备间要想互通信息只有通过“主（Master）”设备中转才能实现，这个主设备通常是PC，而这种设备网中只允许存在一个主设备，其余全部是从（Slave）设备。而现场总线技术是以ISO/OSI模型为基础的，具有完整的软件支持系统，能够解决总线控制、冲突检测、链路维护等问题。...
组件，对象模型COM
COM简介（COM），是微软公司为了计算机工业的软件生产更加符合人类的行为方式开发的一种新的软件开发技术。在COM构架下，人们可以开发出各种各样的功能专一的组件，然后将它们按照需要组合起来，构成复杂的应用系统。由此带来的好处是多方面的：可以将系统中的组件用新的替换掉，以便随时进行系统的升级和定制；可以在多个应用系统中重复利用同一个组件；可以方便的将应用系统扩展到网络环境下；COM与语言，平台无关的特性使所有的程序员均可充分发挥自己的才智与专长编写组件模块；等等。 
COM是开发软件组件的一种方法。组件实际上是一些小的二进制可执行程序，它们可以给应用程序，操作系统以及其他组件提供服务。开发自定义的COM组件就如同开发动态的，面向对象的API。多个COM对象可以连接起来形成应用程序或组件系统。并且组件可以在运行时刻，在不被重新链接或编译应用程序的情况下被卸下或替换掉。Microsoft的许多技术，如ActiveX, DirectX以及OLE等都是基于COM而建立起来的。并且Microsoft的开发人员也大量使用COM组件来定制他们的应用程序及操作系统。
COM所含的概念并不止是在Microsoft Windows操作系统下才有效。COM并不是一个大的API，它实际上象结构化编程及面向对象编程方法那样，也是一种编程方法。在任何一种操作系统中，开发人员均可以遵循“COM方法”。
一个应用程序通常使由单个的二进制文件组成的。当编译器生成应用程序之后，在对下一个版本重新编译并发行新生成的版本之前，应用程序一般不会发生任何变化。操作系统，硬件及客户需求的改变都必须等到整个应用程序被重新生成。
目前这种状况已经发生变化。开发人员开始将单个的应用程序分隔成单独多个独立的部分，也既组件。这种做法的好处是可以随着技术的不断发展而用新的组件取代以有的组件。此时的应用程序可以随新组件不断取代旧的组件而渐趋完善。而且利用已有的组件，用户还可以快速的建立全新的应用。
传统的做法是将应用程序分割成文件，模块或类，然后将它们编译并链接成一个单模应用程序。它与组件建立应用程序的过程（称为组件构架）有很大的不同。一个组件同一个微型应用程序类似，即都是已经编译链接好并可以使用的二进制代码，应用程序就是由多个这样的组件打包而得到的。单模应用程序只有一个二进制代码模块。自定义组件可以在运行时刻同其他的组件连接起来以构成某个应用程序。在需要对应用程序进行修改或改进时，只需要将构成此应用程序的组件中的某个用新的版本替换掉即可。
COM，即组件对象模型，是关于如何建立组件以及如何通过组件建立应用程序的一个规范，说明了如何可动态交替更新组件。
使用组件的优点：组件架构的一个优点就是应用可以随时间的流逝而发展进化。除此之外，使用组件还有一些可以使对以有应用的升级更加方便和灵活的优点，如应用的定制，组件库以及分布式组件等。
使用组件的种种优点直接来源于可以将它们动态的插入或卸出应用。为了实现这种功能，所有的组件必须满足两个条件：第一，组件必须动态链接；第二，它们必须隐藏（或封装）其内部实现细节。动态链接对于组件而言是一个至关重要的要求，而消息隐藏则是动态链接的一个必要条件。
接口对于COM来讲，接口是一个包含一个函数指针数组的内存结构。每一个数组元素包含的是一个由组件所实现的函数地址。对于COM而言，接口就是此内存结构，其他东西；均是COM不关心的实现细节。
在C++中，可以用抽象基类来实现COM接口。由于一个COM组件可以实现支持任意数目的接口，因此对于这样的组件，可以用抽象基类的多重继承来实现。用类来实现组件将比其他方法更为容易。
对于客户来说，一个组件就是一个接口集。客户只能通过接口才能和COM组件打交道。从整体上讲，客户对于一个组件可以说是知之甚少的。通常情况下，客户甚至不必知道一个组件所提供的所有接口。
客户同组件的交互是通过接口完成的。在客户查询组件其他的接口时，也是通过接口完成的。这个接口就是IUnknown。Iunknown接口的定义包含在Win32 SDK中的UNKNWN.H的头文件中，引用如下： interface IUnknown
{
virtual HRESULT-_ _stdcall QueryInterface(const IID& iid,void **ppv)=0;
virtual ULONG_ _stdcall AddRef( )=0;
virtual ULONG_ _Release( )=0;
};
所有的COM都要继承IUnknown。可以用Iunknown的接口指针来查询该组件的其他的接口，并且每个接口的vtbl中的前三个函数都是QueryInterface,AddRef和Release。这使得所有的COM接口都可以被当作成IUnknown接口来处理。由于所有的接口都支持QueryInterface,因此组件的任何一个接口都可以被客户用来获取它所支持的其他接口。
在用QueryInterface将组件抽象成由多个相互独立的接口构成的集合后，还需要管理组件的生命期。这一点是通过对接口的引用计数实现的。客户并不能直接控制组件的生命期。当使用完一个接口而要用组件的另一个接口时，是不能将改组件释放的。对组件的释放可以由组件在客户使用完所有的组件之后自己完成。IUnknown的另外两个成员函数AddRef和Release的作用就是给客户提供一种让它指示何时处理完一个接口的手段。
AddRef和Release实现的是一种名为引用技术的内存管理技术。当客户从组件获得一个接口时，此引用计数值将增1。当客户使用完某个接口时，组件的引用计数值将减1，当引用计数值为0时，组件可以将自己从内存中删除。AddRef和Release可以增加和减少这一计数值。
创建将组件分成多个接口只是将单模应用分个成多个部分的第一步，组件需要被放入动态链接库（DLL）中。DLL是一个组件服务程序，或者说是发行组件的一种方式。组件实际上应看成是在DLL中实现的接口集。在客户获取某个组件接口指针之前，它必须先将相应的DLL装载到其进程空间中，并创建此组件。
由于客户组件所需要的所有函数都可以通过某个接口指针而访问到，因此，可以在DLL中引出CreatInstance函数就可以使用户调用它。之后，可以装载DLL并调用其中的函数。此功能可由COM库函数CoCreateInstance来实现。CoCreateInstance创建组件的过程是：传给它一个CLSID，然后它创建相应的组件，并返回指向所请求的接口的指针。但CoCreateInstance没有给客户提供一种能控制组件创建过程的方法，缺乏一定的灵活性。事实上，常用类厂来创建组件。类厂就是一个带有能够创建其他组件的接口的组件。客户先创建类厂本身，然后再用一个接口（如IClassFactory）来创建所需的组件。然后还要用DllRegisterSever在Windows中注册这个组件。
复用COM组件可以被复用，它支持“接口继承”。这种继承指的是一个类继承其基类的类型或接口。抽象基类是一种最纯粹的接口继承，并且正好也被用来实现COM接口。在COM中，我们可以用包容和聚合来对组件进行改造。
包容是在接口级完成的。外部组件包含指向内部接口的指针。此时，外部组件仅仅是内部组件的一个客户而已，它将使用内部组件的接口来实现它自己的接口。外部组件也可以通过将调用转发给内部组件的方法来重新实现内部组件所支持的某个接口。并且外部组件还可以在内部组件代码的前后加上一些代码以对接口进行改造。
聚合是包含的一种变化形式。当外部组件聚合了某个内部组件的一个接口时，它并没有象包容那样重新实现此接口并显式的将调用请求转发给内部组件。相反，外部组件直接把内部组件的接口指针返回给客户。使用这种方法，外部组件将无需重新实现并转发接口中的所有函数了。
包容和聚合为实现组件的复用提供了一种极具鲁棒性的机制。在组件构架下，客户于组件的实现完全隔离开了。
小结以上是关于COM的一些基础知识。遵循COM规范编写的组件将会极大的改变传统的软件生产方式，具有广阔的发展前景。这也将为软件工程学引入新的内容和方法。