精华内容
下载资源
问答
  • 为了适应全数字自动化控制更加广泛应用,采用FPGA对UART进行多模块的系统设计的方法,是串口通信的集成度更高。对UART系统结构进行了多模块的分解。UART(通用异步收发器)是一种应用广泛的短距离串行传输接口,常...
  • Arduino 串行通信之串口通信 UART 原理及释义

    万次阅读 多人点赞 2019-03-28 09:43:53
    本系列中提到的串口通信一般指Arduino上面的USART通信模式,USART也是串行通信的一种,可以有硬串口,软串口两种实现方式,并且USART是一种异步串行通信.   相关案例: 环境监测 温湿度传感器 案例  

        对于Arduino来说,甚至是对于电子学领域来说,信号分为数字信号和模拟信号。这两种信号又分为输入和输出两种情况,所以我的理解是电子学就是一门研究这四种情况相互关系的学科。模拟信号是一种连续变化的物理量,能帮助我们更好地理解周围环境的信息,任何的信息都可以用模拟信号来准确表达,但其缺点是易受噪声的影响,信号被多次复制,或进行长距离传输之后,会发生衰减。相比而言数字信号受噪声的影响小,易于传输、处理和存储,现在被广泛应用于电子领域,但数字信号的缺点是每次的信息量小,只有0和1两种状态,所以就出现了串行通信的概念,通过多次的0或者1的数字信号组合来表达更丰富的信息。本章我们就来介绍一下Arduino中最基本的串行通信。

    串行通信的介绍

          串行通信是指使用一条数据线,将数据一位一位地依次传输,每一位数据占据一个固定的时间长度。使用串口通信时,发送和接收到的每一个字符实际上都是一次一位传送的,每一位为1或者为0.这就好像大家在电视里看到的通过敲门声的长短能够表达一些复杂的信息一样,这里敲门声的长短就相当于信号0或者1,只要双方约定好,就能够通过这种长短的变化表达固定的信息。在串行通信中, “双方约定好”这一点很重要,因为从实质上来说,通信的信号就是一堆0和1的数字,如果没有约定好这些0、1数字组合所代表的意义,那么双方不可能知道对方所发送信息的含义,就好像如果两个人交谈时使用不同的语言,那么他们的交谈是没有任何意义的。

    串行通信的约定

        串行通信中的这种约定包含两个方面,一方面是通信的速率要保持一致,另一方面是字符的编码要一致。

    波特率

        通信速率是指单位时间内传输的信息量,可用比特率和波特率来表示。比特率是指每秒传输的二进制位数,用bps (bits)表示。波特率是指每秒传输的符号数,若每个符号所含的信息量为1比特,则波特率等于比特率。在电子学中,一个符号的含义为高电平或低电平,它们分别代表"1"和"0",所以 ,每个符号所含的信息量刚好为1比特,因此常将比特率称为波特率,即:

    1波特(B) =1比特(bit) =1位/秒(1bps)

    常用的波特率有: 110,300,600, 1200,2400,4800,9600, 19200,38400,115200等最常用的是9600.

    ASCII码

         ASCII码是由美国国家标准学会(American National Standard Institute , ANSI)制定的,其英文全称是American Standard Code for Information Interchange,它是现今最通用的单字节编码系统,主要是为了解决大家在串行通信中的信息一致性问题。在Arduino中也采用这种字符编码方式。

         在计算机中,所有的数据在存储和运算时都用0或者1来表示,像a,b,c,d这样的字母(包括大写共52个);以及0、1等数字还有一些常用的符号(*、#、@等)在计算机中都要使用0或1来表示,而具体用哪些0、1组合表示哪个符号,每个人都可以约定自己的一套定义(这个定义就叫编码),只要双方的编码一致就可以通信了。而要想让更多人互相通信而不造成混乱,那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ASCI1编码,统一规定了上述常用符号用哪些0、1的组合来表示.ASCII是基于拉丁字母的一套电脑编码系统。它主要用于显示现代英语和其他西欧语言。

    标准的ASCII码

         ASCII码使用指定的7 bit或8 bit数据组合来表示128或256种可能的字符。标准 , ASCI码使用7bit数据来表示所有的大写和小写字母、数字0到9、标点符号,以及在美式英语中使用的特殊控制字符。

         其中0~31及127 (共33个)是控制字符或通信专用字符,如: LF (换行)、CR (回车)、FF (换页)、 DEL (删除)、BS (退格), BEL (响铃)等;通信专用字符包括: SOH (文头)、EOT (文尾)、ACK (确认)等;ASCII值为8、9、10和13分别转换为退格、制表、换行和回车字符。这些字符并没有特定的图形显示,但会依不同的应用程序,而对文本显示产生不同的影响,其余为可显示字符。32 ~ 126 (共95个)是字符(32是空格),其中 48~57为0到9十个阿拉伯数字。65~90为26个大写英文字母, 97 ~ 122号为26个小写英文字母,其余为一些标点符号、运算符号等。

    串行通信的应用

         使用串行通信我们就能让Arduino与计算机通信了,在Arduino端进行串行通信的引脚称为串行端口,一般分为发送和接收,其中发送用TX表示,接收用RX表示。

    深入了解Arduino与外部设备的通信方式,这些通信方式均属于串行通信. 串行通信是相对于并行通信的一个概念. 

    如上图所示,并行通信虽然可以多位数据同时传输,速度更快,但其占用的I/O口较多,而Arduino的I/O口资源较少,因此在Arduino中更常用的是串行通信方式.

       Arduino硬件集成了串口 IIC SPI 三种常见的通信方式,掌握了这三种通信类库的用法,即可与具有相应通信接口的各种设备通信,也可以为基于这些通信方式的传感器或模块写驱动程序.

    硬件串口通信---HardwareSerial 类库的使用

       串口,也称UART(Universal Asynchronous Receiver Transmitter, 通用异步(串行)收/发器)接口,是指Arduino 硬件集成的串口.

    在Arduino中,通过Arduino上的USB接口与计算机连接而进行Arduino与计算机之间的串口通信. 除此之外,还可以使用串口引脚连接其他的串口设备进行通信. 需要注意的是,通常一个串口只能连接一个设备进行通信.

    连接如下图所示

    在进行串口通信时,两个串口设备间需要发送端(TX)与接收端(RX)交叉相连,并共用电源地(GND).

       在Arduino UNO 及其他使用ATmega328芯片的Arduino控制器中,只有一组串行端口,即位于0(RX)和1(TX)的引脚.

    串口工作原理

       在Arduino与其它器件通讯的过程中,数据传输实际上都是以数字信号(即电平高低变化)的形式进行的,串口通信也是如此. 当使用Serial.print()函数输出数据时,Arduino的发送端会输出一连串的数字信号,称这些数字信号为数据帧.

       例如,当时用Serial.print('A')语句发送数据时,实际发送的数据帧格式如下图所示:

    (1)起始位

       起始位总为低电平,是一组数据帧开始传输的信号.

    (2)数据位

       数据位是一个数据包,其中承载了实际发送的数据的数据段. 当Arduino通过串口发送一个数据包时,实际的数据可能不是8位的,比如,标准的 ASCII码是0~127(7位). 而拓展的 ASCII码则是0~255(8位). 如果数据使用简单的文本(标准ASCII码),那么每个数据包将使用7位数据. Arduino默认使用8位数据位,即每次可传输1B数据.

    (3)校验位

       校验位是串口通信中一种简单的检错方式. 可以设置为偶校验或者奇校验. 当然,没有校验位也可以. Arduino默认无校验位.

    (4)停止位

       每段数据帧的最后都有停止位表示该段数据帧传输结束. 停止位总为高电平,可以设置为停止位为1位或2位. Arduino默认是1位停止位. 

       当串口通信速率较高或外部干扰较大时,可能会出现数据丢失的情况. 为了保证数据传输的稳定性,最简单的方式就是降低通信波特率或增加停止位和校验位. 在Arduino中,可以通过Serial.begin(speed, config)语句配置串口通信的数据位 停止位 和校验位参数. config 的可用配置可去网上搜索相应配置表.

     

    请大家注意区别:串口通信和串行通信。串行通信指的是一个大类,区别于并行通信;本系列中提到的串口通信一般指Arduino上面的USART通信模式,USART也是串行通信的一种,可以有硬串口,软串口两种实现方式,并且USART是一种异步串行通信.

     

    相关案例: 环境监测 温湿度传感器 案例   

    展开全文
  • 串口收发共需要三根线 其中,TX脚为发送引脚, RX脚为发送引脚, GND为地, 作为电平的参考. 如果A发B收, 只需要连接两条线: A的TX连接B的RX, 以及GND相连即可 1 传输一个字节 1.1 发送一个字节 首先, 从传输一个字节...
  • 串口的出现与RS232标准 串行接口_百度百科 (baidu.com) 串行接口 - 维基百科,自由的百科全书 (wikipedia.org) RS232接口_百度百科 (baidu.com) RS-232 - 维基百科,自由的百科全书 (wikipedia.org) 1962年,体积较...

    关于数据通信一些基本概念的介绍请参考我的另一篇博文:数据通信的基本概念_徐大康的博客-CSDN博客

    一. 串口的出现与RS232标准

    串行接口_百度百科 (baidu.com)

    串行接口 - 维基百科,自由的百科全书 (wikipedia.org)

    RS232接口_百度百科 (baidu.com)

    RS-232 - 维基百科,自由的百科全书 (wikipedia.org)

    1962年,体积较小的个人计算机还没有出现,那时电传打字机和计算机视频终端都需要与调制解调器进行通信,为规范此通信过程,美国电子工业协会(EIA)联合各个厂商发布了EIA-RS-232A标准,其中,RS英文全称是Recommended Standard,是推荐标准的意思;232是标识号;A表示首次发布。

    经过几年的实际应用和改进,1970年,EIA对RS232标准进行了第三次修订,发布了RS-232C标准。其中C表示是第三次修订(第二次修订是B)。

    EIA-RS-232简称232或RS232,目前最新的标准是1997年发布的EIA-RS232F,但RS232C是应用最广泛,最为人所知的232标准,所以一般人们说到RS232,指的都是RS232C

    RS232是一种串行通信标准,被简称为串口,最初它有22根线,采用DB25接插件,支持同步和异步串口,它的物理接口如下图(左)所示:

    串口通信简介——发展历史与基本概念-1

    DB25接口最初被广泛应用于个人计算机,因为其非常流行,人们还喜欢称它为COM口,意为communication口即通信口,在有多个通信口时,人们用COM1,COM2来称呼它们。

    随着技术的发展,设备制造商倾向于体积更小,成本更低的接口,因此,DB25中未使用的和支持同步模式的引脚被去掉了,形成了现在的DB9接口,如上图(右)所示。

    这种DB9接口连接可靠,还带屏蔽,曾作为计算机与外设间的通信接口红极一时,虽然现在个人计算机早已淘汰了这种接口,主要原因还是它太大了,不符合计算机小型化、轻量化的需求,但在对连接可靠性要求更高的工业控制领域,DB9接口仍然被广泛使用着,有时还并不是作为RS232的物理接口,而是作为其它通信协议例如CAN通信的接口。

    所以,发展到现在,RS232C及其对应的物理接口DB9在个人计算机上已经没有应用了,在工业控制板卡上RS232也应用的较少了,且一般也只用到TX、RX 和 GND这三根线而省略其它控制线,但DB9接口还在广泛使用。

    二. RS422的发展

    RS-422_百度百科 (baidu.com)

    EIA-422 - 维基百科,自由的百科全书 (wikipedia.org)

    RS232应用很广泛,但也有其局限性,传输距离短、速度较慢、不支持组网这三个缺点使得RS232C在长距离传输、较大数据量和需要组网的应用环境下变得不再适用。为了解决这一问题,1977年,EIA发布了RS422A标准。

    RS422的全称是“平衡电压数字接口电路的电气特性”,最新版标准是RS422B。

    RS422的比特率可达100kps~10Mbps(取决于数据线长度),最大传输距离可达1200米,也支持一主多从(单个发送端最多10个接收端)的组网方式,这些是RS422相对RS232的主要改进。

    为支持长距离传输,RS422采用差分传输,共五根线,TX+、TX-、RX+、RX- 和 GND,它并没有规定特定的物理接口,但实际使用时一般沿用RS232的DB9接口。

    虽然RS422能轻松连接一个发送端与10个接收端,但这时接收端只能接收而不能反过来发送数据,这相当于一种广播形式的连接,还没有实现多点间可互相收发的通信,所以,RS422标准实际应用的并不多,一般是作为RS232的扩展,等到它的改进版标准RS485推出之后,RS422基本销声匿迹了,成了串口通信历史的一个过客。

    三. RS485的发展与应用

    RS-485_百度百科 (baidu.com)

    EIA-485 - 维基百科,自由的百科全书 (wikipedia.org)

    为弥补RS422无法实现多点互收发通信的不足,1983年,EIA在RS422的基础上制定了RS485A标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上。

    RS485是一个异步半双工的串行通信协议。在硬件构成上,RS422相当于两组RS485,即两个半双工RS485构成了RS422,所以有时RS422又被称为全双工RS485。

    因为是半双工通信,RS485将RS422的五根线缩减为三根,分别是A+、B- 和 GND,+表示差分的正端,-表示差分的负端。

    同RS422一样,RS485也没有规定物理接口。

    RS485标准因为线数少、抗干扰性强、可灵活组网等优点在工业控制领域有着较广泛的应用。

    四. UART及其与RS232、RS422 和 RS485的关系

    UART_百度百科 (baidu.com)

    UART - 维基百科,自由的百科全书 (wikipedia.org)

    TTL电平_百度百科 (baidu.com)

    UART,Universal Asynchronous Receiver/Transmitter,通用异步收发器,是一种通信协议,它规定了数据的开始位、停止位、校验位等数据如何组织的规则。

    RS232、RS422 和 RS485这些标准只规定了通信的电气规则,像RS485规定二进制0的电平是+1.5 ~ +6V,二进制1的电平是-6 ~ -1.5V,它们并没有指定用什么方式组织数据。理论上,用除UART协议外的协议来组织发送数据,再通过RS232等接口规定的电平标准来完成数据收发是可行的,但一般没人这么干,因为UART足够简单且能满足要求了,所以上述三种标准采用UART协议组织数据已成为了一种事实标准,这一点我们从UART名字中的通用两字就可以看出端倪。

    因为UART都是由CPU、MCU等控制器或专用芯片产生的,所以UART的原始电平一般为TTL电平即低电平0V、高电平3.3V或5V。所以,单独说UART指的就是TTL电平的异步串行通信协议。它有三根线,TX、RX 和 GND,没有规定物理接口,一般直接用几根插针或者几个圆孔作为接口。

    因为TTL电平传输距离非常短,所以UART总是需要转换成其它电平标准,而向RS232、RS485 和 USB这三种转换是最多的。大名鼎鼎的MAXIM(美信)就起家于一个TTL电平转±15V的RS232电平的一个芯片——MAX232。同样著名的还有该公司的MAX485,该芯片的功能是将TTL电平转为RS485电平。UART转USB的需求也非常庞大,最著名的芯片是FTDI公司的FT232RL,国产的CH340G也不错。下图展示了一块使用FT232芯片的UART转micro-USB的板卡。

    串口通信简介——发展历史与基本概念-2

    五. 串口概念的总结

    从串口的发展历史我们知道,串口的说法最初指的是最流行的串行通信标准RS232。又因为RS422 和 RS485是在RS232基础上发展而来的,所以串口也可以指代它们。而UART是这几个标准均采用UART通讯协议,所以串口也包含了UART。

    总结一下,串口指的就是RS232、RS422、RS485 和 UART 这几种通信标准/协议。因为RS422基本很少见到了,所以我们日常说的串口,指的就是RS232、RS485 和 UART这三种。它们的一些特征如下表所示:

    串口类别RS232RS485UART
    通信类别异步串行通信异步串行通信异步串行通信
    通信协议UARTUARTUART
    物理接口DB9未规定未规定
    半/全双工全双工半双工全双工
    信号线数量标准9根,一般使用时简化为3根,
    Tx,Rx,GND
    3根
    A+,B-,GND
    3根
    Tx,Rx,GND
    逻辑电平RS232电平
    逻辑1:-15V ~ -5V
    逻辑0:+3V ~ +15V
    RS485电平
    逻辑1:+2V ~ +6V
    逻辑0:-6V ~ -2V
    TTL电平
    逻辑1:+2.4V ~ +5V
    逻辑0:0V ~ +0.5V
    传输距离较短,<15米较长,<1200米最短,<5米
    传输速度较慢,与距离有关,
    一般<20kbps
    较快,与距离有关
    一般100kbps~10Mbps
    较慢,与距离有关
    一般采用固定速度,
    如9600bps、115200bps等
    最快一般不超过921600bps
    应用场景工业上PCB板间通信,
    应用越来越少
    工业上PCB板间通信,
    相对RS232应用多一些
    主要用作调试接口,
    通过UART转USB后与电脑通信

    串口是一种习惯性的叫法,它并不特指哪一种具体的标准/协议,一般我们在描述的时候会说RS232串口、RS485串口、UART串口,以此来说明我们说的到底是哪一种串口。

    三种串口可以通过专用芯片实现互转也可以转为USB连接电脑,在电脑侧安装好对应的驱动,再借助各种串口调试工具即可实现在电脑上收发串口数据,甚至能看到波形。这是一种常用的代码调试手段。目前市面上已经有了多种串口转USB的工具,其中一种如下图所示:

    串口通信简介——发展历史与基本概念-3

    六. 参考书目

    1.《串行通信接口规范与标准》 [美] Louis E. Frenzel Jr 编著,林赐 翻译(第25章,第26章,第28章)

    2.《串行通信技术 面向嵌入式系统开发》 周云波 编著(第一章)

    展开全文
  • STC89C52RC串口收发例程,可直接拿来用,串口通信,例程简单,很容易看明白。 串行口为同步移位寄存器的输入输出方式。主要用于扩展并行输入或输出口。数据由RXD(P3.0)引脚输入或输出,同步移位脉冲由TXD(P3.1)...
  • TI MSP432学习之串口通信 四个串口,但是串口0好像出问题了。 为电赛准备的。
  • 51单片机——串行通信

    千次阅读 2021-08-28 23:03:37
    本文首先介绍了并行通信串行通信的概念,然后对串行通信进行详细的介绍。然后介绍了51单片机的串行通信口的结构与原理,最后介绍了串行通信的四种方式,并介绍了如何计算波特率。

    目录

    1 概述

    1.1 并行通信和串行通信

    1.2 串行通信的两种方式

    1.2.1 异步通信

    1.2.2 同步通信

    1.3 串行通信的数据传送方向

    2 串行通信口的结构与原理

    2.1 串行通信口的结构

    2.2 串行通信口的工作原理

    2.2.1 接收数据过程

     2.2.2 发送数据过程

    3 串行通信口的控制寄存器

    3.1 串行控制寄存器(SCON)

    3.2 电源控制寄存器(PCON)

    4 四种工作方式与波特率的设置

    4.1 方式0

    4.1.1 方式0-发送数据

    4.1.2 方式0-接收数据

    4.2 方式1

    4.2.1 方式1-发送数据

    4.2.2 方式1-接收数据

    4.3 方式2

    4.3.1 方式2-发送数据

    4.3.2 方式2-接收数据

    4.4 方式3

    4.5 波特率的设置

    4.5.1 方式0的波特率

    4.5.2 方式2的波特率

    4.5.3 方式1和方式3的波特率


    1 概述

            通信的概念比较广泛,在单片机技术中,单片机与单片机单片机与其他设备之间的数据传输称为通信。

    1.1 并行通信和串行通信

            根据数据传输方式的不同,可将通信分并行通信串行通信两种。同时传输多位数据的方式称为并行通信。同时传输一位数据的方式称为串行通信

            如图1(a)所示,在并行通信方式下,单片机中的8位数据10011101通过8条数据线同时送到外部设备中。并行通信的特点是数据传输速度快,但由于需要的传输线多,故成本高,只适合近距离的数据通信。逐位传输数据的方式称为串行通信。

            如图1(b)所示,在串行通信方式下,单片机中的8位数据10011101通过一条数据线逐位传送到外部设备中。串行通信的特点是数据传输速度慢,但由于只需要一条传输线,故成本低,适合远距离的数据通信。

    图1 通信方式 

    1.2 串行通信的两种方式

            串行通信又可分为异步通信同步通信两种。51系列单片机采用异步通信方式。

    1.2.1 异步通信

            在异步通信中,数据是一帧一帧传送的。异步通信如图2 所示,这种通信是以帧为单位进行数据传输,一帧数据传送完成后,可以接着传送下一帧数据,也可以等待,等待期间为空闲位(高电平)。

    图2 异步通信

            (1)帧数据格式

            在串行异步通信时,数据是以帧为单位传送的。异步通信的帧数据格式如图3所示。从图中可以看出,一帧数据由起始位、数据位、奇偶校验位和停止位组成。 

     图3 异步通信的帧数据格式

            ① 起始位。

            表示一帧数据的开始,起始位一定为低电平。当单片机要发送数据时,先送一个低电平(起始位)到外部设备,外部设备接收到起始信号后,马上开始接收数据。

            ② 数据位。

            它是要传送的数据,紧跟在起始位后面。数据位的数据可以是5~8位,传送数据时是从低位到高位逐位进行的。

            ③ 奇偶校验位。

            该位用于检验传送的数据有无错误。奇偶校验是检查数据传送过程中是否发生错误的一种校验方式,分为奇校验和偶校验。奇校验是指数据位和校验位中“1”的总个数为奇数,偶校验是指数据位和校验位中“1”的总个数为偶数。以奇校验为例,若单片机传送的数据位中有偶数个“1”,为保证数据和校验位中“1”的总个数为奇数,奇偶校验位应为“1”,如果在传送过程中数据位中有数据产生错误,其中一个“1”变为“0”,那么传送到外部设备的数据位和校验位中“1”的总个数为偶数,外部设备就知道传送过来的数据发生错误,会要求重新传送数据。数据传送采用奇校验或偶校验均可,但要求发送端和接收端的校验方式一致。在帧数据中,奇偶校验位也可以不用。

            ④ 停止位。

            它表示一帧数据的结束停止位可以是1位、1.5位或2位,但一定为高电平。一帧数据传送结束后,可以接着传送第二帧数据,也可以等待,等待期间数据线为高电平(空闲位)。如果要传送下一帧,只要让数据线由高电平变为低电平(下一帧起始位开始),接收器就开始接收下一帧数据。

            (2)51系列单片机的几种帧数据方式

            51 系列单片机在串行通信时,根据设置的不同,其传送的帧数据有以下四种方式:

            ① 方式0。

            称为同步移位寄存器输入/输出方式,它是单片机通信中较特殊的一种方式,通常用于并行I/O接口的扩展,这种方式中的一帧数据只有8位(无起始位、停止位)。

            ② 方式1。

            在这种方式中,一帧数据中有1位起始位、8位数据位和1位停止位,共10位

            ③ 方式2。

            在这种方式中,一帧数据中有1位起始位、8位数据位、1位可编程位和1位停止位,共11位。

            ④ 方式3。

            这种方式与方式2相同,一帧数据中有1位起始位、8位数据位、1位可编程位和1位停止位它与方式2的区别仅在于波特率(数据传送速率)设置不同

    1.2.2 同步通信

            在异步通信中,每一帧数据发送前要用起始位,结束时要用停止位,这样会占用一定的时间,导致数据传输速度较慢。为了提高数据传输速度,在计算机与一些高速设备进行数据通信时,常采用同步通信。同步通信的帧数据格式如图4所示。

     图4 同步通信的帧数据格式

            从图中可以看出,同步通信的数据后面取消了停止位,前面的起始位用同步信号代替,在同步信号后面可以跟很多数据,所以同步通信传输速度快。但由于在通信时要求发送端和接收端严格保持同步,这需要用复杂的电路来保证,所以单片机很少采用这种通信方式。

    1.3 串行通信的数据传送方向

            串行通信根据数据的传送方向可分为三种方式:单工方式半双工方式全双工方式。这三种传送方式如图5所示。

    图5 数据传送方式 

            ① 单工方式。在这种方式下,数据只能向一个方向传送。单工方式如图5(a)所示,数据只能由发送端传输给接收端。

            ② 半双工方式。在这种方式下,数据可以双向传送,但同一时间内,只能向一个方向传送,只有一个方向的数据传送完成后,才能往另一个方向传送数据。半双工方式如图5(b)所示,通信的双方都有发送器和接收器,一方发送时,另一方接收,由于只有一条数据线,所以双方不能在发送的同时进行接收。

            ③ 全双工方式。在这种方式下,数据可以双向传送,通信的双方都有发送器和接收器,由于有两条数据线,所以双方在发送数据的同时可以接收数据。全双工方式如图5(c)所示。

    2 串行通信口的结构与原理

            单片机通过串行通信口可以与其他设备进行数据通信,将数据传送给外部设备或接受外部设备传送来的数据,从而实现更强大的功能。

    2.1 串行通信口的结构

            51单片机的串行通信口的结构如图6所示。

     图6 串行通信口的结构

            与串行通信口有关的部件主要有:

            ① 两个数据缓冲器SBUF。

            SBUF是可以直接寻址的特殊功能寄存器(SFR),它包括发送SBUF和接收SBUF发送SBUF用来发送串行数据,接收SBUF用来接收数据,两者共用一个地址(99H)。在发送数据时,该地址指向发送SBUF;而在接收数据时,该地址指向接收SBUF。

            ② 输入移位寄存器。

            在接收控制器的控制下,将输入的数据逐位移入接收SBUF

            ③ 串行控制寄存器 SCON。

            SCON 的功能是控制串行通信口的工作方式,并反映串行通信口的工作状态

            ④ 定时器T1。

            T1用作波特率发生器,用来产生接收和发送数据所需的移位脉冲,移位脉冲的频率越高,接收和传送数据的速率越快

    2.2 串行通信口的工作原理

            串行通信口有接收数据和发送数据两个工作过程,下面以图6所示的串行通信口结构为例来说明这两个工作过程。

    2.2.1 接收数据过程

            在接收数据时,若RXD端(与P3.2引脚共用)接收到一帧数据的起始信号(低电平),SCON寄存器马上向接收控制器发出允许接收信号,接收控制器在定时器/计数器T1产生的移位脉冲信号控制下,控制输入移位寄存器,将 RXD 端输入的数据由低到高逐位移入输入移位寄存器中,数据全部移入输入移位寄存器后,移位寄存器再将全部数据送入接收 SBUF中,同时接收控制器通过或门向CPU发出中断请求,CPU马上响应中断,将接收SBUF中的数据全部取走,从而完成了一帧数据的接收。后面各帧的数据接收过程与上述相同。

     2.2.2 发送数据过程

            相对于接收过程来说,串行通信口发送数据的过程较简单。当CPU要发送数据时,只要将数据直接写入发送SBUF中,就启动了发送过程。在发送控制器的控制下,发送门打开,先发送一位起始信号(低电平),然后依次由低到高逐位发送数据,数据发送完毕,最后发送一位停止位(高电平),从而结束一帧数据的发送。一帧数据发送完成后,发送控制器通过或门向CPU发出中断请求,CPU响应中断,将下一帧数据送入SBUF,开始发送下一帧数据

    3 串行通信口的控制寄存器

            串行通信口的工作受串行控制寄存器SCON电源控制寄存器PCON的控制。

    3.1 串行控制寄存器(SCON)

            SCON 寄存器用来控制串行通信的工作方式及反映串行通信口的一些工作状态。SCON寄存器是一个8位寄存器,它的地址为98H,其中每位都可以位寻址。SCON寄存器各位的名称和地址如下。

            ① SM0、SM1位:串行通信口工作方式设置位

            通过设置这两位的值,可以让串行通信口工作在四种不同的方式,具体见表1,这几种工作方式在后面将会详细介绍。

    表1 串行通信口工作方式设置位及其功能

            ② SM2位:用来设置主-从式多机通信

            当一个单片机(主机)要与其他几个单片机(从机)通信时,就要对这些位进行设置。当SM2=1时,允许多机通信;当SM2=0时,不允许多机通信。

            ③ REN位:允许/禁止数据接收的控制位

            当REN=1时,允许串行通信口接收数据;当REN=0时,禁止串行通信口接收数据。

            ④ TB8位:方式2、3中发送数据的第9位

            该位可以用软件规定其作用,可用作奇偶校验位,或在多机通信时,用作地址帧或数据帧的标志位,在方式0和方式1中,该位不用。

            ⑤ RB8位:方式2、3中接收数据的第9位

            该位可以用软件规定其作用,可用作奇偶校验位,或在多机通信时,用作地址帧或数据帧的标志位,在方式1中,若SM2=0,则RB8是接收到的停止位。

            ⑥ TI位:发送中断标志位

            当串行通信口工作在方式0时,发送完8位数据后,该位自动置“1”(即硬件置“1”),向CPU发出中断请求,在CPU响应中断后,必须用软件清0在其他几种工作方式中,该位在停止位开始发送前自动置“1”,向CPU发出中断请求,在CPU响应中断后,也必须用软件清0,以准备开始发送下一帧数据

            ⑦ RI位:接收中断标志位

            当串行通信口工作在方式0时,接收完8位数据后,该位自动置“1”,向CPU发出接收中断请求,在CPU响应中断后,必须用软件清0在其他几种工作方式中,该位在接收到停止位期间自动置“1”,向CPU发出中断请求,在CPU响应中断取走数据后,必须用软件对该位清0,以准备开始接收下一帧数据。在上电复位时,SCON各位均为“0”。

    3.2 电源控制寄存器(PCON)

            PCON寄存器是一个8位寄存器,它的字节地址为87H,不可位寻址并且只有最高位SMOD与串行通信口控制有关。PCON寄存器各位的名称和字节地址如下。

            SMOD位:波特率设置位。

            在串行通信口工作在方式1~3时起作用。若SMOD=0,波特率不变;当SMOD=1时,波特率加倍。在上电复位时,SMOD=0。

    4 四种工作方式与波特率的设置

            串行通信口有四种工作方式工作在何种方式受SCON寄存器的控制。在串行通信时,要改变数据传送速率(波特率),可对波特率进行设置

    4.1 方式0

            当SCON寄存器中的SM0=0、SM1=0时,串行通信口工作在方式0

            方式0称为同步移位寄存器输入/输出方式,常用于扩展I/O端口。在单片机发送或接收串行数据时,通过RXD端发送数据或接收数据,而通过TXD端送出数据传输所需的移位脉冲

            在方式0时,串行通信口又分两种工作情况:发送数据和接收数据。

    4.1.1 方式0-发送数据

            当串行通信口工作在方式0时,若要发送数据,通常在外部接8位串/并转换移位寄存器74LS164,具体连接电路如图7所示。其中RXD端用来输出串行数据,TXD端用来输出移位脉冲,P1.0端用来对74LS164进行清0

     图7 串行通信在方式0时的数据发送电路

            在单片机发送数据前,先从P1.0引脚发出一个清0信号(低电平)到74LS164的CLR引脚,对其进行清0,让D7~D0全部为“0”然后单片机在内部执行写SBUF指令,开始从RXD端(P3.0引脚)送出8位数据,与此同时,单片机的TXD端输出移位脉冲到74LS164的CLK引脚,在移位脉冲的控制下,74LS164接收单片机RXD端送到的8位数据(先低位后高位),数据发送完毕,在74LS164的D7~D0端输出8位数据。另外,在数据发送结束后SCON寄存器的发送中断标志位TI自动置“1”

    4.1.2 方式0-接收数据

            当串行通信口工作在方式0时,若要接收数据,一般在外部接8位并/串转换移位寄存器74LS165,具体连接电路如图8 所示。在这种方式时,RXD端用来接收输入的串行数据,TXD端用来输出移位脉冲,P1.0端用来对74LS165的数据进行锁存

     图8 串行通信口在方式0时的数据接收电路

            在单片机接收数据前,先从 P1.0 引脚发出一个低电平信号到74LS165 的S/\overline{L}\引脚,让74LS165锁存由D7~D0端输入的8位数据,然后单片机内部执行读SBUF指令,与此同时,单片机的TXD端送移位脉冲到74LS165的CLK1引脚,在移位脉冲的控制下,74LS165中的数据逐位从RXD端送入单片机,单片机接收数据完毕,SCON寄存器的接收中断标志位RI自动置“1”。

            在方式0中,串行通信口发送和接收数据的波特率都是fosc/12

    4.2 方式1

            当SCON寄存器中的SM0=0、SM1=1时,串行通信口工作在方式1

            在方式1时,串行通信口可以发送和接收每帧10位的串行数据其中TXD端用来发送数据,RXD端用来接收数据。

            在方式1中,一帧数据中有10位,包括1位起始位(低电平)、8位数据位(低位在前)和1位停止位(高电平)。在方式1时,串行通信口又分两种工作情况:发送数据和接收数据。

    4.2.1 方式1-发送数据

            在发送数据时,若执行写SBUF指令,发送控制器在移位脉冲(由定时器/计数器T1产生的信号再经16或32分频而得到)的控制下,先从TXD端送出一个起始位(低电平),然后再逐位将8位数据从 TXD 端送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)

    4.2.2 方式1-接收数据

            在方式1时,需要设置SCON中的REN=1,串行通信口才允许接收数据。由于不知道外部设备何时会发送数据,所以串行通信口会不断检测RXD端,当检测到RXD端有负跳变(由“1”变为“0”)时,说明外部设备发来了数据的起始位,于是启动RXD端接收,将输入的8位数据逐位移入内部的输入移位寄存器。8位数据全部进入输入移位寄存器后,如果满足RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的数据停止位为“1”也可以)的条件,输入移位寄存器中的8位数据才可以放入SBUF,停止位的“1”才能送入SCON的RB8位中,RI位就会被置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,如果条件不满足,输入移位寄存器中的数据将无法送入SBUF而丢弃,重新等待接收新的数据

    4.3 方式2

            当SCON寄存器中的SM0=1、SM1=0时,串行通信口工作在方式2

            在方式2时,串行通信口可以发送和接收每帧11位的串行数据,其中1位起始位、8位数据位、1位可编程位和1位停止位。TXD端用来发送数据,RXD端用来接收数据

            在方式2时,串行通信口又分两种工作情况:发送数据和接收数据。

    4.3.1 方式2-发送数据

            在方式2时,发送的一帧数据有11位,其中有9位数据,第9位数据取自SCON中的TB8位。在发送数据前,先用软件设置TB8位的值,然后执行写SBUF指令(如MOV SBUF,A),发送控制器在内部移位脉冲的控制下,从TXD端送出一个起始位(低电平),然后逐位送出8位数据,再从TB8位中取出第9位并送出,当最后一位数据发送完成,发送控制器马上将SCON的TI位置“1”,向CPU发出中断请求,同时从TXD端输出停止位(高电平)

    4.3.2 方式2-接收数据

            在方式2时,同样需设置SCON的REN=1,串行通信口才允许接收数据,然后不断检测RXD端是否有负跳变(由“1”变为“0”),若有,说明外部设备发来了数据的起始位,于是启动RXD端接收数据。当8位数据全部进入输入移位寄存器后,如果RI位为“0”、SM2位为“0”(若SM2不为“0”,但接收到的第9位数据为“1”也可以),输入移位寄存器中的8位数据才可以送入SBUF,第9位会放进SCON的RB8位,同时RI位置“1”,向CPU发出中断请求,让CPU取走SBUF中的数据,否则输入移位寄存器中的数据将无法送入SBUF而丢弃

    4.4 方式3

            当SCON中的SM0=1、SM1=1时,串行通信口工作在方式3方式3与方式2一样,传送的一帧数据都为11位,工作原理也相同,两者的区别仅在于波特率不同,方式2的波特率固定为fosc/64或fosc/32,而方式3的波特率则可以设置

    4.5 波特率的设置

            在串行通信中,为了保证数据的发送和接收成功,要求发送方发送数据的速率与接收方接收数据的速率相同,而将双方的波特率设置相同就可以达到这个要求。在串行通信的四种方式中,方式0的波特率是固定的,而方式1~方式3的波特率则是可变的波特率是数据传送的速率,它用每秒传送的二进制数的位数来表示,单位符号是bit/s

    4.5.1 方式0的波特率

            方式0的波特率固定为时钟振荡频率的1/12,即方式0的波特率 = fosc/12

    4.5.2 方式2的波特率

            方式2的波特率由PCON寄存器中的SMOD位决定

            当SMOD = 0时,方式2的波特率为时钟振荡频率的1/64;

            当SMOD = 1时,方式2的波特率加倍,为时钟振荡频率的1/32,即

    方式2的波特率 = fosc*2^{SMOD}/64

    4.5.3 方式1和方式3的波特率

            方式1和方式3的波特率除了与SMOD位有关,还与定时器/计数器T1的溢出率有关。方式1和方式3的波特率可用下式计算:

    方式1、3的波特率 = T1的溢出率·2^{SMOD}/32

            T1的溢出率是指定时器/计数器T1在单位时间内计数产生的溢出次数,也即溢出脉冲的频率

            在将定时器/计数器T0设作工作方式3时,T1可以工作在方式0、方式1或方式2三种方式下。

            当T1工作于方式0时,它对脉冲信号(由时钟信号fosc经12分频得到)进行计数,计到2^{13}时会产生一个溢出脉冲到串行通信口作为移位脉冲;

            当T1工作于方式1和2时,则分别要计到2^{16}2^{8}−X(X为T1的初值,可以设定)才产生溢出脉冲。

            如果要提高串行通信口的波特率,可让T1工作在方式2,因为该方式计数时间短,溢出脉冲频率高,并且能通过设置T1的初值来调节计数时间,从而改变T1产生的溢出脉冲的频率(又称T1的溢出率)。

            当T1工作在方式2时,T1两次溢出的时间间隔,也即T1的溢出周期为

    T1的溢出周期 = (2^{8}− X)·12/ fosc

            T1的溢出率为溢出周期的倒数,即

    T1的溢出率 = fosc/[12·(2^{8}− X)]

            故当T1工作在方式2时,串行通信口工作方式1、3的波特率为

            方式1、3的波特率 = (2^{SMOD}/32)·fosc/[12·(2^{8}− X)] 

            由上式可推导出T1在方式2时,其初值X为

    X = 2^{8}− (2^{SMOD}·fosc)/(384·波特率)

            举例:单片机的时钟频率fosc=11.0592MHz,现要让串行通信的波特率为2400bit/s,可将串行通信口的工作方式设为1、T1的方式设为2,并求出T1应设的初值。

            求T1初值的过程如下。

            先进行寄存器设置:为了让波特率不倍增,将 PCON 寄存器中的数据设为00H,这样SMOD位就为“0”;设置TMOD寄存器中的数据为20H,这样T1就工作在方式2。再计算并设置T1的初值:

    X = 2^{8}2^{SMOD}·fosc/384·波特率 = 256 −(2^{0}× 11.0592 × 10^{6})/(384 × 2400)= 244

            十进制数244转换成十六进制数为F4H,将T1的初值设为F4H。

            由于设置波特率和初值需要计算,比较麻烦,一般情况下可查表来进行设置。常见的波特率设置见表2。

    表2 常用的波特率设置

    展开全文
  • 串口通信编程

    2021-07-18 20:23:45
    串口通信学习笔记

    一、串口通信基础知识

    1.1 串行通信与并行通信

    并行通信:在一些联络信号的控制下,一次将8位、16位或32位数据同时进行传送的通信方式。特点:通信速率高,但成本高,易受干扰。
    串行通信:只需一对传输线,数据的各位按照时间顺序一位一位地传送。特点:通信速率慢,但通信成本低,适合远距离通信。

    在这里插入图片描述

    1.2 串行通信的特点

    串行通信由于在一条传输线上既传输数据信息,又传输控制联络信息,这就需要一系列约定,从而识别条线上传送的信息流,哪一部分是数据信号,哪一部分是联络信号。

    串行通信的信息格式有异步和同步信息格式。与此对应,有异步串行通信和同步串行通信两种方式。

    1.2.1 异步传输

    在异步传输方式中,帧是数据传输单位。在通信的数据流中,帧之间异步,帧内部各位间同步。异步通信方式的“异步”主要体现在帧与帧之间通信没有严格的定时要求。在异步传输中,帧可以是连续地、一个个地发送,也可以是不连续地、随机地单独发送。
    请添加图片描述

    1.2.2 同步传输

    同步通信中,数据开始传送前用同步字符来指示(常约定1~2个),并由时钟来实现发送端和接收端的同步,即检测到规定的同步字符后,下面就连续按顺序传送数据,直到一块数据传送完毕。同步传送时,字符之间没有间隙,也不要起始位和停止位,仅在数据开始时用同步字符SYNC来指示。
    在这里插入图片描述

    1.2.3 硬件握手和软件握手

    握手信号实际上是控制信号,用来控制数据的传输。通过握手信号,发送端可以得知接收端是否有数据要发送。接收端通过握手信号通知发送端它是否已经准备好了接收信号。握手信号遵循某种协议。

    当发送端和接收端处理数据的速度不一样时,可能会造成数据丢失。在传输中,如果发送端的发送速度大于接收端的接收速度,同时若接收端处理数据的速度不够快的话,那么接收端的缓冲区必定在一定时间后溢出,从而造成以后发送过来的数据不能进入缓冲区而丢失。发送端何时可以继续发送数据,何时必须暂停发送,从而让接收端有时间处理数据,称为流量控制,必须靠握手信号来解决这个问题。

    1. 硬件握手

      在硬件握手中,发送端通过将某一个导线拉到高电平或者低电平,来表示发送端可以发送数据。接收端已经准备好接收数据之后,也把某一个导线拉到高电平或者是低电平,来通知发送端,发送端一直在检测这个信号。接收端可以在任何时候把这个信号变为无效,甚至是在接收一个数据块过程中。当发送端检测到这个信号变为无效之后,就必须停止本次发送,直到这个信号变为有效为止。

    2. 软件握手

      在软件握手中,以数据线上的数据信号来代替实际的硬件电路。这种方法用在直接连接或者通过调制解调器连接的两台计算机之间进行双向通信的场合。
      对于软件握手现在已经建立了一些标准协议,其中最常用的是通信协议。通信协议是指通信双方的一种约定,约定包括对数据格式、同步方式、传输速度、传输步骤、检/纠错方式以及控制字符定义等问题进行统一规定,通信双方必须共同遵守,也叫做通信控制规程或称传输控制规程,它属于OSI七层参考模型中的数据链路层。

    1.3 串行通信基本参数

    在传输进行的过程中,双方明确传输信息的具体方式,否则双方就会没有一套共同的译码方式,从而无法了解对方所传输过来的信息的意义。因此双方为了进行通信,必须遵守一定的通信规则,这个共同的规则就是串口的初始化。

    串口的初始化必须对以下几项参数进行设置。

    1.3.1 数据传输速度

    串行通信的传输受到通信双方配备性能及通信线路的特性所控制,收发双方必须按照同样的速率进行串行通信,即收发双方采用同样的波特率。我们通常将传输速度称为波特率,指的是串行通信中每秒所传输的数据位数,单位是b/s。我们经常可以看到仪器或Modem的规格书上都写着19200 b/s、38 400 b/s,…,所指的就是传输速度。

    1.3.2 起始位与停止位

    由于异步串行传输中并没有使用同步脉冲作为基准,故接收端完全不知道发送端何时将进行数据的传输。发送端准备要开始传输数据时,发送端会在所送出的字符前后分别加上高电位的起始位(逻辑0)及低电位的停止位(逻辑1),它们分别是所谓的起始位和停止位,也就是说,当发送端要开始传输数据时,便将传输线上的电位由低电位提升至高电位,而当传输结束后,再将电位降至低电位。接收端会因起始位的触发(因电压由低电位升至高电位)而开始接收数据;并因停止位的通知(因电压维持在低电位)而明确数据的字符信号已经结束;加入了起始位及停止位才能比较容易达到多字符的接收能力。起始位固定为1位,而停止位则有1、1.5、2位等多种选择,如何选择呢?只要通信双方协议通过即可,没有强制规定。

    1.3.3 校验位

    为了预防错误的产生,使用校验位作为检查的机制。校验位是用来检查所传输数据的正确性的一种核对码,又可分成奇校验与偶校验两种,分别是检查字符码中1的数目是奇数或偶数。以偶校验为例,“A"的ASCI码是41H(十六进制),将它以二进制表示时,是01000001,其中1的数目是2,因此校验位便是0,使1的数目保持偶数;同样地,校验位是奇校验时,“A”的校验位便是1,使1的数目保持在奇数。接收端重新计算奇偶校验位,如果新的计算值正确,那么表示正常。如果新的计算值错误,那么接收端就会发出一些指示,表示此次接收的数据有误。

    1.4 串行通信的传输方式

    1.4.1 信号传输方式

    • 近距离传输时,采用按信号原样传输的基波传输。
    • 远距离传输时,使用Modem将原信号调制为高频的模拟仿号,然后通过电话网络,进行远距离传输。

    1.4.2 线路传输方式

    • 单工方式:信息只能沿一个方向传输
    • 半双工方式:同一时刻,信息只能沿一个方向传输
    • 全双工方式:通信双方都能在同一时刻发送和接受

    1.5 串口通信及其标准

    1.5.1 RS-232C标准

    RS-232C是PC与通信工业中应用最广泛的一种串行接口。它适合于数据传输速度在 0~20000 b/s范围内的通信。这个标准对串行通信接口的有关问题,如信号电平、信号线功能、电气特性、机械特性等都作了明确的规定。

    由于RS-232C并未定义连接器的物理特性,因此,出现了 DB-25 和 DB-9 各种类型的连接器,其引脚的定义也各不相同。现在计算机上一般只提供 DB-9 连接器,都为公头。相应的连接线上的串口连接器也有公头和母头之分,见下图。请添加图片描述
    从功能上看,全部信号线从功能来看,全部信号线分为三类,即数据线(TXD,RXD)、地线(GND)和联络控制线(DSR,DTR,RI,DCD,RTS,CTS)

    当两台RS-232串口设备通信距离较近时(<15m),可以用电缆线直接将2台设备的RS-232端口连接,若通信距离较远(>15m)时,需附加调制解调器(Modem)。

    1.5.2 RS-422标准

    RS-422由RS-232发展而来,它是为了弥补RS-232的不足而提出的。为了改进RS-232抗干扰能力差、通信距离短、传输速度低等缺点,RS-422定义了一种平衡通信接口,将传输速度提高到10 Mb/s,速率低于100 kb/s时传输距离延长到4000英尺(1英尺=0.3048 m),并允许在一条平衡总线上连接最多10个接收器。RS-422是一种单机发送、多机接收的单向、平衡传输规范,被命名为TIA/EIA-428-A标准。

    1.5.3 RS-488标准

    为扩展应用范围,EIA又于1983年在RS-422基础上制定了RS-485标准,增加了多点、双向通信能力,即允许多个发送器连接到同一条总线上,同时增加了发送器的驱动能力和冲突保护特性,扩展了总线共模范围,后命名为TIA/EIA-488-A标准。由于EIA提出的建议标准都是以“RS”作为前缀的,所以在通信工业领域,仍然习惯将上述标准以RS作为前缀。

    1.5.4 参数比较

    RS-232,RS-422与RS-485标准只对接口的电气特性做出规定,而不涉及接插件、电缆或协议,在此基础上用户可以建立自己的高层通信协议。有关电气参数见下表。
    在这里插入图片描述

    1.6 个人计算机中的串口

    1.6.1 观察计算机上串口位置和几何特征

    在PC主机箱后面板上,有各种各样的接口,其中有个9针的接头区,这就是RS-232C串口。PC上的串行接口有多个名称:RS-232口、串口、通信口、COM口、异步口等。

    1.6.2 查看串口设备信息

    打开“设备管理器”。在列表中有端口COM和LPT设备信息,如图所示。
    在这里插入图片描述
    右键单击“通信端口(COM1)”,选择属性,在这里可以查看端口的低级设置,也可查看其资源。在“端口设置”选项卡中,可以看到缺省的波特率和其他设置,这些设置可以在这里改变,也可以在应用程序中很方便地修改。在“资源”选项卡中,可以看到,COM1口的地址分配信息(03F8-03FF)和中断请求号(04),如图所示。
    请添加图片描述

    二、Windows串口编程

    Windows API是由操作系统所提供的函数,这些函数可以为程序设计人员提供相当多的执行功能。Windows的API包括了串口通信的函数,因而在串口通信中使用调用API接口的方法,是实现在C中直接控制串口硬件的简便可行的解决方案。

    2.1 动态链接库与API函数

    Windows是多任务操作系统。在多任务环境中,应用程序共享内存资源,如果多个应用程序都调用库文件中相同的函数,则在链接时把该函数复制给每个应用程序,运行时在内存中生成同一函数的多个复制,造成内存资源的浪费;此外,如果修改了库中函数的代码,则必须对调用该函数的应用程序重新进行链接。因此,在Windows环境下,通常使用动态链接库(Dynamic Link Libaray,DLL)。动态链接库是一个函数库,是可被其他程序或DLL调用的函数集合组成的可执行文件模块。之所以被称为动态链接库,是因为DLL的代码并不是某个应用程序的组成部分,而是在运行时链接到应用程序中。

    动态链接分为两个阶段,即链接过程和装入过程。

    当应用程序调用动态链接库中的某个函数时,链接程序并不复制被调用函数的代码,而只是从引入库中复制一些指示信息,指出被调用函数属于哪个动态链接库(.DLL文件)。因此,在应用程序的可执行文件中,存放的不是被调用的函数的代码,而是DLL中该函数的内存地址。程序运行后,当需要调用该函数时,进入装入过程,把应用程序与DLL库一起装入内存,由Windows读入DLL中的函数并运行程序。

    可以看出,动态链接是在应用程序被装入到内存中进行的。这样,当多个应用程序调用库中的同一个函数时,不会在内存中有该函数的多个复制,而是只有一分复制,每个应用程序的可执行文件中装入的只是该函数的内存地址,程序运行时再把应用程序代码与被调用函数代码动态链接起来,从而可以节省内存资源。同时,由于DLL与应用程序分开,即使更新DLL,也不用修改已编译好的可执行文件。

    常用的动态链接库是安装在Windows目录下,随Windows软件包提供的DLL。这些动态链接库中所包含的函数就称为Windows API函数。

    2.2 与串口通信有关的API函数

    虽然串口是属于硬件层面,可Windows却将它当成一个文件来操作,因此打开串口时,就必须像打开文件那样操作。在使用完串口时,必须使用关闭文件的函数将串口关闭。

    与串口通信有关的API函数均在\Window\system32子目录下的USER.EXE动态链接库中,API中与串行通信相关的函数约有20个,本节只讨论经常使用的函数。

    2.2.1 打开串口

    Win32 中用于打开串口的API 函数为CreateFile,其原型为:

    HANDLE CreateFile (
    	LPCTSTR lpFileName, //将要打开的串口逻辑名,如COM1 或COM2
    	DWORD dwAccess, //指定串口访问的类型,可以是读取、写入或两者并列
    	DWORD dwShareMode, //指定共享属性,由于串口不能共享,该参数必须置为0
    	LPSECURITY_ATTRIBUTES lpsa, //引用安全性属性结构,缺省值为NULL
    	DWORD dwCreate, //创建标志,对串口操作该参数必须置为OPEN_EXISTING
    	DWORD dwAttrsAndFlags, //属性描述,用于指定该串口是否可进行异步操作,FILE_FLAG_OVERLAPPED:可使用异步的I/O
    	HANDLE hTemplateFile //指向模板文件的句柄,对串口而言该参数必须置为NULL
    );
    

    例如,以下程序用于以同步读写方式打开串口COM1:

    HANDLE hCom;
    DWORD dwError;
    hCom = CreateFile("COM1", GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_EXISTING, 0, NULL);
    if (hCom == (HANDLE)0xFFFFFFFF)
    {
    	dwError = GetLastError();
    	MessageBox(dwError);
    }
    

    2.2.2 关闭串口

    利用API 函数实现串口通信时关闭串口非常简单,只需使用CreateFile 函数返回的句柄作为参数调用CloseHandle 即可:

    BOOL CloseHandle(
    	HANDLE hObject // handle to object to close
    );
    

    2.2.3 配置串口

    串口通信中,使用该数据结构存放通信参数。由于该结构包括的通信参数很多,逐个设置不方便。通常的做法是首先将串口的当前设置值读出到一个DCB结构中,然后根据需要修改该DCB结构中的某些参数,再以该结构来设置串口通信参数。

    接收缓冲区和发送缓冲区的大小可通过SetupComm 函数来设置。

    typedef struct _DCB { // dcb
    	DWORD DCBlength; // DCB结构的大小
    	DWORD BaudRate; // 通信波特率
    	DWORD fBinary: 1; // 是否允许二进制方式通信。只能设为TRUE,即使用二进制方式通信。因为WinAPI只支持二进制方式通信。若设为FALSE则通信不能正常工作。
    	DWORD fParity: 1; // 是否允许奇偶校验。若设为TRUE,则通信时执行奇偶校验检测,并且当出现奇偶校验错时,将会产生错误信息。
    	DWORD fOutxCtsFlow:1; // 指定串口输出数据时,是否使用CTS作为流控制信号。
    	DWORD fOutxDsrFlow:1; // 指定串口输出数据时,是否使用DSR作为流控制信号。
    	DWORD fDtrControl:2; // 指定DTR流控制信号的工作方式。可取的值:DTR_CONTROL_DISABLE,禁止DTR信号线,并保持禁止状态;DTR_CONTROL_ENABLE,允许DTR信号线,并保持允许状态;DTR_CONTROL_HANDSHAKE,允许DTR握手。此时不允许在程序中使用EscapeCommFunction()函数调整DTR信号线的状态。
    	DWORD fDsrSensitivity:1; // 指定通信驱动程序对DSR信号是否敏感。如果设为TRUE,则当DSR线为无效状态时,串口接收的任何数据将被忽略。
    	DWORD fTXContinueOnXoff:1; // 指定当接收缓冲区已满,并且驱动程序已经发出XoffChar字符时,发送是否停止。如果为FALSE则停止。fOutX:指定在发送串口数据时是否使用Xon/Xoff流控制。当该成员设为TRUE时,则率门在收到XofChar时传输将停止,直到接收到XonChar时,发送操作才继续进行。
    	DWORD fOutX: 1; // 指定在发送串口数据时是否使用Xon/Xoff流控制。当该成员设为TRUE时,则串口在收到XoffChar时传输将停止,直到接收到XonChar时,发送操作才继续进行。
    	DWORD fInX: 1; // finX:指定在接收审口数据时是否使用Xon/Xoff流控制。当该成员设为TRUE时,则在接收缓冲区中数据长度达到接收界限值(接收缓冲区长度与XofLim之差)时,驱动程序将发送XofrChar,以通知发送方停止发送数据。直到接收缓冲区中数据长度小于XonLim时,驱动程序才发送XonChar,以通知发送方可以继续发送数据。
    	DWORD fErrorChar: 1; // 当数据发生奇偶校验错时,指定是否用ErrorChar成员值替换该错误数据。若该成员值设为TRUE,则当fParity设为TRUE并且发生奇偶校验错时,将进行此替换操作。
    	DWORD fNull: 1; // 指定是否忽略接收数据中的空字符(ASCI1码值为0)。该成员值设为TRUE,则执行忽略的操作。
    	DWORD fRtsControl:2; // 指定RTS流控制方式。
    	DWORD fAbortOnError:1; // 指定当发生错误时,是否终止发送和接收操作。若设为TRUE,则发生通信错误时,将终止所有的发送和接收操作。此时,驱动程序不再响应任何通信操作。直到程序调用了ClearCommError()函数响应该错误,通信才恢复正常。
    	DWORD fDummy2:17; // 系统保留不使用
    	WORD wReserved; // 不使用,设为0
    	WORD XonLim; // 指定在发出Xon字符前,接收缓冲区中允许的最小字符数量。
    	WORD XoffLim; // 指定在发出Xoff字符前,接收缓冲区中允许的最大字符数量。该最大字符数量为接收缓冲区长度与XoffLim之差。
    	BYTE ByteSize; // 指定通信数据位数, 4-8
    	BYTE Parity; // 指定奇偶校验方式
    	BYTE StopBits; // 指定停止位数
    
    	char XonChar; // 指定通信时发送XON字符使用的字符值(ASCII码值)。
    	char XoffChar; // 指定通信时发送XOFF字符使用的字符值(ASCII码值)。
    	char ErrorChar; // 指定通信发生奇偶校验错误时,用于替换错误数据的字符值。
    	char EofChar; // 指定表示传输结束的字符值
    	char EvtChar; // 指定事件字符。当传输中出现该宁符时,将产生一个事件。
    	WORD wReserved1; // 系统保留不使用
    } DCB;
    

    而SetupComm 函数的原型则为:

    BOOL SetupComm(
    	HANDLE hFile, // 指向一个串口设备的句柄,该句柄由CreateFile()函数返回
    	DWORD dwInQueue, // 指示输入缓冲区大小,以字节为单位
    	DWORD dwOutQueue // 指示输出缓冲区大小,以字节为单位
    );
    

    要设置串行通信参数,首先定义一个DCB结构类型的变量。根据通信要求,设置该结构变量的数值,然后以该结构变量作为参数,执行SetCommState() 函数即可完成串口通信参数的设置。

    BOOL Setcomnstate(
    HANDLE hFile, // 指向要设置参数的串口句柄。该句柄通常是CreateFile 函数的返回值。
    LPDCB IpDCB ); //指向DCB结构变量的指针。该结构变量中存放着通信参数设置的具体数值。
    

    以下程序将串口设置为:波特率为9600,数据位数为7 位,停止位为2 位,偶校验,接收缓冲区和发送缓冲区大小均为1024 个字节,最后用PurgeComm 函数终止所有的后台读写操作并清空接收缓冲区和发送缓冲区:

    DCB dcb;
    dcb.BaudRate = 9600; //波特率为9600
    dcb.ByteSize = 7; //数据位数为7 位
    dcb.Parity = EVENPARITY; //偶校验
    dcb.StopBits = 2; //两个停止位
    dcb.fBinary = TRUE;
    dcb.fParity = TRUE;
    if (!SetCommState(hCom, &dcb))
    {
    	MessageBox("串口设置出错!");
    }
    SetupComm(hCom, 1024, 1024);
    PurgeComm(hCom, PURCE_TXABORT | PURGE_RXABORT | PURGE_TXCLEAR | PURGE_RXCLEAR);
    

    2.2.4 超时设置

    超时设置是通过改变COMMTIMEOUTS 结构体的成员变量值来实现的,COMMTIMEOUTS 的原型为:

    typedef struct _COMMTIMEOUTS
    {
    	DWORD ReadIntervalTimeout; //定义两个字符到达的最大时间间隔,单位:毫秒
    	//当读取完一个字符后,超过了ReadIntervalTimeout,仍未读取到下一个字符,就会发生超时
    	
    	DWORD ReadTotalTimeoutMultiplier;
    	DWORD ReadTotalTimeoutConstant;
    	//其中各时间所满足的关系如下:
    	//ReadTotalTimeout = ReadTotalTimeOutMultiplier* BytesToRead + ReadTotalTimeoutConstant
    	DWORD WriteTotalTimeoutMultiplier;
    	DWORD WriteTotalTimeoutConstant;
    	
    } COMMTIMEOUTS, *LPCOMMTIMEOUTS;
    

    设置超时的函数为SetCommTimeouts,其原型中接收COMMTIMEOUTS 的指针为参数:

    BOOL SetCommTimeouts(
    	HANDLE hFile, // handle to communications device
    	LPCOMMTIMEOUTS lpCommTimeouts // pointer to comm time-out structure
    );
    

    以下程序将串口读操作的超时设定为10 毫秒:

    COMMTIMEOUTS to;
    memset(&to, 0, sizeof(to));
    to.ReadIntervalTimeout = 10;
    SetCommTimeouts(hCom, &to);
    

    2.2.5 事件设置

    在读写串口之前,需要用SetCommMask ()函数设置事件掩模来监视指定通信端口上的事件,其原型为:

    BOOL SetCommMask(
    	HANDLE hFile, //标识通信端口的句柄
    	DWORD dwEvtMask //能够使能的通信事件
    );
    

    有了Set 当然还会有Get,与SetCommMask 对应的GetCommMask()函数的原型为:

    BOOL GetCommMask(
    	HANDLE hFile, //标识通信端口的句柄
    	LPDWORD lpEvtMask // address of variable to get event mask
    );
    

    串口上可以发生的事件可以是如下事件列表中的一个或任意组合:EV_BREAK、EV_CTS、EV_DSR、EV_ERR、EV_RING、EV_RLSD、EV_RXCHAR、EV_RXFLAG、EV_TXEMPTY。

    我们可以用WaitCommEvent()函数来等待串口上我们利用SetCommMask ()函数设置的事件:

    BOOL WaitCommEvent(
    	HANDLE hFile, //标识通信端口的句柄
    	LPDWORD lpEvtMask, // address of variable for event that occurred
    	LPOVERLAPPED lpOverlapped, // address of overlapped structure
    );
    

    WaitCommEvent()函数一直阻塞,直到串口上发生我们用所SetCommMask ()函数设置的通信事件为止。一般而言,当WaitCommEvent()返回时,程序员可以由分析*lpEvtMask 而获得发生事件的类别,再进行相应的处理。

    2.2.6 读串口

    对串口进行读取所用的函数和对文件进行读取所用的函数相同,读函数原型如下:

    BOOL ReadFile(
    	HANDLE hFile, // 指向串口句柄。该句柄由CreateFile()函数返回。
    	LPVOID lpBuffer, // 指向某个缓冲区的指针。该缓冲区存放接收到的二进制数据。
    	DWORD nNumberOfBytesToRead, // 要接收的字节数。
    	LPDWORD lpNumberOfBytesRead, // 实际接收到的字节数。
    	LPOVERLAPPED lpOverlapped // 指向重叠结构变量的指针。当使用重叠操作时,必须设置该成员,否则必须设为NULL
    );
    

    2.2.7 写串口

    对串口进行写入所用的函数和对文件进行写入所用的函数相同,写函数原型如下:

    BOOL WriteFile(
    	HANDLE hFile, // 指向串口句柄。该句柄由CreateFile 函数返回。
    	LPCVOID lpBuffer, // 指向某个缓冲区的指针。该缓冲区存放待发送的二进制数据。
    	DWORD nNumberOfBytesToWrite, // 要发送的字节数。
    	LPDWORD lpNumberOfBytesWritten, // 实际发送了的字节数。
    	LPOVERLAPPED lpOverlapped // 指向重叠结构变量的指针。当使用重叠操作时,必须设置该成员,否则,必须设为NULL。
    );
    

    参考资料:

    1. 曹卫杉 . C/C++串口通信典型应用实例编程实践 . 电子工业出版社 , 2009
    2. 深入浅出VC++串口编程
    3. 龚建伟 , 熊光明 . Visual C++/Turbo C串口通信编程实践 . 电子工业出版社, 2004
    4. 张筠莉 , 刘书智 . VISUAL C++实践与提高:串口通信与工程应用篇 . 中国铁道出版社
    5. 梦小羊博客:串口通信知识总结
    展开全文
  • 基础知识:单片机串口通信基础 、ESP8266AT指令集; 配置并测试ESP8266 1. ESP8266与USB-TTL转串口连接 ESP8266管脚 VCC CH_PD/EN TX RX GND USB-TTL管脚 3.3V 3.3V RXD TXD GND  连线完成后,插入电脑...
  • stm32f407vgt6串口通信

    2018-12-21 20:05:29
    stm32f407vgt6USART1串口通信,绝对可靠,如果大家的串口通信有乱码可以观看一下注意事项中的小编的个人经验,希望对大家有所帮助。
  • EDA课设 FPGA开发板 VHDL实现串口通信

    千次阅读 多人点赞 2021-07-20 21:28:14
    VHDL UART串口通信设计 实现开发板与计算机串口助手之间的收发,并能够自行调节波特率。自行设计通信格式并完成调试。
  • 16 . USART 串口通信实验

    千次阅读 2021-05-21 14:54:40
    USART 串口通信实验 我们知道STM32F1 内部含有非常多的通信接口,我们就来学习下USART 串口通信。要实现的功能是:STM32F1 通过USART1 实现与PC 机对话,STM32F1 的USART1 收到PC 机发来的数据后原封不动的返回给PC ...
  • FPGA串口通信实验

    2021-03-07 08:41:51
    目录串口简介串口通信简介同步通信异步通信串口接头协议标准电气特性时序介绍设计思想 串口通信是FPGA较为基础的一个实验,本人在初学FPGA后决定将其整理一下并进一步加强自身理解。 串口简介 串口也称串行通信接口...
  • ESP2866-12(NODE-MCU)与Arduino之间的串行通信以增加模拟引脚的数量为我的主要工作。
  • 串口通信详解

    万次阅读 多人点赞 2020-09-08 21:33:44
    一、通信的基础概念 (1)通信的发展历史 通信:狼烟 ---> 信件 ---> 电子通信(电报、电话、网络信号)。 通信中最重要的两个方面:信息表示、解析方法 + 信息的传输方法。 通信双方事先需要约定好...
  • 51单片机的串口通信

    2019-11-14 16:28:57
    1、实现现象:下载程序后打开串口调试助手,将波特率设置为4800,选择发送的数据就可以显示 在串口助手上 2、实验程序 #include "reg52.h" typedef unsigned int u16; typedef unsigned char u8; void ...
  • CH9329 是一款串口转标准设备(键盘、鼠标、自定义 HID)芯片,根据不同的...通过提供的上位机软件,用户也可自行配置芯片工作模式、串口通信模式、串口通信波特率、多种超时时间、VID、PID,以及各种 USB 字符串描述符。
  • 单片机(AT89C51)的串行接口及串行通信是非常重要的一项技术,我们需要...正式进入串口通信前我们需要了解什么是通信? 计算机与外界信息交换称为通信。通信的基本方式可分为并行通信和串行通信(本次的主角): ...
  • UART串口通信

    2021-11-10 15:35:21
    串行接口简称“串口”,即采用串行通信方式的接口。 串行通信将数据字节分成一位一位的形式,在一条数据线上逐个传送。 串行通信的特点:通信线路简单,但传输速度较慢。 因此,串行接口广泛应用于对数据传输速度...
  • 单片机串行通信

    千次阅读 2020-08-07 12:11:42
    文章目录串行通信串行口控制器内部结构串行口控制寄存器工作方式0工作方式 1工作方式2工作方式 3 串行通信 计算机与外部设备的通信方式有两种,一是并通信、二是串行通信串行通信有:单工、半双工(常用)、全...
  • CC2530 串口通信

    千次阅读 2018-12-29 22:21:08
    CC2530 串口通信    基础  编写程序实现实验板定期向PC机串口发送字符串“Hello ! I am CC2530 。\n”。实验板开机后按照设定的时间间隔,不断地向PC及发送字符串,报告自己的状态,每发送一次字符串消息,LED...
  • 单片机 串口编程之串口通信仿真实验

    万次阅读 多人点赞 2018-11-17 18:28:24
    单片机 串口编程之串口通信仿真实验 一、简述 记--简单的使能串口,串口收发数据的例子。(使用Proteus仿真+虚拟串口调试) 代码,仿真文件打包:链接: https://pan.baidu.com/s/1nyb46fTJrYcAy_VarFdO3A 提取...
  • 串口通信基础知识详解

    千次阅读 多人点赞 2020-06-28 15:57:24
    目录通信基础知识STM32串口通信基础(UART)串口通信过程UART中设置的参数 通信基础知识   首先两个设备间的通信方式可分为并行通信和串行通信两种他们区别如下: 并行通信 串行通信 传输原理 数据各个位...
  • STM32串行通信理解

    2020-11-23 17:12:09
    串行通信的通信方式:二、STM32串口通信基础1.STM32的串口通信接口2.UART异步通信方式引脚连接方法:3.UART异步通信方式特点:4.STM32串口通信过程:5.STM32异步通信要定义哪些参数:6.串口通信框图7.串口设置的一般...
  • STM32之串口通信(USART)

    2020-04-17 15:14:22
    USART是通用同步异步串口通信的简称,以STM32为例,它不仅支持最基本的通用串口同步、异步通信,还具有LIN总线功能(局域互联网)、IRDA功能(红外通信)、SmartCard功能。 异步串口通信协议 最基本、最常用的方法:全...
  • 串口通信的原理串口通信(SerialCommunications)的概念非常简单,串口按位(bit)发送和接收字节。尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现...
  • 这里我们详细说明MSP430G2553串口通信。其引脚排布如图1.1所示。其功能表如表1.1所示。  串行通讯模块主要由三个部分组成:波特率生成部分、发送控制器以及接收控制器。如图1.2所示。     ...
  • 首先对串口通信和串口进行解析,我们先来看一下百度百科对这两者的解释: 串行通信作为计算机通信方式之一,主要起到主机与外设以及主机之间的数据传输作用,串行通信具有传输线少、成本低的特点。 串行接口简称...
  • Proteus串口通信

    千次阅读 2020-06-01 11:00:59
     主要介绍如何在proteus中搭建串口通讯电路,然后在PC中使用串口助手和proteus中的MCU进行通信。 2.主要使用到的软件  ① Proteus  Proteus是由Lab Center Electronics公司推出的电子设计自动化(EDA)软件。除...
  • /*开机自检,串口通信电源指示灯亮,呼吸灯急速闪烁, 应用模式 0为静默待机 1为距离模式 2为急速返回模式 实际距离小于预设宽度返回1///实际距离大约预设返回0 3改灯光效果 6位数据,接管电源灯-电源灯亮-...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 28,638
精华内容 11,455
关键字:

串行通信引脚