zoukankan      html  css  js  c++  java
  • 串口的一点知识(摘抄)

    第一章 背景知识
    1. 概述
    串口是计算机上I/O接口的一种,要掌握串口通信编程的相关知识,必须先了解I/O接口的相关知识。
    I/O接口是接口的一种。

    2. 什么是接口?
    众所周知计算机是由CPU,存储器,外部终端设备组成.
    接口就是用于CPU与外部设备、存储器的连接和数据交换的设备。


    3. 接口分类.
    广义的计算机接口有二种,见下表:
    类別 用途 电路实现复杂性
    存储器接口: 用于CPU与外部设备、存储器的连接 简单
    I/O接口 数据交换 复杂

    习惯上说到接口只是指I/O接口。本文沒作特別介绍的地方都叫I/O接口.


    4. 为什么需要I/O接口?
    计算机的外围设备品种繁多,几乎都采用了机电传动设备,因此,CPU在与I/O设备进行数据交换时存在以下问题:

    速度不匹配:
    I/O设备的工作速度要比CPU慢许多,而且由于种类的不同,他们之间的速度差异也很大,例如硬盘的传输速度就要比打印机快出很多。

    时序不匹配:
    各个I/O设备都有自己的定时控制电路,以自己的速度传 输数据,无法与CPU的时序取得统一。

    3. Windows平台下对串口进行开发的方法
    在Windows平台下,Win32 API支持同步和异步两种I/O操作。同步操作的方式的程序设计相对比较简单,但是I/O操作函数在I/O操作结束前不能返回,这将挂起调用线程,直到I/O操作结束;异步操作方式要相对复杂一些,但是可以让I/O操作在后台运行,而不会挂起调用线程,这在大数据量通信情况下对改善调用线程的响应速度是相当有效的。同时由于Win9x和WinNT下对串行通信的处理不同,这就导致了在Win9x下开发的同步方式串行通信程序在NT下会发生工作线程之间的协作阻塞,即当读线程在等待WaitCommEvent的时候,写线程不能正常工作,停在那里,整个程序处于瘫痪状态。这个问题是Windows的API函数处理串行通信的一个BUG,所以对于适应性强的程序都是选择异步方式。下面,本文对在Windows平台下对串口进行开发的方法进行介绍:
    1. 汇编程序直接读写串口
    汇编语言的编译效率和执行效率都很高,使用汇编语言直接对串口进行操作可以部分弥补串行通信速度较慢的缺陷,具体做法是:用汇编语言编写读、写串口的函数,在通信程序中直接调用,或者在幵发工具中直接内嵌汇编程序进行对端口的读写。
    例如:
    asm
      mov dx,0001h
    mov ax,005eh
    int 14h
    end;
    这样可以达到直接读到端口的效果。但是在WinNT和Win2000下,系统使用了保护机制,不允许用户态的程序直接读取端口,所以在WinNT和Win2000下,这种方法不能被允许执行。Ring3的用户态的程序要进入Ring0去读写端口必须先提供一个驱动(sys)程序,然后通过DLL导出函数供用户程序调用,显然,这种方法比较不容易实现。

    2. 使用API函数进行串口编程
    Windows系统通信一般都以WOSA(Windows Open Service Architecture,即Windows开放式服务体系)模型为基础,在此模型中位于上层的应用程序通过调用各种通信API(Application Programming Interfaces,即应用程序接口)与位于下层的设备驱动程序进行数据交换。
    在Windows平台下,Windows将设备看作是文件进行管理,对设备的操作也可以看作是对文件的操作。Win32 API提供了CreateFile(),WriteFile(),ReadFile(),WaitForSingleObject(),WaitForMultipleObjects(),CreateEvent(),CreateMutex(),CreateSemaphore(),CreateThread()等函数,其基本步骤如下:
    (1) 利用CreateFile()函数打开串口。该函数有七个参数,其中dwCreationDistribution参数取OPEN_EXISTING,表明打开的串口对应于实际的物理串口;lpFileName参数是要打开的串口名称,如“COM1”;DwFlagsAndAttributes参数决定对串口的操作是同步操作还是异步操作;DwDesiredAccess参数是访问方式,可取GENERIC_READ或GENERIC_WRITE;DwShareMode参数是共享模式,对串口物理设备必须取0;LpSecurityAttributes参数是安全属性,取值为NULL;DwFlagsAndAttributes是文件属性和标识,一般取值为FILE_ATTRIBUTE_NORMAL。该函数返回串口操作的句柄。
    (2) 对该串口句柄对应的设备进行配置,如波特率、数据位、停止位、是否奇偶校验等。这部分首先使用GetCommState()函数得到当前的串口配置信息,将这些信息存放在一个DCB结构中,然后对该DCB结构里面的内容进行重新按要求设置,最后调用SetCommState()函数使修改的设置生效。
    (3) 配置串口事件。SetCommMask()函数可以设置多个串口信息事件,其串口的信息事件可以是以下任意的组合:
    EV_BREAK:在输入时Windows检测到中断;
    EV_CTS   :CTS信号改变状态;
    EV_DSR   :DSR信号改变状态;
    EV_ERR   :发生线状态错误;
    EV_RING  :检测到振铃指示;
    EV_RLSD  :接收线信号探测状态发生改变;
    EV_RXCHAR:接收缓冲区里收到字符;EV_RXFLAG:收到事件字符,并放入接收缓冲区;
    EV_TXEMPTY:输出缓冲区空。
    (4) 创建串口监视线程监视串口事件。首先使用WaitForSingleObject()、WaitForCommEvent()、WaitForMultipleObjects()等等待函数对线程进行控制,当没有数据收发时,将线程阻塞,减少其CPU的资源占用;当有数据收发时,线程自动启动,完成数据的收发。最后调用CreateThread()函数启动线程。
    (5) 串口使用结束,用CloseHandle()函数关闭串口,回收资源。
    由此可见,利用Win32 API函数编写串口通信程序比较复杂,需要掌握大量的系统和通信知识,其优点是实现的功能强大,应用面广泛,适合编写较为复杂的地层次应用程序。

    信息格式不匹配:
    不同的I/O设备存储和处理信息的格式不同,例如可以分为串行和并行两种;也可以分为二进制格式、ACSII编码和BCD编码等。

    信息类型不匹配:
    不同I/O设备采用的信号类型不同,有些是数字信号,而有些是模拟信号,因此所采用的处理方式也不同。
      
    基于以上原因,CPU与外设之间的数据交换必须通过I/O接口来完成。

    5. I/O接口的功能
    通常I/O接口有以下一些功能:
    1)设置数据的寄存、缓冲逻辑,以适应CPU与外设之间的速度
    差异,接口通常由一些寄存器或RAM芯片组成,如果芯片足够大还可以实现批量数据的传输;

    2)能够进行信息格式的转换,例如串行和并行的转换;

    3)能够协调CPU和外设两者在信息的类型和电平的差异,如电平
    转换驱动器、数/模或模/数转换器等;
      
    4)协调时序差异;
      
    5)地址译码和设备选择功能;
      
    6)设置中断和DMA控制逻辑,以保证在中断和DMA允许的情况下产生中断和DMA请求信号,并在接受到中断和DMA应答之后完成中断处理和DMA传输。
      
    6. I/O接口的通信方式
    CPU通过接口对外设进行控制的方式有以下几种:
    1)程序查询方式
    这种方式下,CPU通过I/O指令询问指定外设当前的状态,如果外设
    准备就绪,则进行数据的输入或输出,否则CPU等待,循环查询。
    这种方式的优点是结构简单,只需要少量的硬件电路即可,缺点是由
    于CPU的速度远远高于外设,因此通常处于等待状态,工作效率很
    低。

    2)中断处理方式
    在这种方式下,CPU不再被动等待,而是可以执行其他程序,一旦
    外设为数据交换准备就绪,可以向CPU提出服务请求,CPU如果响
    应该请求,便暂时停止当前程序的执行,转去执行与该请求对应的
    服务程序,完成后,再继续执行原来被中断的程序。
      中断处理方式的优点是显而易见的,它不但为CPU省去了查询外设
    状态和等待外设就绪所花费的时间,提高了CPU的工作效率,还满
    足了外设的实时要求。但需要为每个I/O设备分配一个中断请求号
    和相应的中断服务程序,此外还需要一个中断控制器(I/O接口芯
    片)管理I/O设备提出的中断请求,例如设置中断屏蔽、中断请求
    优先级等。此外,中断处理方式的缺点是每传送一个字符都要进行
    中断,启动中断控制器,还要保留和恢复现场以便能继续原程序的
    执行,花费的工作量很大,这样如果需要大量数据交换,系统的性
    能会很低。

    3)DMA(直接存储器存取)传送方式
    DMA最明显的一个特点是它不是用软件而是采用一个专门的控制
    器来控制内存与外设之间的数据交流,无须CPU介入,大大提高
    CPU的工作效率。  
    在进行DMA数据传送之前,DMA控制器会向CPU申请总线控
    制 权,CPU如果允许,则将控制权交出,因此,在数据交换时,
    总线控制权由DMA控制器掌握,在传输结束后,DMA控制器将
    总线控制权交还给CPU。
      
    7. I/O接口的分类
    7.1. 并行接口

      目前,计算机中的并行接口主要作为打印机端口,接口使用的不再是36针接头而是25针D形接头。所谓“并行”,是指8位数据同时通过并行线进行传送,这样数据传送速度大大提高,但并行传送的线路长度受到限制,因为长度增加,干扰就会增加,容易出错。
      现在有五种常见的并口:4位、8位、半8位、EPP和ECP,大多数PC机配有4位或8位的并口,许多利用Intel386芯片组的便携机配有EPP口,支持全部IEEE1284并口规格的计算机配有ECP并口。
      标准并行口4位、8位、半8位:
      4位口一次只能输入4位数据,但可以输出8位数据;8位口可以一次输入和输出8位数据;半8位也可以。
      EPP口(增强并行口):由Intel等公司开发,允许8位双向数据传送,可以连接各种非打印机设备,如扫描仪、LAN适配器、磁盘驱动器和CDROM 驱动器等。
      ECP口(扩展并行口):由Microsoft、HP公司开发,能支持命令周期、数据周期和多个逻辑设备寻址,在多任务环境下可以使用DMA(直接存储器 访问)。
      目前几乎所有的586机的主板都集成了并行口插座,标注为 Paralle1或LPT1,是一个26针的双排针插座。

    7.2. 串行接口

      计算机的另一种标准接口是串行口,现在的PC机一般至少有两个串行口COM1和COM2。串行口不同于并行口之处在于它的数据和控制信息是一位接一位串行地传送下去。这样,虽然速度会慢一些,但传送距离较并行口更长,因此长距离的通信应使用串行口。通常COM1使用的是9针D形连接器,而COM2有些使 用的是老式的DB25针连接器。
      

    7.3. 磁盘接口

    1)IDE接口
      IDE接口也叫做ATA端口,只可以接两个容量不超过528M的硬盘驱动器,接口的成本很低,因此在386、486时期非常流行。但大多数IDE接口不支持DMA数据传送,只能使用标准的PCI/O端口指令来传送所有的命令、状态、数据。几乎所有的586主板上都集成了两个40针的双排针IDE接口插座,分别标注为IDE1和IDE2。
    2)EIDE接口
      EIDE接口较IDE接口有了很大改进,是目前最流行的接口。
    首先,它所支持的外设不再是2个而是4个了,所支持的设备除了硬盘,还包括CD-ROM驱动器磁盘备份设备等。  

    其次,EIDE标准取消了528MB的限制,代之以8GP限制。  
    第三,EIDE有更高的数据传送速率,支持PIO模式3和模式4标准。
      

    7.4. SCSI接口

      SCSI(SmallComputerSystemInterface)小计算机系统接口,在做图形处理和网络服务的计算机中被广泛采用SCSI接口的硬盘。除了硬盘以外,SCSI接口还可以连接CD-ROM驱动器、扫描仪和打印机等,它具有以下特点:
      *可同时连接7个外设;
      *总线配置为并行8位、16位或32位;
      *允许最大硬盘空间为8.4GB(有些已达到9.09GB);
      *更高的数据传输速率,IDE是2MB每秒,SCSI通常可以达到5MB每秒,FASTSCSI(SCSI-2)能达到10MB每秒,最新的SCSI-3甚至能够达到40MB每秒,而EIDE最高只能达到16.6MB每秒;
      *成本较IDE和EIDE接口高很多,而且,SCSI接口硬盘必须和SCSI接口卡配合使用,SCSI接口卡也比IED和EIDE接口贵很多。
      *SCSI接口是智能化的,可以彼此通信而不增加CPU的负担。在IDE和EIDE设备之间传输数据时,CPU必须介入,而SCSI设备在数据传输过程中起主动作用,并能在SCSI总线内部具体执行,直至完成再通知CPU。
      

    7.5. USB接口

      最新的USB串行接口标准是由Microsoft、Intel、Compaq、IBM等大公司共同推出,它提供机箱外的热即插即用连接,用户在连接外设时不用再打开机箱、关闭电源,而是采用“级联”方式,每个USB设备用一个USB插头连接到一个外设的USB插座上,而其本身又提供一个USB插座给下一个USB设备使用,通过 这种方式的连接,一个USB控制器可以连接多达127个外设,而每个外设间的距离可达5米。USB统一的4针圆形插头将取代机箱后的众多的串/并口(鼠标、MODEM)键盘等插头。USB能智能识别USB链上外围设备的插入或拆卸。   除了能够连接键盘、鼠标等,USB还可以连接ISDN、电话系统、数字音响、打印机以及扫描仪等低速外设。
      

    7.6. I/O扩展槽


      I/O扩展槽即I/O信号传输的路径,是系统总线的延伸,可以插入任意的标准选件,如显示卡、解压卡、MODEM卡和声卡等。通过I/O扩展槽,CPU可对连接到该通道的所有I/O接口芯片和控制卡寻址访问,进行读写。
      根据总线的类型不同,主板上的扩展槽可分为ISA、EISA、MAC、VESA和PCI几种。
      1)ISA插槽
      黑色,分为8位、16位两种。16位的扩展槽可以插8位和16位的控制卡,但8位的扩展槽只能插8位卡。
      2)EISA插槽
      棕色,外型、长度与16位的ISA卡一样,但深度较大,可插入ISA与EISA控制卡。
      3)VESA插槽
      棕色,位于16位ISA扩展插槽的下方,与ISA插槽配合使用。
      4)PCI插槽
    白色,与VESA插槽一样长,与ISA插槽平行,不需要与ISA插槽配合使用,而且只能插入PCI控制卡。由于主板的空间有限,PCI插槽要占用ISA插槽的位置


    8. 串口的分类
    8.1. RS-232-C接口
    RS-232-C接口(又称 EIA RS-232-C)是目前最常用的一种串行通讯接口。它是在1970年由美国电子工业协会(EIA)联合贝尔系统、 调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标 准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间 串行二进制数据交换接口技术标准”该标准规定采用一个25个脚的 DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信 号的电平加以规定。
    (1) 接口的信号内容 实际上RS-232-C的25条引线中有许多是很少使用的,在计算机与终端通讯中一般只使用3-9条引线。RS-232-C最常用的9条引线的信号内容见下所示

    引脚序号 信号名称 符号 流向 功能
    2 发送数据 TXD DTE→DCE DTE发送串行数据
    3 接收数据 RXD DTE←DCE DTE接收串行数据
    4 请求发送 RTS DTE→DCE DTE请求DCE将线路切换到发送方式
    5 允许发送 CTS DTE←DCE DCE告诉DTE线路已接通可以发送数据
    6 数据设备准备好 DSR DTE←DCE DCE准备好
    7 信号地     信号公共地
    8 载波检测 DCD DTE←DCE 表示DCE接收到远程载波
    20 数据终端准备好 DTR DTE→DCE DTE准备好
    22 振铃指示 RI DTE←DCE 表示DCE与线路接通,出现振铃

    (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的四芯电缆。 下面是C 公司的实验结果
    波特率 1 号电缆传输距离(英尺) 2 号电缆传输距离(英尺)
    110 5000 3000
    300 5000 3000
    1200 3000 3000
    2400 1000 500
    4800 1000 250
    9600 250 250
     
    8.2. RS-485接口
    由于RS-232-C接口标准出现较早,难免有不足之处,主要有以下四点:
    (1) 接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL 电平不兼容故需使用电平转换电路方能与TTL电路连接。
    (2) 传输速率较低,在异步传输时,波特率为20Kbps。
    (3) 接口使用一根信号线和一根信号返回线而构成共地的传输形式, 这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。
    (4) 传输距离有限,最大传输距离标准值为50英尺,实际上也只能 用在50米左右。
    针对RS-232-C的不足,于是就不断出现了一些新的接口标准,RS-485就是其中之一,它具有以下特点:
    1. RS-485的电气特性:逻辑“1”以两线间的电压差为+(2—6) V表示;逻辑“0”以两线间的电压差为-(2—6)V表示。接口信号电平比RS-232-C降低了,就不易损坏接口电路的芯片, 且该电平与TTL电平兼容,可方便与TTL 电路连接。
    2. RS-485的数据最高传输速率为10Mbps
    3. RS-485接口是采用平衡驱动器和差分接收器的组合,抗共模干能力增强,即抗噪声干扰性好。
    4. RS-485接口的最大传输距离标准值为4000英尺,实际上可达 3000米,另外RS-232-C接口在总线上只允许连接1个收发器, 即单站能力。而RS-485接口在总线上是允许连接多达128个收发器。即具有多站能力,这样用户可以利用单一的RS-485接口方便地建立起设备网络。
    因RS-485接口具有良好的抗噪声干扰性,长的传输距离和多站能力等上述优点就使其成为首选的串行接口。 因为RS485接口组成的半双工网络,一般只需二根连线,所以RS485接口均采用屏蔽双绞线传输。 RS485接口连接器采用DB-9的9芯插头座,与智能终端RS485接口采用DB-9(孔),与键盘连接的键盘接口RS485采用DB-9(针)。
    3. 采用RS485接口时,传输电缆的长度如何考虑?
    在使用RS485接口时,对于特定的传输线经,从发生器到负载其数据信号传输所允许的最大电缆长度是数据信号速率的函数,这个 长度数据主要是受信号失真及噪声等影响所限制。下图所示的最大电缆长度与信号速率的关系曲线是使用24AWG铜芯双绞电话电缆(线 径为0.51mm),线间旁路电容为52.5PF/M,终端负载电阻为100欧 时所得出。(曲线引自GB11014-89附录A)。由图中可知,当数据信 号速率降低到90Kbit/S以下时,假定最大允许的信号损失为6dBV时, 则电缆长度被限制在1200M。实际上,图中的曲线是很保守的,在实 用时是完全可以取得比它大的电缆长度。 当使用不同线径的电缆。则取得的最大电缆长度是不相同的。例 如:当数据信号速率为600Kbit/S时,采用24AWG电缆,由图可知最 大电缆长度是200m,若采用19AWG电缆(线径为0。91mm)则电缆长 度将可以大于200m; 若采用28AWG 电缆(线径为0。32mm)则电缆 长度只能小于200m。
    9. 串口通信分类
    9.1. 按信息的传送方向分
    根据信息的传送方向,串口通信以进一步分为单工、半双工和全双工三种。
    如果在通信过程的任意时刻,信息只能由一方A传到另一方B,则称为单工。
    如果在任意时刻,信息既可由A传到B,又能由B传A,但只能由一个方向上的传输存在,称为半双工传输。
    如果在任意时刻,线路上存在A到B和B到A的双向信号传输,则称为全双工。电话线就是二线全双工信道。 由于采用了回波抵消技术,双向的传输信号不致混淆不清。双工信道有时也将收、发信道分开,采用分离的线路或频带传输相反方向的信号,如回线传输。
    --------> <--------> -------->
    A---------B A----------B A---------B
        <--------
    单工 半双工 全双工


    9.2. 按信息的交互方式分
    串口通信又分为异步通信和同步通信两种方式。
    10. 奇偶校验
    串口数据在传输过程中,由于干扰可能引起信息的出错,例如,传输字符‘E’,其各位为:
    0100,0101=45H
    D7 D0
    由于干扰,可能使位变为1,这种情况,我们称为出现了“误码”。我们把如何发现传输中的错误,叫“检错”。发现错误后,如何消除错误,叫“纠错”。
    最简单的检错方法是“奇偶校验”,即在传送字符的各位之外,再传送1位奇/偶校验位。可采用奇校验或偶校验。
    奇校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为奇数,如:
    1 0110,0101
    0 0110,0001
    偶校验:所有传送的数位(含字符的各数位和校验位)中,“1”的个数为偶数,如:
    1 0100,0101
    0 0100,0001
     
    奇偶校验能够检测出信息传输过程中的部分误码(1位误码能检出,2位及2位以上误码不能检出),同时,它不能纠错。在发现错误后,只能要求重发。但由于其实现简单,仍得到了广泛使用。
    有些检错方法,具有自动纠错能力。如循环冗余码(CRC)检错等.

  • 相关阅读:
    CentOS7 配置163 yum源(详细步骤)
    从构建分布式秒杀系统聊聊分布式锁
    互联网架构“高并发”
    互联网架构“高可用”
    FineCMS
    layUI表单事件监听-事件监听机制简化处理
    界面优雅的UI框架layUI
    如果OCX使用onmousedown和onmouseup来决定指令发送和指令停止会不会有问题?
    CSS字体库font-face用法及跨域问题
    RequireJS被外部调用
  • 原文地址:https://www.cnblogs.com/doorsky/p/1719630.html
Copyright © 2011-2022 走看看