串口通讯_串口通讯协议 - CSDN
精华内容
参与话题
  • 串口通讯基本原理 【详细】

    千次阅读 多人点赞 2018-11-17 08:54:36
    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。 串口通讯,RS232,RS485,停止位,奇校验,偶校验 1 串口通讯  串口通讯(Serial Communication),是指外设和计算机间,通过数据...

    串口通信的基本知识

    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。

    串口通讯,RS232,RS485,停止位,奇校验,偶校验

    1 串口通讯
        串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
        串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。


    2 串口通讯的数据格式


        一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
        每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。

    3 通讯方式
        单工模式(Simplex Communication)的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。
    半双工模式(Half Duplex)通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工模式既可以使用一条数据线,也可以使用两条数据线。半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟,信息传输效率低些。
        全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。
        显然,在其它参数都一样的情况下,全双工比半双工传输速度要快,效率要高。

    4 偶校验与奇校验
        在标准ASCII码中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

    5 停止位
        停止位是按长度来算的。串行异步通信从计时开始,以单位时间为间隔(一个单位时间就是波特率的倒数),依次接受所规定的数据位和奇偶校验位,并拼装成一个字符的并行字节;此后应接收到规定长度的停止位“1”。所以说,停止位都是“1”,1.5是它的长度,即停止位的高电平保持1.5个单位时间长度。一般来讲,停止位有1,1.5,2个单位时间三种长度。

    6 波特率
        波特率就是每秒钟传输的数据位数。
        波特率的单位是每秒比特数(bps),常用的单位还有:每秒千比特数Kbps,每秒兆比特数Mbps。串口典型的传输波特率600bps,1200bps,2400bps,4800bps,9600bps,19200bps,38400bps。
        PLC/PC与称重仪表通讯时,最常用的波特率是9600bps,19200bps。PLC/PC或仪表与大屏幕通讯时,最常用的波特率是600bps。

    7 典型的串口通讯标准
        EIA RS232(通常简称“RS232”): 1962年由美国电子工业协会(EIA)制定。
        EIA RS485(通常简称“RS485”): 1983年由美国电子工业协会(EIA)制定。

    8 RS232串口
        RS232是计算机与通信工业应用中最广泛一种串行接口。它以全双工方式工作,需要地线、发送线和接收线三条线。RS232只能实现点对点的通信方式。
    8.1 RS232串口缺点
        ●接口信号电平值较高,接口电路芯片容易损坏。
        ●传输速率低,最高波特率19200bps。
        ●抗干扰能力较差。
        ●传输距离有限,一般在15m以内。
        ●只能实现点对点的通讯方式。
    8.2 RS232串口接口定义
        RXD:接收数据,TXD:发送数据,GND/SG:信号地。
    8.3 电脑DB9针接口定义
        电脑DB9针接口是常见的RS232串口,其引脚定义如下:
        2号脚:RXD(接收数据)
        3号脚:TXD(发送数据)
        5号脚:SG或GND(信号地)
        其它脚:我们不用

        

        电脑RS232串口与仪表串口连接图:
     
        

    9 RS485串口
    9.1 RS485串口特点
        ●RS485采用平衡发送和差分接收,具有良好的抗干扰能力,信号能传输上千米。
        ●RS485有两线制和四线制两种接线。采用四线制时,只能实现点对多的通讯(即只能有一个主设备,其余为从设备)。四线制现在很少采用,现在多采用两线制接线方式。
        ●两线制RS485只能以半双式方式工作,收发不能同时进行。
        ●RS485在同一总线上最多可以接32个结点,可实现真正的多点通讯,但一般采用的是主从通信方式,即一个主机带多个从机。
        ●因RS485接口具有良好的抗干扰能力,长的传输距离和多站能力等优点使其成为首选的串行接口。
    9.2 485抑制共模干扰示意图
        
    9.3 RS485串口接口定义
        A或Data+(D+)或+:信号正;
        B或Data-(D-)或-:信号负。
    9.4 计算机与RS485仪表通讯
        计算机自带的串口只有RS232,没有RS485,如果计算机要与RS485串口的仪表进行通讯,必须使用串口转换器或装上RS485串口转换卡后才能进行通讯。
    9.5 RS485串口的终端电阻
        ●一般情况下不需要增加终端电阻,只有在RS485通信距离超过100米的情况下,要在RS485通讯的开始端和结束端增加终端电阻,RS485典型终端电阻是120欧。
        ●终端电阻是为了消除在通信电缆中的信号反射在通信过程中,有两种信号因导致信号反射:阻抗不连续和阻抗不匹配。
        阻抗不连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射。消除这种反射的方法,就必须在电缆的末端跨接一个与电缆的特性阻抗同样大小的终端电阻,使电缆的阻抗连续。由于信号在电缆上的传输是双向的,因此,在通讯电缆的另一端可跨接一个同样大小的终端电阻。
        引起信号反射的另一原因是数据收发器与传输电缆之间的阻抗不匹配。这种原因引起的反射,主要表现在通讯线路处在空闲方式时,整个网络数据混乱。要减弱反射信号对通讯线路的影响,通常采用噪声抑制和加偏置电阻的方法。在实际应用中,对于比较小的反射信号,为简单方便,经常采用加偏置电阻的方法。

    10 串口通讯硬件常见的注意事项
        ●通讯电缆端子一定接牢,不可有任何松动,否则,可能会烧坏仪表或上位机的通讯板。
        ●不可带电拔插通讯端子,否则,可能会烧坏仪表或上位机的通讯板,一定要关闭仪表电源后才能去拔插通讯端子或接通讯线。
        ●通讯用的屏蔽电缆最好选用双层隔离型屏蔽电缆,其次选用单层屏蔽电缆,最好不要选用无屏蔽层的电缆,且电缆屏蔽层一定要能完全屏蔽,有些质量差的电缆,屏蔽层很松散,根本起不到屏蔽的作用。单层屏蔽的电缆屏蔽层应一端接地,双层屏蔽的电缆屏蔽层其外层(含铠装)应两端接地,内层屏蔽则应一端接地。
        ●仪表使用RS232通讯时,通讯电缆长度不得超过15米。
        ●一般RS485协议的接头没有固定的标准,可能根据厂家的不同引脚顺序和管脚功能可能不尽相同,用户可以查阅相关产品RS485的引脚图。
        ●RS485通讯电缆最好选用阻阬匹配、低衰减的RS485专用通讯电缆(双绞线),不要使用普通的双绞电缆或质量较差的通讯电缆。因为普通电缆或质量差的通讯电缆,可能阻抗不匹配、衰减大、绞合度不够、屏蔽层太松散,这样会导致干扰将非常大,会造成通讯不畅,甚至通讯不上。
        ●仪表使用RS485通讯时,每台仪表必须手牵手地串下去,不可以有星型连接或者分叉,如果有星型连接或者分叉,干扰将非常大,会造成通讯不畅,甚至通讯不上。

        

        ●485总线结构理论上传输距离达到1200米,一般是指通讯线材优质达标,波特率9600,只有一台485设备才能使得通讯距离达到1200米,而且能通讯并不代表每次通讯都正常,所以通常485总线实际的稳定通讯距离远远达不到1200米。负载485设备多,线材阻抗不同时,通讯距离更短。
        ●仪表使用RS485通讯时,必要时,请接入终端电阻,以增强系统的抗干扰性,典型的终端电阻阻值是120欧。

    11 串口通讯软件设置要点
    11.1 有关通讯的一些基本概念
        ●主机与从机:在通讯系统中起主要作用、发布主要命令的称为主机,接受命令的称为从机。
        ●连续方式:指主机不需要发布命令,从机就能自动地向主机发送数据。
        ●指令方式:指主机向从机发布命令,从机根据指令执行动作,并将结果“应答”给主机的模式。
        ●输出数据类型:指在连续方式通讯时,从机输出给主机的数据类型。
        ●通讯协议:指主机与从机通讯时,按哪一种编码规则来通讯。
        ●波特率:主从机之间通讯的速度。
        ●数据位:每次传输数据时,数据由几位组成。
        ●校验位:数据传输错误检测,可以是奇校验、偶校验或无校验。
        ●地址:每一台从机的编号。
    11.2 主从机之间通讯设置要点
        ●要点一:主/从RS232/485硬件有无设置正确,通讯线有无接对。有些通讯板卡是RS422与RS485共用的,依靠板上跳线来实现的,有些仪表RS232/485也需要通讯跳线来实现。
        ●要点二:主机上的通讯端口有无设置正确;超时(一般设置为2s)、通讯延时(一般设置为5~20ms)、ACK信号延时(一般设置为0ms)有无设置正确。
        ●要点三:主/从机通讯协议有无选择正确。
        ●要点四:主/从机波特率有无选择正确。
        ●要点五:主/从机数据位有无选择正确。数据位可以选择7位,8位。
        ●要点六:主/从机校验位有无选择正确。校验位一般可选择偶校验、奇校验、无校验。
        ●要点七:主/从机停止位有无选择正确。停止位可以选择1位、1.5位还是2位。
        ●要点八:从机地址有无选择正确。
        ●要点九:主/从机的通讯方式有无选择正确。

     

    进行通讯测试的时候经常会进行线路测试,测试所用的串口线是否可用,方法有二如下:

     

    1  把串口线接到不同的串口,用串口调试工具从一个串口发数据,另一个能正常收到说明串口线是OK的。

    2  把串口线的一端短接(用金属把2,3号脚连通),用万用表测另一端的2,3号如果正常的话会有嘀嘀的短接报警声。

    展开全文
  • 串口通信

    2019-09-30 00:06:29
    串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。与串行通信相对的是并行通信。数据传输一般都是以字节传输的,一个字节8个位。拿一个并行通信举例来说,也就是会有8根线,每一根...

     

    概念

    串口通信(Serial Communications)的概念非常简单,串口按位(bit)发送和接收字节。与串行通信相对的是并行通信。数据传输一般都是以字节传输的,一个字节8个位。拿一个并行通信举例来说,也就是会有8根线,每一根线代表一个位。一次传输就可以传一个字节,而串口通信,就是传数据只有一根线传输,一次只能传一个位,要传一个字节就需要传8次。就像小虎队那首歌一样,把你的心,我的心,串一串,再烤一烤。。串口通信就是把数据串在一根线上传输,所以就叫串口吧。

    通信方式

    一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。它们的区别是:

     

    串行通信分类

    1、按照数据传送方向分为

    单工:数据传输只支持数据在一个方向上传输;

    半双工:允许数据在两个方向上传输。但是,在某一时刻,只允许数据在一个方向上传输,它实际上是一种切换方向的单工通信;它不需要独立的接收端和发送端,两者可以合并一起使用一个端口。

    全双工:允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,需要独立的接收端和发送端。

     

     

     

    2、按照通信方式分为:

     

    同步通信:带时钟同步信号传输。比如:SPI,IIC通信接口。

    异步通信:不带时钟同步信号。比如:UART(通用异步收发器),单总线。

     

     

     

     

    异步通信的两个关键:

    第一,数据单元——帧,它是双方约定好的数据格式;

    第二,波特率,它决定了‘帧’里每一位的时间长度。

     

    异步通信的特点:不要求收发双方时钟的严格一致,实现容易,设备开销较小,但每个字符要附加2~3位用于起止位,各帧之间还有间隔,因此传输效率不高。

     

    在同步通讯中,收发设备上方会使用一根信号线传输信号,在时钟信号的驱动下双方进行协调,同步数据。例如,通讯中通常双方会统一规定在时钟信号的上升沿或者下降沿对数据线进行采样。

     

    在异步通讯中不使用时钟信号进行数据同步,它们直接在数据信号中穿插一些用于同步的信号位,或者将主题数据进行打包,以数据帧的格式传输数据。通讯中还需要双方规约好数据的传输速率(也就是波特率)等,以便更好地同步。常用的波特率有4800bps、9600bps、115200bps等。

     

    在同步通讯中,数据信号所传输的内容绝大部分是有效数据,而异步通讯中会则会包含数据帧的各种标识符,所以同步通讯效率高,但是同步通讯双方的时钟允许误差小,稍稍时钟出错就可能导致数据错乱,异步通讯双方的时钟允许误差较大。

    串口通讯的数据格式

     

     

    一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
    每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。

    偶校验与奇校验

       在标准ASCII码中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

    停止位

     停止位是按长度来算的。串行异步通信从计时开始,以单位时间为间隔(一个单位时间就是波特率的倒数),依次接受所规定的数据位和奇偶校验位,并拼装成一个字符的并行字节;此后应接收到规定长度的停止位“1”。所以说,停止位都是“1”,1.5是它的长度,即停止位的高电平保持1.5个单位时间长度。一般来讲,停止位有1,1.5,2个单位时间三种长度

    常见的串行通信接口

     

     

    原理

    尽管比按字节(byte)的并行通信慢,但是串口可以在使用一根线发送数据的同时用另一根线接收数据。它很简单并且能够实现远距离通信。比如IEEE488定义并行通行状态时,规定设备线总长不得超过20米,并且任意两个设备间的长度不得超过2米;而对于串口而言,长度可达1200米。典型地,串口用于ASCII码字符的传输。通信使用3根线完成,分别是地线、发送、接收。由于串口通信是异步的,端口能够在一根线上发送数据同时在另一根线上接收数据。其他线用于握手,但不是必须的。串口通信最重要的参数是波特率数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

     

     

    参数介绍:

    a,波特率:这是一个衡量符号传输速率的参数。指的是信号被调制以后在单位时间内的变化,即单位时间内载波参数变化的次数,如每秒钟传送240个字符,而每个字符格式包含10位(1个起始位,1个停止位,8个数据位),这时的波特率为240Bd,比特率为10位*240个/秒=2400bps。一般调制速率大于波特率,比如曼彻斯特编码)。通常电话线的波特率为14400,28800和36600。波特率可以远远大于这些值,但是波特率和距离成反比。高波特率常常用于放置的很近的仪器间的通信,典型的例子就是GPIB设备的通信。

     

    b,数据位:这是衡量通信中实际数据位的参数。当计算机发送一个信息包,实际的数据往往不会是8位的,标准的值是6、7和8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。 

     

    c,停止位:用于表示单个包的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,很可能在通信中两台设备间出现了小小的不同步。因此停止位不仅仅是表示传输的结束,并且提供计算机校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。

     

    d,奇偶校验位:在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰了通信或者是否传输和接收数据是否不同步。

     

    串口通信过程

     

     

     

    结构

    串口通信是指外设和计算机间,通过数据信号线 、地线、控制线等,按位进行传输数据的一种通讯方式。这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,但其传输速度比并行传输低。

    串口是计算机上一种非常通用的设备通信协议。大多数计算机(不包括笔记本电脑)包含两个基于RS-232的串口。串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于获取远程采集设备的数据。

    RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。

     

    串口通信协议

    在串口通信中,常用的协议包括RS-232、RS-422和RS-485。

    RS-232(ANSI/EIA-232标准)是IBM-PC及其兼容机上的串行连接标准。可用于许多用途,比如连接鼠标、打印机或者Modem,同时也可以接工业仪器仪表。用于驱动和连线的改进,实际应用中RS-232的传输长度或者速度常常超过标准的值。RS-232只限于PC串口和设备间点对点的通信。RS-232串口通信最远距离是50英尺。

    RS-232

    在我们电脑上,一般都会有一个9针的串行接口,这个串行接口叫做RS232接口,它和UART通信有关联,但是由于现在笔记本电脑不带9针串口,所以和单片机通信越来越趋于使用USB虚拟串口。它以全双工方式工作,需要地线、发送线和接收线三条线。RS232只能实现点对点的通信方式。

     

    九针串口分工头和母头:

    公头上5下4,上5从左到右为1.2.3.4.5;下4从左到右为6.7.8.9;

    母头上5下4,上5从左到右为5.4.3.2.1;下4从左到右为9.8.7.6;

     

    DB-9针连接头(常见的RS232串口)

     

     

    RS-232针脚的功能:

    数据

    TXD(pin 3):串口数据输出(Transmit Data)

    RXD(pin 2):串口数据输入(Receive Data)

    握手:

    RTS(pin 7):发送数据请求(Request to Send)

    CTS(pin 8):清除发送(Clear to Send)

    DSR(pin 6):数据发送就绪(Data Send Ready)

    DCD(pin 1):数据载波检测(Data Carrier Detect)

    DTR(pin 4):数据终端就绪(Data Terminal Ready)

    地线:

    GND(pin 5):地线

    其它

    RI(pin 9):铃声指示

    RS232串口缺点
    1. 接口信号电平值较高,接口电路芯片容易损坏。
    2. 传输速率低,最高波特率19200bps。
    3. 抗干扰能力较差。
    4. 传输距离有限,一般在15m以内。
    5. 只能实现点对点的通讯方式。

    RS-422

    RS-422(EIA RS-422-AStandard)是Apple的Macintosh计算机的串口连接标准。RS-422使用差分信号,RS-232使用非平衡参考地的信号。差分传输使用两根线发送和接收信号,对比RS-232,它能更好的抗噪声和有更远的传输距离。在工业环境中更好的抗噪性和更远的传输距离是一个很大的优点。

    RS-485(半双工)

    RS-485EIA-485标准)是RS-422的改进,因为它增加了设备的个数,从10个增加到32个,同时定义了在最大设备个数情况下的电气特性,以保证足够的信号电压。有了多个设备的能力,你可以使用一个单个RS-485口建立设备网络。出色抗噪和多设备能力,在工业应用中建立连向PC机的分布式设备网络、其他数据收集控制器、HMI或者其他操作时,串行连接会选择RS-485。RS-485是RS-422的超集,因此所有的RS-422设备可以被RS-485控制。RS-485可以用超过4000英尺的线进行串行通行。

    RS485串口特点:
    1. RS485采用平衡发送和差分接收,具有良好的抗干扰能力,信号能传输上千米。
    2. RS485有两线制和四线制两种接线。采用四线制时,只能实现点对多的通讯(即只能有一个主设备,其余为从设备)。四线制现在很少采用,现在多采用两线制接线方式。
    3. 两线制RS485只能以半双式方式工作,收发不能同时进行。
    4. RS485在同一总线上最多可以接32个结点,可实现真正的多点通讯,但一般采用的是主从通信方式,即一个主机带多个从机。
    5. 因RS485接口具有良好的抗干扰能力,长的传输距离和多站能力等优点使其成为首选的串行接口。

     

     

    图6-1 485抑制共模干扰示意图

     

    RS485串口接口定义:

    A或Data+(D+)或+:信号正
    B或Data-(D-)或-:信号负

    计算机与RS485仪表通讯
    计算机自带的串口只有RS232,没有RS485,如果计算机要与RS485串口的仪表进行通讯,必须使用串口转换器或装上RS485串口转换卡后才能进行通讯。

    RS485串口的终端电阻
    1. 一般情况下不需要增加终端电阻,只有在RS485通信距离超过100米的情况下,要在RS485通讯的开始端和结束端增加终端电阻,RS485典型终端电阻是120欧。
    2. 终端电阻是为了消除在通信电缆中的信号反射在通信过程中,有两种信号因导致信号反射:阻抗不连续和阻抗不匹配。
    3. 阻抗不连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射。消除这种反射的方法,就必须在电缆的末端跨接一个与电缆的特性阻抗同样大小的终端电阻,使电缆的阻抗连续。由于信号在电缆上的传输是双向的,因此,在通讯电缆的另一端可跨接一个同样大小的终端电阻。
    4. 引起信号反射的另一原因是数据收发器与传输电缆之间的阻抗不匹配。这种原因引起的反射,主要表现在通讯线路处在空闲方式时,整个网络数据混乱。要减弱反射信号对通讯线路的影响,通常采用噪声抑制和加偏置电阻的方法。在实际应用中,对于比较小的反射信号,为简单方便,经常采用加偏置电阻的方法。

     

    USB转串口通信

     

     

     

    随着技术的发展,工业上还有RS232串口通信的大量使用,但是商业技术的应用上,已经慢慢的使用USB转UART技术取代了RS232串口,绝大多数笔记本电脑已经没有串口这个东西了,那我们要实现单片机和电脑之间的通信该怎么办呢?

    们只需要在电路上添加一个USB转串口芯片,就可以成功实现USB通信协议和标准UART串行通信协议的转换,在我们的开发板上,我们使用的是CH340T这个芯片

    我们需要用跳线帽把中间和下边的针短接在一起。右侧的CH340T这个电路很简单,把电源、晶振接好后,6脚和7脚的DP和DM分别接USB口的2个数据引脚上去,3脚和4脚通过跳线接到了我们单片机的TXD和RXD上去。

    CH340T的电路里3脚位置加了个4148的二极管,是一个小技巧。因为STC89C52这个单片机下载程序时需要冷启动,就是先点下载后上电,上电瞬间单片机会先检测需要不需要下载程序。虽然单片机的VCC是由开关来控制,但是由于CH340T的3脚是输出引脚,如果没有此二极管,开关后级单片机在断电的情况下,CH340T的3脚和单片机的P3.0(即RXD)引脚连在一起,有电流会通过这个引脚流入后级电路并且给后级的电容充电,造成后级有一定幅度的电压,这个电压值虽然只有两三伏左右,但是可能会影响到正常的冷启动。加了二极管后,一方面不影响通信,另外一个方面还可以消除这种不良影响。这个地方可以暂时作为了解,大家如果自己做这类电路,可以参考一下。

    IO口模拟UART串口通信

    UART串口波特率,常用的值是300、600、1200、2400、4800、9600、14400、19200、28800、38400、57600、115200等速率。IO口模拟UART串行通信程序是一个简单的演示程序,我们使用串口调试助手下发一个数据,数据加1后,再自动返回。

    串口调试助手,这里我们直接使用STC-ISP软件自带的串口调试助手,先把串口调试助手的使用给大家说一下,如图11-6所示。第一步要选择串口助手菜单,第二步选择十六进制显示,第三步选择十六进制发送,第四步选择COM口,这个COM口要和自己电脑设备管理器里的那个COM口一致,波特率按我们程序设定好的选择,我们程序中让一个数据位持续时间是1/9600秒,那这个地方选择波特率就是选9600,校验位选N,数据位8,停止位1。

    串口调试助手的实质就是利用电脑上的UART通信接口,发送数据给我们的单片机,也可以把我们的单片机发送的数据接收到这个调试助手界面上。

    因为初次接触通信方面的技术,所以我把后面的IO模拟串口通信程序进行一下解释,大家可以边看我的解释边看程序,把底层原理先彻底弄懂。

    变量定义部分就不用说了,直接看main主函数。首先是对通信的波特率的设定,在这里我们配置的波特率是9600,那么串口调试助手也得是9600。配置波特率的时候,我们用的是定时器T0的模式2。模式2中,不再是TH0代表高8位,TL0代表低8位了,而只有TL0在进行计数,当TL0溢出后,不仅仅会让TF0变1,而且还会将TH0中的内容重新自动装到TL0中。这样有一个好处,就是我们可以把想要的定时器初值提前存在TH0中,当TL0溢出后,TH0自动把初值就重新送入TL0了,全自动的,不需要程序中再给TL0重新赋值了,配置方式很简单,大家可以自己看下程序并且计算一下初值。

    波特率设置好以后,打开中断,然后等待接收串口调试助手下发的数据。接收数据的时候,首先要进行低电平检测while(PIN_RXD),若没有低电平则说明没有数据,一旦检测到低电平,就进入启动接收函数StartRXD()。接收函数最开始启动半个波特率周期,初学可能这里不是很明白。大家回头看一下我们的图11-2里边的串口数据示意图,如果在数据位电平变化的时候去读取,因为时序上的误差以及信号稳定性的问题很容易读错数据,所以我们希望在信号最稳定的时候去读数据。除了信号变化的那个沿的位置外,其它位置都很稳定,那么我们现在就约定在信号中间位置去读取电平状态,这样能够保证我们读的一定是正确的。

    一旦读到了起始信号,我们就把当前状态设定成接收状态,并且打开定时器中断,第一次是半个周期进入中断后,对起始位进行二次判断一下,确认一下起始位是低电平,而不是一个干扰信号。以后每经过1/9600秒进入一次中断,并且把这个引脚的状态读到RxdBuf里边。等待接收完毕之后,我们再把这个RxdBuf加1,再通过TXD引脚发送出去,同样需要先发一位起始位,然后发8个数据位,再发结束位,发送完毕后,程序运行到while(PIN_RXD),等待第二轮信号接收的开始。

    握手

    RS-232通信方式允许简单连接三线:Tx、Rx和地线。但是对于数据传输,双方必须对数据定时采用使用相同的波特率。尽管这种方法对于大多数应用已经足够,但是对于接收方过载的情况这种使用受到限制。这时需要串口的握手功能。在这一部分,我们讨论三种最常用的RS-232握手形式:软件握手、硬件握手和Xmodem。

    a,软件握手:我们讨论的第一种握手是软件握手。通常用在实际数据是控制字符的情况,类似于GPIB使用命令字符串的方式。必须的线仍然是三根:Tx,Rx和地线,因为控制字符在传输线上和普通字符没有区别,函数SetXModem允许用户使用或者禁止用户使用两个控制字符XON和XOFF。这些字符在通信中由接收方发送,使发送方暂停。

    例如:假设发送方以高波特率发送数据。在传输中,接收方发现由于CPU忙于其他工作,输入buffer已经满了。为了暂时停止传输,接收方发送XOFF,典型的值是十进制19,即十六进制13,直到输入buffer空了。一旦接收方准备好接收,它发送XON,典型的值是十进制17,即十六进制11,继续通信。输入buffer半满时,LabWindows发送XOFF。此外,如果XOFF传输被打断,LabWindows会在buffer达到75%和90%时发送XOFF。显然,发送方必须遵循此守则以保证传输继续。

    b,硬件握手:第二种是使用硬件线握手。和Tx和Rx线一样,RTS/CTS和DTR/DSR一起工作,一个作为输出,另一个作为输入。第一组线是RTS(Request to Send)和CTS(Clear toSend)。当接收方准备好接收数据,它置高RTS线表示它准备好了,如果发送方也就绪,它置高CTS,表示它即将发送数据。另一组线是DTR(DataTerminal Ready)和DSR(Data SetReady)。这些线主要用于Modem通信。使得串口和Modem通信他们的状态。例如:当Modem已经准备好接收来自PC的数据,它置高DTR线,表示和电话线的连接已经建立。读取DSR线置高,PC机开始发送数据。一个简单的规则是DTR/DSR用于表示系统通信就绪,而RTS/CTS用于单个数据包的传输。

    在LabWindows,函数SetCTSMode使能或者禁止使用硬件握手。如果CTS模式使能,LabWindows使用如下规则:

    当PC发送数据:

    RS-232库必须检测CTS线高后才能发送数据。

    当PC接收数据:

    如果端口打开,且输入队列有空接收数据,库函数置高RTS和DTR。

    如果输入队列90%满,库函数置低RTS,但使DTR维持高电平。

    如果端口队列近乎空了,库函数置高RTS,但使DTR维持高电平。

    如果端口关闭,库函数置低RTS和DTR。

    c,XModem握手:最后讨论的握手叫做XModem文件传输协议。这个协议在Modem通信中非常通用。尽管它通常使用在Modem通信中,XModem协议能够直接在其他遵循这个协议的设备通信中使用。在LabWindows中,实际的XModem应用对用户隐藏了。只要PC和其他设备使用XModem协议,在文件传输中就使用LabWindows的XModem函数。函数是XModemConfig,XModemSend和XModemReceive。

    XModem使用介于如下参数的协议:start_of_data、end_of_data、neg_ack、wait_delay、start_delay、max_tries、packet_size。这些参数需要通信双方认定,标准的XModem有一个标准的定义:然而,可以通过XModemConfig函数修改,以满足具体需要。这些参数的使用方法由接收方发送的字符neg_ack确定。这通知发送方其准备接收数据。它开始尝试发送,有一个超时参数start_delay;当超时的尝试超过max_ties次数,或者收到接收方发送的start_of_data,发送方停止尝试。如果从发送方收到start_of_data,接收方将读取后继信息数据包。包中含有包的数目、包数目的补码作为错误校验、packet_size字节大小的实际数据包,和进一步错误检查的求和校验值。在读取数据后,接收方会调用wait_delay,然后向发送方发送响应。如果发送方没有收到响应,它会重新发送数据包,直到收到响应或者超过重发次数的最大值max_tries。如果一直没有收到响应,发送方通知用户传输数据失败。

    由于数据必须以pack_size个字节按包发送,当最后一个数据包发送时,如果数据不够放满一个数据包,后面会填充ASCII码NULL(0)字节。这导致接收的数据比原数据多。在XModem情况下一定不要使用XON/XOFF,因为XModem发送方发出包的数目很可能增加到XON/OFF控制字符的值,从而导致通信故障。

     

    波特率概念以及选择

    波特率表示每秒钟传送的码元符号的个数,是衡量数据传送速率的指标,它用单位时间内载波调制状态改变的次数来表示。  

    在信息传输通道中,携带数据信息的信号单元叫码元,每秒钟通过信道传输的码元数称为码元传输速率,简称波特率。波特率是传输通道频宽的指标。 

     

    中文名外文名其它名作用

    波特率 Baud rat 码元速率 度量符号传输速率

     

    波特率(Boud Rate)就是在串口通信中每秒能够发送的位数(bits/second)。MCS-51串行端口在四种工作模式下有不同的波特率计算方法。其中,模式0和模式2波特率计算很简单;模式1和模式3的波特率选择相同,故在此仅以工作模式1为例来说明串口通信波特率的选择。

    在串行端口工作于模式1,其波特率将由计时/计数器1来产生,通常设置定时器工作于模式2(自动再加模式)。在此模式下波特率计算公式为:

    波特率=(1+SMOD)*晶振频率/(384*(256-TH1))

    其中,SMOD——寄存器PCON的第7位,称为波特率倍增位;

    TH1——定时器的重载值。

    在选择波特率的时候需要考虑两点:首先,系统需要的通信速率。这要根据系统的运作特点,确定通信的频率范围。然后考虑通信时钟误差。使用同一晶振频率在选择不同的通信速率时通信时钟误差会有很大差别。为了通信的稳定,我们应该尽量选择时钟误差最小的频率进行通信。

    下面举例说明波特率选择过程:

    假设系统要求的通信频率在20000bit/s以下,晶振频率为12MHz,设置SMOD=1(即波特率倍增)。则

    TH1=256-62500/波特率

    根据波特率取值表,我们知道可以选取的波特率有:1200,2400,4800,9600,19200。列计数器重载值,通信误差如下表:

     

     

     

     

    因此,在通信中,最好选用波特率为1200,2400,4800中的一个。

     

    单片机与matlab的串口通信

    Matlab提供了对串口进行打开、关闭、以及串口参数设置等操作的一系列函数。利用这些函数可以选择串口号、 设置串口通信参数( 波特率、 数据位、停止位、 校验位等)、进行中断控制、流控制。从建立串口通信到结束串口通信的完整流程包括以下几个步骤:

    1、创建串口对象,实现该功能的函数为:

    obj=serial(port,'PropertyName',PropertyValue,....);

    例如:obj= serial(com3,'BaudRate'4800)

    或使用以下默认设置,创建串口对象,在命令串口输入以下代码,第二句是查看其obj默认状态

    obj = serial('com3');

    obj

    其中有两个重要设置项

    BaudRate: 9600 % 波特率默认9600

    Terminator: 'LF' %串口触发字符“换行符”

    2、设置或者修改串口通信参数,实现该功能的函数为:

    set(obj,'PropertyName',PropertyValue,);

    例如:set(obj,'BaudRate'4800);

    这样,我们就发现串口的一些基本设置,可以在创建串口时设置,也可以创建串口之后再进行设置。

    3、打开串口,实现该功能的函数为:

    fopen(obj);

    obj即为前边创建的串口对象。

    其中,步骤2和3顺序是完全可以颠倒的。

    4、从串口读写数据,在前面三个步骤正常完成后, 即可以从串口读数据或者向串口写数据, 也就是接

    收或者发送数据。

    这里我介绍几个常用函数,读函数:fread,fscanf;写函数:fwrite,fprintf.

    A = fread(obj,size); %从串口obj读取size字节长短的二进制数据,以数组形式存于A

    str = fscanf(obj); %从串口obj读取字符或字符串(ASCII码)形式数据,以字符数组形式存于str

    fwrite(obj,A); % 以二进制形式向obj写入数据A

    fprintf( obj,str); %以字符(ASCII码)形式向串口写数据str(字符或字符串)

    5、关闭串口以及释放串口对象占用的存储空间。

    fclose(obj); % 关闭串口

    delete(obj); % 释放串口对象占用的内存空间,

    clear obj; % 释放串口对象在Matlab工作区中占用的存储空间

    下一篇讲解着几个函数在实际的应用及不足。

    实例1:在51单片机下载串口代码后,在matlab上执行如下代码:

    [plain] view plain copysr3 = serial('COM3'); % 使用默认设置创建串口sr3

    fopen(sr3); %打开串口

    fprintf(sr3,'xxx'); % 给串口写入数据

    str = fscanf(sr3) %读取串口数据(无分号,可在Matlab工作区实时查看)

    fclose(sr3); %关闭串口

    delete(sr3);

    clear sr3;

    串口中断设置及中断处理函数

    要实现自动收发数据,还需要定义串口中断处理函数以及触发串口中断的方式。定义触发串口中断的方式其目的是为了在串口检测到接收数据的时候,通知并启动串口数据接收函数进行数据接收操作; 在串口输出缓存为空的时候, 通知启动串口数据发送函数。

    1、触发串口中断的方式。

    Matlab检测到串口通信事件,从而触发串口中断。串口读写的事件包括: Bytes available,Outputempty。其中Bytes available事件有两种: 一种是接收到的字符数达到人工设定的数目时,则系统产生该事件; 另一种是当接收到指定字符时, 系统产生该事件。Output empty事件是在系统检测到输出缓存区为空时, 产生该事件。

    2、中断方式设置

    Bytes available 事件

    set(obj,'BytesAvailableFcnMode','byte');

    set(obj,'BytesAvailableFcnCount', 240); %串口检测到输入缓存中到达了240个字符数据时,触发串口中断。或 :

    set(obj,'BytesAvailableFcnMode','terminator');

    set(obj,'terminator','H'); %当串口检测到字符H时,则触发串口中断

    Output empty事件

    输出缓存为空事件的产生。该事件由系统自动检测产生,不需要用户特别设置。该事件一般在输出缓存中的最后一个字符发送完毕后产生。用户可以定义该事件引起的串口中断处理函数。

    3、串口中断处理函数

    串口中断处理函数是重点中的重点,我查阅过一些文档,串口通信时接收数据一般分两种方式,一种是查询方式,一种是中断处理方式,了解处理器工作的人知道,使用查询方式需不断查询,耗用内存,效率十分低。所以实际通信过程中都使用中断方式,这就需要设置中断触发方式,中断处理函数。

    很多参考文档都是使用matlab自带回调函数,再添加自己的代码,在最开始我也尝试这种方法,但发现实在太麻烦,还是选择自己写,其实很简单,只要注意几个细节问题,就能得到正常运行的函数。

    串口中断处理函数定义:

    obj. BytesAvailableFcn=@ReceiveCallback;

    再自行编写中断处理函数。

    实例2:51单片机端依然使用串口代码,matlab执行如下函数:

     

     

     

     

    串口通讯硬件常见的注意事项

    1. 通讯电缆端子一定接牢,不可有任何松动,否则,可能会烧坏仪表或上位机的通讯板。
    2. 不可带电拔插通讯端子,否则,可能会烧坏仪表或上位机的通讯板,一定要关闭仪表电源后才能去拔插通讯端子或接通讯线。
    3. 通讯用的屏蔽电缆最好选用双层隔离型屏蔽电缆,其次选用单层屏蔽电缆,最好不要选用无屏蔽层的电缆,且电缆屏蔽层一定要能完全屏蔽,有些质量差的电缆,屏蔽层很松散,根本起不到屏蔽的作用。单层屏蔽的电缆屏蔽层应一端接地,双层屏蔽的电缆屏蔽层其外层(含铠装)应两端接地,内层屏蔽则应一端接地。
    4. 仪表使用RS232通讯时,通讯电缆长度不得超过15米。
    5. 一般RS485协议的接头没有固定的标准,可能根据厂家的不同引脚顺序和管脚功能可能不尽相同,用户可以查阅相关产品RS485的引脚图。
    6. RS485通讯电缆最好选用阻阬匹配、低衰减的RS485专用通讯电缆(双绞线),不要使用普通的双绞电缆或质量较差的通讯电缆。因为普通电缆或质量差的通讯电缆,可能阻抗不匹配、衰减大、绞合度不够、屏蔽层太松散,这样会导致干扰将非常大,会造成通讯不畅,甚至通讯不上。
    7. 仪表使用RS485通讯时,每台仪表必须手牵手地串下去,不可以有星型连接或者分叉,如果有星型连接或者分叉,干扰将非常大,会造成通讯不畅,甚至通讯不上。

    8. 485总线结构理论上传输距离达到1200米,一般是指通讯线材优质达标,波特率9600,只有一台485设备才能使得通讯距离达到1200米,而且能通讯并不代表每次通讯都正常,所以通常485总线实际的稳定通讯距离远远达不到1200米。负载485设备多,线材阻抗不同时,通讯距离更短。
    9. 仪表使用RS485通讯时,必要时,请接入终端电阻,以增强系统的抗干扰性,典型的终端电阻阻值是120欧。

     

    有关通讯的一些基本概念

    主机与从机:在通讯系统中起主要作用、发布主要命令的称为主机,接受命令的称为从机。
     1. 连续方式:指主机不需要发布命令,从机就能自动地向主机发送数据。
     2. 指令方式:指主机向从机发布命令,从机根据指令执行动作,并将结果“应 答”给主机的模式。
     3. 输出数据类型:指在连续方式通讯时,从机输出给主机的数据类型。
     4. 通讯协议:指主机与从机通讯时,按哪一种编码规则来通讯。
     5. 波特率:主从机之间通讯的速度。
     6. 数据位:每次传输数据时,数据由几位组成。
     7. 校验位:数据传输错误检测,可以是奇校验、偶校验或无校验。
     8. 地址:每一台从机的编号。

     

    主从机之间通讯设置要点

    要点一:主/从RS232/485硬件有无设置正确,通讯线有无接对。有些通讯板卡是RS4与RS485共用的,依靠板上跳线来实现的,有些仪表RS232/485也需要通讯跳 线来实现。
         要点二:主机上的通讯端口有无设置正确;超时(一般设置为2s)、通讯延时(一般置为5~20ms)、ACK信号延时(一般设置为0ms)有无设置正确。
         要点三:主/从机通讯协议有无选择正确。
         要点四:主/从机波特率有无选择正确。
         要点五:主/从机数据位有无选择正确。数据位可以选择7位,8位。
         要点六:主/从机校验位有无选择正确。校验位一般可选择偶校验、奇校验、无校验。
         要点七:主/从机停止位有无选择正确。停止位可以选择1位、1.5位还是2位。
         要点八:从机地址有无选择正确。
         要点九:主/从机的通讯方式有无选择正确。

     

    USB转串口通信

    随着技术的发展,工业上还有RS232串口通信的大量使用,但是商业技术的应用上,已经慢慢的使用USB转UART技术取代了RS232串口,绝大多数笔记本电脑已经没有串口这个东西了,那我们要实现单片机和电脑之间的通信该如何办呢?

    我们只需要在我们电路上添加一个USB转串口芯片,就可以成功实现USB通信协议和标准UART串行通信协议的转换,在我们的开发板上,我们使用的是CH340G这个芯片,如图11-1所示。

     

     

     

    图11-1 USB转串口电路

    CH340G这个电路很简单,把电源电路,晶振电路接好后,6脚和7脚的UD+和UD-分别接USB口的2个数据引脚上去,3脚和4脚接到了我们单片机的TXD和RXD上去。

    CH340G的电路里2脚位置加了个4148的二极管,是一个小技巧。因为我们的STC89C52RC这个单片机下载程序需要冷启动,就是先点下载后上电,上电瞬间单片机会先检测需要不需要下载程序。虽然单片机的VCC是由开关来控制,但是由于CH340G的2脚是输出引脚,如果没有此二极管,开关后级单片机在断电的情况下,CH340G的2脚和单片机的P3.0(即RXD)引脚连在一起,有电流会通过这个引脚流入后级电路并且给后级的电容充电,造成后级有一定幅度的电压,这个电压值虽然只有两三伏左右,但是可能会影响到我们的冷启动。加了二极管后,一方面不影响通信,另外一个方面还可以消除这种问题。

     

    软件协议

    1. OSI协议和TCP/IP协议

    (1)OSI协议

    OSI七层参考模型不是通讯标准,它只给出一个不会由于技术发展而必须修改的稳定模型,使有关标准和协议能在模型定义的范围内开发和相互配合。

    一般的通讯协议只符合OSI七层模型的某几层,如: EIA-RS-232-C:实现了物理层。 IBM的SDLC(同步数据链路控制规程):数据链路层。ANSI的ADCCP

    (先进数据通讯规程):数据链路层。IBM的BSC(二进制同步通讯协议):数据链路层。应用层的电子邮件协议SMTP只负责寄信、POP3只负责收信。

    (2)TCP/IP协议

    实现了五层协议:

    (1)物理层:对应OSI的物理层。 

    (2)网络接口层:类似于OSI的数据链路层。

    (3)Internet层:OSI模型在Internet网使用前提出,未考虑网间连接。

    (4)传输层:对应OSI的传输层。 

    (5)应用层:对应OSI的表示层和应用层。

     

     

    转载于:https://www.cnblogs.com/cstdio1/p/11175762.html

    展开全文
  • 串口通信的基本知识

    万次阅读 多人点赞 2018-11-12 20:45:38
    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。 串口通讯,RS232,RS485,停止位,奇校验,偶校验 1 串口通讯  串口通讯(Serial Communication),是指外设和计算机间,通过数据...

    串口通信的基本知识

    本文介绍了串口通讯的基本概念、数据格式、通讯方式、典型的串口通讯标准等内容。

    串口通讯,RS232,RS485,停止位,奇校验,偶校验

    1 串口通讯
        串口通讯(Serial Communication),是指外设和计算机间,通过数据信号线、地线等,按位进行传输数据的一种通讯方式。
        串口是一种接口标准,它规定了接口的电气标准,没有规定接口插件电缆以及使用的协议。


    2 串口通讯的数据格式


        一个字符一个字符地传输,每个字符一位一位地传输,并且传输一个字符时,总是以“起始位”开始,以“停止位”结束,字符之间没有固定的时间间隔要求。
        每一个字符的前面都有一位起始位(低电平),字符本身由7位数据位组成,接着字符后面是一位校验位(检验位可以是奇校验、偶校验或无校验位),最后是一位或一位半或二位停止位,停止位后面是不定长的空闲位,停止位和空闲位都规定为高电平。实际传输时每一位的信号宽度与波特率有关,波特率越高,宽度越小,在进行传输之前,双方一定要使用同一个波特率设置。

    3 通讯方式
        单工模式(Simplex Communication)的数据传输是单向的。通信双方中,一方固定为发送端,一方则固定为接收端。信息只能沿一个方向传输,使用一根传输线。
    半双工模式(Half Duplex)通信使用同一根传输线,既可以发送数据又可以接收数据,但不能同时进行发送和接收。数据传输允许数据在两个方向上传输,但是,在任何时刻只能由其中的一方发送数据,另一方接收数据。因此半双工模式既可以使用一条数据线,也可以使用两条数据线。半双工通信中每端需有一个收发切换电子开关,通过切换来决定数据向哪个方向传输。因为有切换,所以会产生时间延迟,信息传输效率低些。
        全双工模式(Full Duplex)通信允许数据同时在两个方向上传输。因此,全双工通信是两个单工通信方式的结合,它要求发送设备和接收设备都有独立的接收和发送能力。在全双工模式中,每一端都有发送器和接收器,有两条传输线,信息传输效率高。
        显然,在其它参数都一样的情况下,全双工比半双工传输速度要快,效率要高。

    4 偶校验与奇校验
        在标准ASCII码中,其最高位(b7)用作奇偶校验位。所谓奇偶校验,是指在代码传送过程中用来检验是否出现错误的一种方法,一般分奇校验和偶校验两种。奇校验规定:正确的代码一个字节中1的个数必须是奇数,若非奇数,则在最高位b7添1;偶校验规定:正确的代码一个字节中1的个数必须是偶数,若非偶数,则在最高位b7添1。

    5 停止位
        停止位是按长度来算的。串行异步通信从计时开始,以单位时间为间隔(一个单位时间就是波特率的倒数),依次接受所规定的数据位和奇偶校验位,并拼装成一个字符的并行字节;此后应接收到规定长度的停止位“1”。所以说,停止位都是“1”,1.5是它的长度,即停止位的高电平保持1.5个单位时间长度。一般来讲,停止位有1,1.5,2个单位时间三种长度。

    6 波特率
        波特率就是每秒钟传输的数据位数。
        波特率的单位是每秒比特数(bps),常用的单位还有:每秒千比特数Kbps,每秒兆比特数Mbps。串口典型的传输波特率600bps,1200bps,2400bps,4800bps,9600bps,19200bps,38400bps。
        PLC/PC与称重仪表通讯时,最常用的波特率是9600bps,19200bps。PLC/PC或仪表与大屏幕通讯时,最常用的波特率是600bps。

    7 典型的串口通讯标准
        EIA RS232(通常简称“RS232”): 1962年由美国电子工业协会(EIA)制定。
        EIA RS485(通常简称“RS485”): 1983年由美国电子工业协会(EIA)制定。

    8 RS232串口
        RS232是计算机与通信工业应用中最广泛一种串行接口。它以全双工方式工作,需要地线、发送线和接收线三条线。RS232只能实现点对点的通信方式。
    8.1 RS232串口缺点
        ●接口信号电平值较高,接口电路芯片容易损坏。
        ●传输速率低,最高波特率19200bps。
        ●抗干扰能力较差。
        ●传输距离有限,一般在15m以内。
        ●只能实现点对点的通讯方式。
    8.2 RS232串口接口定义
        RXD:接收数据,TXD:发送数据,GND/SG:信号地。
    8.3 电脑DB9针接口定义
        电脑DB9针接口是常见的RS232串口,其引脚定义如下:
        2号脚:RXD(接收数据)
        3号脚:TXD(发送数据)
        5号脚:SG或GND(信号地)
        其它脚:我们不用

        

        电脑RS232串口与仪表串口连接图:
     
        

    9 RS485串口
    9.1 RS485串口特点
        ●RS485采用平衡发送和差分接收,具有良好的抗干扰能力,信号能传输上千米。
        ●RS485有两线制和四线制两种接线。采用四线制时,只能实现点对多的通讯(即只能有一个主设备,其余为从设备)。四线制现在很少采用,现在多采用两线制接线方式。
        ●两线制RS485只能以半双式方式工作,收发不能同时进行。
        ●RS485在同一总线上最多可以接32个结点,可实现真正的多点通讯,但一般采用的是主从通信方式,即一个主机带多个从机。
        ●因RS485接口具有良好的抗干扰能力,长的传输距离和多站能力等优点使其成为首选的串行接口。
    9.2 485抑制共模干扰示意图
        
    9.3 RS485串口接口定义
        A或Data+(D+)或+:信号正;
        B或Data-(D-)或-:信号负。
    9.4 计算机与RS485仪表通讯
        计算机自带的串口只有RS232,没有RS485,如果计算机要与RS485串口的仪表进行通讯,必须使用串口转换器或装上RS485串口转换卡后才能进行通讯。
    9.5 RS485串口的终端电阻
        ●一般情况下不需要增加终端电阻,只有在RS485通信距离超过100米的情况下,要在RS485通讯的开始端和结束端增加终端电阻,RS485典型终端电阻是120欧。
        ●终端电阻是为了消除在通信电缆中的信号反射在通信过程中,有两种信号因导致信号反射:阻抗不连续和阻抗不匹配。
        阻抗不连续,信号在传输线末端突然遇到电缆阻抗很小甚至没有,信号在这个地方就会引起反射。消除这种反射的方法,就必须在电缆的末端跨接一个与电缆的特性阻抗同样大小的终端电阻,使电缆的阻抗连续。由于信号在电缆上的传输是双向的,因此,在通讯电缆的另一端可跨接一个同样大小的终端电阻。
        引起信号反射的另一原因是数据收发器与传输电缆之间的阻抗不匹配。这种原因引起的反射,主要表现在通讯线路处在空闲方式时,整个网络数据混乱。要减弱反射信号对通讯线路的影响,通常采用噪声抑制和加偏置电阻的方法。在实际应用中,对于比较小的反射信号,为简单方便,经常采用加偏置电阻的方法。

    10 串口通讯硬件常见的注意事项
        ●通讯电缆端子一定接牢,不可有任何松动,否则,可能会烧坏仪表或上位机的通讯板。
        ●不可带电拔插通讯端子,否则,可能会烧坏仪表或上位机的通讯板,一定要关闭仪表电源后才能去拔插通讯端子或接通讯线。
        ●通讯用的屏蔽电缆最好选用双层隔离型屏蔽电缆,其次选用单层屏蔽电缆,最好不要选用无屏蔽层的电缆,且电缆屏蔽层一定要能完全屏蔽,有些质量差的电缆,屏蔽层很松散,根本起不到屏蔽的作用。单层屏蔽的电缆屏蔽层应一端接地,双层屏蔽的电缆屏蔽层其外层(含铠装)应两端接地,内层屏蔽则应一端接地。
        ●仪表使用RS232通讯时,通讯电缆长度不得超过15米。
        ●一般RS485协议的接头没有固定的标准,可能根据厂家的不同引脚顺序和管脚功能可能不尽相同,用户可以查阅相关产品RS485的引脚图。
        ●RS485通讯电缆最好选用阻阬匹配、低衰减的RS485专用通讯电缆(双绞线),不要使用普通的双绞电缆或质量较差的通讯电缆。因为普通电缆或质量差的通讯电缆,可能阻抗不匹配、衰减大、绞合度不够、屏蔽层太松散,这样会导致干扰将非常大,会造成通讯不畅,甚至通讯不上。
        ●仪表使用RS485通讯时,每台仪表必须手牵手地串下去,不可以有星型连接或者分叉,如果有星型连接或者分叉,干扰将非常大,会造成通讯不畅,甚至通讯不上。

        

        ●485总线结构理论上传输距离达到1200米,一般是指通讯线材优质达标,波特率9600,只有一台485设备才能使得通讯距离达到1200米,而且能通讯并不代表每次通讯都正常,所以通常485总线实际的稳定通讯距离远远达不到1200米。负载485设备多,线材阻抗不同时,通讯距离更短。
        ●仪表使用RS485通讯时,必要时,请接入终端电阻,以增强系统的抗干扰性,典型的终端电阻阻值是120欧。

    11 串口通讯软件设置要点
    11.1 有关通讯的一些基本概念
        ●主机与从机:在通讯系统中起主要作用、发布主要命令的称为主机,接受命令的称为从机。
        ●连续方式:指主机不需要发布命令,从机就能自动地向主机发送数据。
        ●指令方式:指主机向从机发布命令,从机根据指令执行动作,并将结果“应答”给主机的模式。
        ●输出数据类型:指在连续方式通讯时,从机输出给主机的数据类型。
        ●通讯协议:指主机与从机通讯时,按哪一种编码规则来通讯。
        ●波特率:主从机之间通讯的速度。
        ●数据位:每次传输数据时,数据由几位组成。
        ●校验位:数据传输错误检测,可以是奇校验、偶校验或无校验。
        ●地址:每一台从机的编号。
    11.2 主从机之间通讯设置要点
        ●要点一:主/从RS232/485硬件有无设置正确,通讯线有无接对。有些通讯板卡是RS422与RS485共用的,依靠板上跳线来实现的,有些仪表RS232/485也需要通讯跳线来实现。
        ●要点二:主机上的通讯端口有无设置正确;超时(一般设置为2s)、通讯延时(一般设置为5~20ms)、ACK信号延时(一般设置为0ms)有无设置正确。
        ●要点三:主/从机通讯协议有无选择正确。
        ●要点四:主/从机波特率有无选择正确。
        ●要点五:主/从机数据位有无选择正确。数据位可以选择7位,8位。
        ●要点六:主/从机校验位有无选择正确。校验位一般可选择偶校验、奇校验、无校验。
        ●要点七:主/从机停止位有无选择正确。停止位可以选择1位、1.5位还是2位。
        ●要点八:从机地址有无选择正确。
        ●要点九:主/从机的通讯方式有无选择正确。

     

    进行通讯测试的时候经常会进行线路测试,测试所用的串口线是否可用,方法有二如下:

     

    1  把串口线接到不同的串口,用串口调试工具从一个串口发数据,另一个能正常收到说明串口线是OK的。

    2  把串口线的一端短接(用金属把2,3号脚连通),用万用表测另一端的2,3号如果正常的话会有嘀嘀的短接报警声。

     

    展开全文
  • 串口通讯协议

    万次阅读 多人点赞 2018-03-02 10:02:47
    文章转载自http://www.cnblogs.com/firege/p/5805753.html20.1 串口通讯协议简介串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师...

    文章转载自http://www.cnblogs.com/firege/p/5805753.html


    20.1 串口通讯协议简介

    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。

    在计算机科学里,大部分复杂的问题都可以通过分层来简化。如芯片被分为内核层和片上外设;STM32标准库则是在寄存器与用户代码之间的软件层。对于通讯协议,我们也以分层的方式来理解,最基本的是把它分为物理层和协议层。物理层规定通讯系统中具有机械、电子功能部分的特性,确保原始数据在物理媒体的传输。协议层主要规定通讯逻辑,统一收发双方的数据打包、解包标准。简单来说物理层规定我们用嘴巴还是用肢体来交流,协议层则规定我们用中文还是英文来交流。

    下面我们分别对串口通讯协议的物理层及协议层进行讲解。

    20.1.1 物理层

    串口通讯的物理层有很多标准及变种,我们主要讲解RS-232标准RS-232标准主要规定了信号的用途、通讯接口以及信号的电平标准。

    使用RS-232标准的串口设备间常见的通讯结构见图 201

     201 串口通讯结构图

    在上面的通讯方式中,两个通讯设备的"DB9接口"之间通过串口信号线建立起连接,串口信号线中使用"RS-232标准"传输数据信号。由于RS-232电平标准的信号不能直接被控制器直接识别,所以这些信号会经过一个"电平转换芯片"转换成控制器能识别的"TTL校准"的电平信号,才能实现通讯。

    1.    电平标准    

    根据通讯使用的电平标准不同,串口通讯可分为TTL标准及RS-232标准,见表 201

     201 TTL电平标准与RS232电平标准

    通讯标准

    电平标准(发送端)

    5V TTL

    逻辑12.4V-5V

    逻辑00~0.5V

    RS-232

    逻辑1-15V~-3V

    逻辑0+3V~+15V

    我们知道常见的电子电路中常使用TTL的电平标准,理想状态下,使用5V表示二进制逻辑1,使用0V表示逻辑0;而为了增加串口通讯的远距离传输及抗干扰能力,它使用-15V表示逻辑1+15V表示逻辑0。使用RS232TTL电平校准表示同一个信号时的对比见图 202

     202 RS-232TTL电平标准下表示同一个信号

    因为控制器一般使用TTL电平标准,所以常常会使用MA3232芯片对TTL及RS-232电平的信号进行互相转换。

    2.    RS-232信号线

    在最初的应用中,RS-232串口标准常用于计算机、路由与调制调解器(MODEN,俗称"猫")之间的通讯 ,在这种通讯系统中,设备被分为数据终端设备DTE(计算机、路由)和数据通讯设备DCE(调制调解器)。我们以这种通讯模型讲解它们的信号线连接方式及各个信号线的作用。

    在旧式的台式计算机中一般会有RS-232标准的COM口(也称DB9接口),见图 203。

     203 电脑主板上的COM口及串口线

    其中接线口以针式引出信号线的称为公头,以孔式引出信号线的称为母头。在计算机中一般引出公头接口,而在调制调解器设备中引出的一般为母头,使用上图中的串口线即可把它与计算机连接起来。通讯时,串口线中传输的信号就是使用前面讲解的RS-232标准调制的。

    在这种应用场合下,DB9接口中的公头及母头的各个引脚的标准信号线接法见图 204及表 202。

     204 DB9标准的公头及母头接法

     202 DB9信号线说明(公头,为方便理解,可把DTE理解为计算机,DCE理解为调制调解器)

    序号

    名称

    符号

    数据方向

    说明

    1

    载波检测

    DCD

    DTEàDCE

    Data Carrier Detect,数据载波检测,用于DTE告知对方,本机是否收到对方的载波信号

    2

    接收数据

    RXD

    DTEßDCE

    Receive Data,数据接收信号,即输入

    3

    发送数据

    TXD

    DTEàDCE

    Transmit Data,数据发送信号,即输出。两个设备之间的TXDRXD应交叉相连

    4

    数据终端(DTE) 就绪

    DTR

    DTEàDCE

    Data Terminal Ready,数据终端就绪,用于DTE向对方告知本机是否已准备好

    5

    信号地

    GND

    -

    地线,两个通讯设备之间的地电位可能不一样,这会影响收发双方的电平信号,所以两个串口设备之间必须要使用地线连接,即共地。

    6

    数据设备(DCE)就绪

    DSR

    DTEßDCE

    Data Set Ready,数据发送就绪,用于DCE告知对方本机是否处于待命状态

    7

    请求发送

    RTS

    DTEàDCE

    Request To Send,请求发送, DTE 请求 DCE 本设备向DCE端发送数据

    8

    允许发送

    CTS

    DTEßDCE

    Clear To Send,允许发送,DCE回应对方的RTS发送请求,告知对方是否可以发送数据

    9

    响铃指示

    RI

    DTEßDCE

    Ring Indicator,响铃指示,表示DCE端与线路已接通

    上表中的是计算机端的DB9公头标准接法,由于两个通讯设备之间的收发信号(RXDTXD)应交叉相连,所以调制调解器端的DB9母头的收发信号接法一般与公头的相反,两个设备之间连接时,只要使用"直通型"的串口线连接起来即可,见图 205

     205 计算机与调制调解器的信号线连接

    串口线中的RTSCTSDSRDTRDCD信号,使用逻辑 1表示信号有效,逻辑0表示信号无效。例如,当计算机端控制DTR信号线表示为逻辑1时,它是为了告知远端的调制调解器,本机已准备好接收数据,0则表示还没准备就绪。

    在目前的其它工业控制使用的串口通讯中,一般只使用RXDTXD以及GND三条信号线,直接传输数据信号。而RTSCTSDSRDTRDCD信号都被裁剪掉了,如果您在前面被这些信号弄得晕头转向,那就直接忽略它们吧。

    20.1.2 协议层

    串口通讯的数据包由发送设备通过自身的TXD接口传输到接收设备的RXD接口。在串口通讯的协议层中,规定了数据包的内容,它由启始位、主体数据、校验位以及停止位组成,通讯双方的数据包格式要约定一致才能正常收发数据,其组成见图 206。

     206 串口数据包的基本组成

    1.    波特率

    本章中主要讲解的是串口异步通讯,异步通讯中由于没有时钟信号(如前面讲解的DB9接口中是没有时钟信号的),所以两个通讯设备之间需要约定好波特率,即每个码元的长度,以便对信号进行解码,图 206中用虚线分开的每一格就是代表一个码元。常见的波特率为4800、9600、115200等。

    2.    通讯的起始和停止信号

    串口通讯的一个数据包从起始信号开始,直到停止信号结束。数据包的起始信号由一个逻辑0的数据位表示,而数据包的停止信号可由0.5、1、1.5或2个逻辑1的数据位表示,只要双方约定一致即可。

    3.    有效数据

    在数据包的起始位之后紧接着的就是要传输的主体数据内容,也称为有效数据,有效数据的长度常被约定为5、6、7或8位长。

    4.    数据校验

    在有效数据之后,有一个可选的数据校验位。由于数据通信相对更容易受到外部干扰导致传输数据出现偏差,可以在传输过程加上校验位来解决这个问题。校验方法有奇校验(odd)、偶校验(even)、0校验(space)、1校验(mark)以及无校验(noparity),它们介绍如下:

        奇校验要求有效数据和校验位中"1"的个数为奇数,比如一个8位长的有效数据为:01101001,此时总共有4个"1",为达到奇校验效果,校验位为"1",最后传输的数据将是8位的有效数据加上1位的校验位总共9位。

        偶校验与奇校验要求刚好相反,要求帧数据和校验位中"1"的个数为偶数,比如数据帧:11001010,此时数据帧"1"的个数为4个,所以偶校验位为"0"。

        0校验是不管有效数据中的内容是什么,校验位总为"0",1校验是校验位总为"1"。

        在无校验的情况下,数据包中不包含校验位。

    20.2 STM32的USART简介

    STM32芯片具有多个USART外设用于串口通讯,它是 Universal Synchronous Asynchronous Receiver and Transmitter的缩写,即通用同步异步收发器可以灵活地与外部设备进行全双工数据交换。有别于USART,它还有具有UART外设(Universal Asynchronous Receiver and Transmitter),它是在USART基础上裁剪掉了同步通信功能,只有异步通信。简单区分同步和异步就是看通信时需不需要对外提供时钟输出,我们平时用的串口通信基本都是UART

    USART满足外部设备对工业标准NRZ异步串行数据格式的要求,并且使用了小数波特率发生器,可以提供多种波特率,使得它的应用更加广泛。USART支持同步单向通信和半双工单线通信;还支持局域互连网络LIN、智能卡(SmartCard)协议与lrDA(红外线数据协会) SIR ENDEC规范。

    USART支持使用DMA,可实现高速数据通信,有关DMA具体应用将在DMA章节作具体讲解。

    USARTSTM32应用最多莫过于"打印"程序信息,一般在硬件设计时都会预留一个USART通信接口连接电脑,用于在调试程序是可以把一些调试信息"打印"在电脑端的串口调试助手工具上,从而了解程序运行是否正确、指出运行出错位置等等。

    STM32USART输出的是TTL电平信号,若需要RS-232标准的信号可使用MAX3232芯片进行转换。

    20.3 USART功能框图

    STM32USART功能框图包含了USART最核心内容,掌握了功能框图,对USART就有一个整体的把握,在编程时就思路就非常清晰,见图 207

     207 USART功能框图

    1.    ①功能引脚

    TX:发送数据输出引脚。

    RX:接收数据输入引脚。

    SW_RX:数据接收引脚,只用于单线和智能卡模式,属于内部引脚,没有具体外部引脚。

    nRTS:请求以发送(Request To Send)n表示低电平有效。如果使能RTS流控制,当USART接收器准备好接收新数据时就会将nRTS变成低电平;当接收寄存器已满时,nRTS将被设置为高电平。该引脚只适用于硬件流控制。

    nCTS:清除以发送(Clear To Send)n表示低电平有效。如果使能CTS流控制,发送器在发送下一帧数据之前会检测nCTS引脚,如果为低电平,表示可以发送数据,如果为高电平则在发送完当前数据帧之后停止发送。该引脚只适用于硬件流控制。

    SCLK:发送器时钟输出引脚。这个引脚仅适用于同步模式。

    USART引脚在STM32F429IGT6芯片具体发布见表 203

     203 STM32F429IGT6芯片的USART引脚

      

    APB2(最高90MHz)

    APB1(最高45MHz)

    USART1

    USART6

    USART2

    USART3

    UART4

    UART5

    UART7

    UART8

    TX

    PA9/PB6

    PC6/PG14

    PA2/PD5

    PB10/PD8
    /PC10

    PA0/PC10

    PC12

    PF7/PE8

    PE1

    RX

    PA10/PB7

    PC7/PG9

    PA3/PD6

    PB11/PD9
    /PC11

    PA1/PC11

    PD2

    PF6/PE7

    PE0

    SCLK

    PA8

    PG7/PC8

    PA4/PD7

    PB12/PD10
    /PC12

      

      

      

      

    nCTS

    PA11

    PG13/PG15

    PA0/PD3

    PB13/PD11

      

      

      

      

    nRTS

    PA12

    PG8/PG12

    PA1/PD4

    PB14/PD12

      

      

      

      

    STM32F42xxx系统控制器有四个USART和四个UART,其中USART1USART6的时钟来源于APB2总线时钟,其最大频率为90MHz,其他六个的时钟来源于APB1总线时钟,其最大频率为45MHz

    UART只是异步传输功能,所以没有SCLKnCTSnRTS功能引脚。

    观察表 203可发现很多USART的功能引脚有多个引脚可选,这非常方便硬件设计,只要在程序编程时软件绑定引脚即可。

    2.    ②数据寄存器

    USART数据寄存器(USART_DR)只有低9位有效,并且第9位数据是否有效要取决于USART控制寄存器1(USART_CR1)M位设置,当M位为0时表示8位数据字长,当M位为1表示9位数据字长,我们一般使用8位数据字长。

    USART_DR包含了已发送的数据或者接收到的数据。USART_DR实际是包含了两个寄存器,一个专门用于发送的可写TDR,一个专门用于接收的可读RDR。当进行发送操作时,往USART_DR写入数据会自动存储在TDR内;当进行读取操作时,向USART_DR读取数据会自动提取RDR数据。

    TDRRDR都是介于系统总线和移位寄存器之间。串行通信是一个位一个位传输的,发送时把TDR内容转移到发送移位寄存器,然后把移位寄存器数据每一位发送出去,接收时把接收到的每一位顺序保存在接收移位寄存器内然后才转移到RDR

    USART支持DMA传输,可以实现高速数据传输,具体DMA使用将在DMA章节讲解。

    3.    ③控制器

    USART有专门控制发送的发送器、控制接收的接收器,还有唤醒单元、中断控制等等。使用USART之前需要向USART_CR1寄存器的UE位置1使能USART。发送或者接收数据字长可选8位或9位,由USART_CR1M位控制。

    发送器

    USART_CR1寄存器的发送使能位TE1时,启动数据发送,发送移位寄存器的数据会在TX引脚输出,如果是同步模式SCLK也输出时钟信号。

    一个字符帧发送需要三个部分:起始位+数据帧+停止位。起始位是一个位周期的低电平,位周期就是每一位占用的时间;数据帧就是我们要发送的8位或9位数据,数据是从最低位开始传输的;停止位是一定时间周期的高电平。

    停止位时间长短是可以通过USART控制寄存器2(USART_CR2)STOP[1:0]位控制,可选0.5个、1个、1.5个和2个停止位。默认使用1个停止位。2个停止位适用于正常USART模式、单线模式和调制解调器模式。0.5个和1.5个停止位用于智能卡模式。

    当选择8位字长,使用1个停止位时,具体发送字符时序图见图 208

     208 字符发送时序图

    当发送使能位TE1之后,发送器开始会先发送一个空闲帧(一个数据帧长度的高电平),接下来就可以往USART_DR寄存器写入要发送的数据。在写入最后一个数据后,需要等待USART状态寄存器(USART_SR)TC位为1,表示数据传输完成,如果USART_CR1寄存器的TCIE位置1,将产生中断。

    在发送数据时,编程的时候有几个比较重要的标志位我们来总结下。

    名称

    描述

    TE

    发送使能

    TXE

    发送寄存器为空,发送单个字节的时候使用

    TC

    发送完成,发送多个字节数据的时候使用

    TXIE

    发送完成中断使能

     

    接收器

    如果将USART_CR1寄存器的RE位置1,使能USART接收,使得接收器在RX线开始搜索起始位。在确定到起始位后就根据RX线电平状态把数据存放在接收移位寄存器内。接收完成后就把接收移位寄存器数据移到RDR内,并把USART_SR寄存器的RXNE位置1,同时如果USART_CR2寄存器的RXNEIE1的话可以产生中断。

    在接收数据时,编程的时候有几个比较重要的标志位我们来总结下。

    名称

    描述

    RE

    接收使能

    RXNE

    读数据寄存器非空

    RXNEIE

    发送完成中断使能

     

    为得到一个信号真实情况,需要用一个比这个信号频率高的采样信号去检测,称为过采样,这个采样信号的频率大小决定最后得到源信号准确度,一般频率越高得到的准确度越高,但为了得到越高频率采样信号越也困难,运算和功耗等等也会增加,所以一般选择合适就好。

    接收器可配置为不同过采样技术,以实现从噪声中提取有效的数据。USART_CR1寄存器的OVER8位用来选择不同的采样采样方法,如果OVER8位设置为1采用8倍过采样,即用8个采样信号采样一位数据;如果OVER8位设置为0采用16倍过采样,即用16个采样信号采样一位数据。

    USART的起始位检测需要用到特定序列。如果在RX线识别到该特定序列就认为是检测到了起始位。起始位检测对使用16倍或8倍过采样的序列都是一样的。该特定序列为:1110X0X0X0000,其中X表示电平任意,10皆可。

    8倍过采样速度更快,最高速度可达fPCLK/8fPCLKUSART时钟,采样过程见图 209。使用第456次脉冲的值决定该位的电平状态。

     209 8倍过采样过程

    16倍过采样速度虽然没有8倍过采样那么快,但得到的数据更加精准,其最大速度为fPCLK/16,采样过程见图 2010。使用第8910次脉冲的值决定该位的电平状态。

     2010 16倍过采样过程

    4.    ④小数波特率生成

    波特率指数据信号对载波的调制速率,它用单位时间内载波调制状态改变次数来表示,单位为波特。比特率指单位时间内传输的比特数,单位bit/s(bps)。对于USART波特率与比特率相等,以后不区分这两个概念。波特率越大,传输速率越快。

    USART的发送器和接收器使用相同的波特率。计算公式如下:

    公式 201 波特率计算

    其中,fPLCKUSART时钟,参考表 203OVER8USART_CR1寄存器的OVER8位对应的值,USARTDIV是一个存放在波特率寄存器(USART_BRR)的一个无符号定点数。其中DIV_Mantissa[11:0]位定义USARTDIV的整数部分,DIV_Fraction[3:0]位定义USARTDIV的小数部分,DIV_Fraction[3]位只有在OVER8位为0时有效,否则必须清零。

    例如,如果OVER8=0DIV_Mantissa=24DIV_Fraction=10,此时USART_BRR值为0x18A;那么USARTDIV的小数位10/16=0.625;整数位24,最终USARTDIV的值为24.625

    如果OVER8=0并且知道USARTDIV值为27.68,那么DIV_Fraction=16*0.68=10.88,最接近的正整数为11,所以DIV_Fraction[3:0]0xBDIV_Mantissa=整数(27.68)=27,即位0x1B

    如果OVER8=1情况类似,只是把计算用到的权值由16改为8

    波特率的常用值有2400960019200115200。下面以实例讲解如何设定寄存器值得到波特率的值。

    由表 203可知USART1USART6使用APB2总线时钟,最高可达90MHz,其他USART的最高频率为45MHz。我们选取USART1作为实例讲解,即fPLCK=90MHz

    当我们使用16倍过采样时即OVER8=0,为得到115200bps的波特率,此时:

     

    解得USARTDIV=48.825125,可算得DIV_Fraction=0xDDIV_Mantissa=0x30,即应该设置USART_BRR的值为0x30D

    在计算DIV_Fraction时经常出现小数情况,经过我们取舍得到整数,这样会导致最终输出的波特率较目标值略有偏差。下面我们从USART_BRR的值为0x30D开始计算得出实际输出的波特率大小。

    USART_BRR的值为0x30D,可得DIV_Fraction=13DIV_Mantissa=48,所以USARTDIV=48+16*0.13=48.8125,所以实际波特率为:115237;这个值跟我们的目标波特率误差为0.03%,这么小的误差在正常通信的允许范围内。

    8倍过采样时计算情况原理是一样的。

    5.    校验控制

    STM32F4xx系列控制器USART支持奇偶校验。当使用校验位时,串口传输的长度将是8位的数据帧加上1位的校验位总共9位,此时USART_CR1寄存器的M位需要设置为1,即9数据位。将USART_CR1寄存器的PCE位置1就可以启动奇偶校验控制,奇偶校验由硬件自动完成。启动了奇偶校验控制之后,在发送数据帧时会自动添加校验位,接收数据时自动验证校验位。接收数据时如果出现奇偶校验位验证失败,会见USART_SR寄存器的PE位置1,并可以产生奇偶校验中断。

    使能了奇偶校验控制后,每个字符帧的格式将变成:起始位+数据帧+校验位+停止位。

    6.    中断控制

    USART有多个中断请求事件,具体见表 204

     204 USART中断请求

    中断事件

    事件标志

    使能控制位

    发送数据寄存器为空

    TXE

    TXEIE

    CTS标志

    CTS

    CTSIE

    发送完成

    TC

    TCIE

    准备好读取接收到的数据

    RXNE

    RXNEIE

    检测到上溢错误

    ORE

    检测到空闲线路

    IDLE

    IDLEIE

    奇偶校验错误

    PE

    PEIE

    断路标志

    LBD

    LBDIE

    多缓冲通信中的噪声标志、
    上溢错误和帧错误

    NF/ORE/FE

    EIE

    20.4 USART初始化结构体详解

    标准库函数对每个外设都建立了一个初始化结构体,比如USART_InitTypeDef,结构体成员用于设置外设工作参数,并由外设初始化配置函数,比如USART_Init()调用,这些设定参数将会设置外设相应的寄存器,达到配置外设工作环境的目的。

    初始化结构体和初始化库函数配合使用是标准库精髓所在,理解了初始化结构体每个成员意义基本上就可以对该外设运用自如了。初始化结构体定义在stm32f4xx_usart.h文件中,初始化库函数定义在stm32f4xx_usart.c文件中,编程时我们可以结合这两个文件内注释使用。

    USART初始化结构体

    1 typedef struct {

    uint32_t USART_BaudRate; // 波特率

    uint16_t USART_WordLength; // 字长

    uint16_t USART_StopBits; // 停止位

    uint16_t USART_Parity; // 校验位

    uint16_t USART_Mode; // USART模式

    uint16_t USART_HardwareFlowControl; // 硬件流控制

    } USART_InitTypeDef;

    1)    USART_BaudRate:波特率设置。一般设置为2400、9600、19200、115200。标准库函数会根据设定值计算得到USARTDIV值,见公式 201,并设置USART_BRR寄存器值。

    2)    USART_WordLength:数据帧字长,可选8位或9位。它设定USART_CR1寄存器的M位的值。如果没有使能奇偶校验控制,一般使用8数据位;如果使能了奇偶校验则一般设置为9数据位。

    3)    USART_StopBits:停止位设置,可选0.5个、1个、1.5个和2个停止位,它设定USART_CR2寄存器的STOP[1:0]位的值,一般我们选择1个停止位。

    4)    USART_Parity:奇偶校验控制选择,可选USART_Parity_No(无校验)、USART_Parity_Even(偶校验)以及USART_Parity_Odd(奇校验),它设定USART_CR1寄存器的PCE位和PS位的值。

    5)    USART_Mode:USART模式选择,有USART_Mode_Rx和USART_Mode_Tx,允许使用逻辑或运算选择两个,它设定USART_CR1寄存器的RE位和TE位。

    6)    USART_HardwareFlowControl:硬件流控制选择,只有在硬件流控制模式才有效,可选有⑴使能RTS、⑵使能CTS、⑶同时使能RTS和CTS、⑷不使能硬件流。

    当使用同步模式时需要配置SCLK引脚输出脉冲的属性,标准库使用一个时钟初始化结构体USART_ClockInitTypeDef来设置,因此该结构体内容也只有在同步模式才需要设置。

    USART时钟初始化结构体

    1 typedef struct {

    uint16_t USART_Clock; // 时钟使能控制

    uint16_t USART_CPOL; // 时钟极性

    uint16_t USART_CPHA; // 时钟相位

    uint16_t USART_LastBit; // 最尾位时钟脉冲

    } USART_ClockInitTypeDef;

    1)    USART_Clock:同步模式下SCLK引脚上时钟输出使能控制,可选禁止时钟输出(USART_Clock_Disable)或开启时钟输出(USART_Clock_Enable);如果使用同步模式发送,一般都需要开启时钟。它设定USART_CR2寄存器的CLKEN位的值。

    2)    USART_CPOL:同步模式下SCLK引脚上输出时钟极性设置,可设置在空闲时SCLK引脚为低电平(USART_CPOL_Low)或高电平(USART_CPOL_High)。它设定USART_CR2寄存器的CPOL位的值。

    3)    USART_CPHA:同步模式下SCLK引脚上输出时钟相位设置,可设置在时钟第一个变化沿捕获数据(USART_CPHA_1Edge)或在时钟第二个变化沿捕获数据。它设定USART_CR2寄存器的CPHA位的值。USART_CPHA与USART_CPOL配合使用可以获得多种模式时钟关系。

    4)    USART_LastBit:选择在发送最后一个数据位的时候时钟脉冲是否在SCLK引脚输出,可以是不输出脉冲(USART_LastBit_Disable)、输出脉冲(USART_LastBit_Enable)。它设定USART_CR2寄存器的LBCL位的值。

    20.5 USART1接发通信实验

    USART只需两根信号线即可完成双向通信,对硬件要求低,使得很多模块都预留USART接口来实现与其他模块或者控制器进行数据传输,比如GSM模块,WIFI模块、蓝牙模块等等。在硬件设计时,注意还需要一根"共地线"。

    我们经常使用USART来实现控制器与电脑之间的数据传输。这使得我们调试程序非常方便,比如我们可以把一些变量的值、函数的返回值、寄存器标志位等等通过USART发送到串口调试助手,这样我们可以非常清楚程序的运行状态,当我们正式发布程序时再把这些调试信息去除即可。

    我们不仅仅可以将数据发送到串口调试助手,我们还可以在串口调试助手发送数据给控制器,控制器程序根据接收到的数据进行下一步工作。

    首先,我们来编写一个程序实现开发板与电脑通信,在开发板上电时通过USART发送一串字符串给电脑,然后开发板进入中断接收等待状态,如果电脑有发送数据过来,开发板就会产生中断,我们在中断服务函数接收数据,并马上把数据返回发送给电脑。

    20.5.1 硬件设计

    为利用USART实现开发板与电脑通信,需要用到一个USBUSARTIC,我们选择CH340G芯片来实现这个功能,CH340G是一个USB总线的转接芯片,实现USBUSARTUSBIrDA红外或者USB转打印机接口,我们使用其USBUSART功能。具体电路设计见图 2011

    我们将CH340GTXD引脚与USART1RX引脚连接,CH340GRXD引脚与USART1TX引脚连接。CH340G芯片集成在开发板上,其地线(GND)已与控制器的GND连通。

     2011 USB转串口硬件设计

    20.5.2 软件设计

    这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。我们创建了两个文件:bsp_debug_usart.cbsp_debug_usart.h文件用来存放USART驱动程序及相关宏定义。

    1.    编程要点

    1)    使能RX和TX引脚GPIO时钟和USART时钟;

    2)    初始化GPIO,并将GPIO复用到USART上;

    3)    配置USART参数;

    4)    配置中断控制器并使能USART接收中断;

    5)    使能USART;

    6)    在USART接收中断服务函数实现数据接收和发送。

    2.    代码分析
    GPIO和USART宏定义

    代码清单 201 GPIOUSART宏定义

    #define DEBUG_USART USART1

    #define DEBUG_USART_CLK RCC_APB2Periph_USART1

    #define DEBUG_USART_BAUDRATE 115200 //串口波特率

    4

    #define DEBUG_USART_RX_GPIO_PORT GPIOA

    #define DEBUG_USART_RX_GPIO_CLK RCC_AHB1Periph_GPIOA

    #define DEBUG_USART_RX_PIN GPIO_Pin_10

    #define DEBUG_USART_RX_AF GPIO_AF_USART1

    #define DEBUG_USART_RX_SOURCE GPIO_PinSource10

    10

    11 #define DEBUG_USART_TX_GPIO_PORT GPIOA

    12 #define DEBUG_USART_TX_GPIO_CLK RCC_AHB1Periph_GPIOA

    13 #define DEBUG_USART_TX_PIN GPIO_Pin_9

    14 #define DEBUG_USART_TX_AF GPIO_AF_USART1

    15 #define DEBUG_USART_TX_SOURCE GPIO_PinSource9

    16

    17 #define DEBUG_USART_IRQHandler USART1_IRQHandler

    18 #define DEBUG_USART_IRQ USART1_IRQn

    使用宏定义方便程序移植和升级,根据图 2011电路,我们选择使用USART1,设定波特率为115200,一般我们会默认使用"8-N-1"参数,即8个数据位、不用校验、一位停止位。查阅表 203可知USART1TX线可对于PA9PB6引脚,RX线可对于PA10PB7引脚,这里我们选择PA9以及PA10引脚。最后定义中断相关参数。

    嵌套向量中断控制器NVIC配置

    代码清单 202 中断控制器NVIC配置

    static void NVIC_Configuration(void)

    {

    NVIC_InitTypeDef NVIC_InitStructure;

    4

    /* 嵌套向量中断控制器组选择 */

    NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);

    7

    /* 配置USART为中断源 */

    NVIC_InitStructure.NVIC_IRQChannel = DEBUG_USART_IRQ;

    10 /* 抢断优先级为1 */

    11 NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority = 1;

    12 /* 子优先级为1 */

    13 NVIC_InitStructure.NVIC_IRQChannelSubPriority = 1;

    14 /* 使能中断 */

    15 NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;

    16 /* 初始化配置NVIC */

    17 NVIC_Init(&NVIC_InitStructure);

    18 }

    19

    在中断章节已对嵌套向量中断控制器的工作机制做了详细的讲解,这里我们就直接使用它,配置USART作为中断源,因为本实验没有使用其他中断,对优先级什么具体要求。

    USART初始化配置

    代码清单 203 USART初始化配置

    void Debug_USART_Config(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    /* 使能 USART GPIO 时钟 */

    RCC_AHB1PeriphClockCmd(DEBUG_USART_RX_GPIO_CLK |

    DEBUG_USART_TX_GPIO_CLK,

    ENABLE);

    9

    10 /* 使能 USART 时钟 */

    11 RCC_APB2PeriphClockCmd(DEBUG_USART_CLK, ENABLE);

    12

    13 /* GPIO初始化 */

    14 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    15 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    16 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    17

    18 /* 配置Tx引脚为复用功能 */

    19 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    20 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_TX_PIN ;

    21 GPIO_Init(DEBUG_USART_TX_GPIO_PORT, &GPIO_InitStructure);

    22

    23 /* 配置Rx引脚为复用功能 */

    24 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    25 GPIO_InitStructure.GPIO_Pin = DEBUG_USART_RX_PIN;

    26 GPIO_Init(DEBUG_USART_RX_GPIO_PORT, &GPIO_InitStructure);

    27

    28 /* 连接 PXx  USARTx_Tx*/

    29 GPIO_PinAFConfig(DEBUG_USART_RX_GPIO_PORT,

    30 DEBUG_USART_RX_SOURCE,

    31 DEBUG_USART_RX_AF);

    32

    33 /* 连接 PXx  USARTx__Rx*/

    34 GPIO_PinAFConfig(DEBUG_USART_TX_GPIO_PORT,

    35 DEBUG_USART_TX_SOURCE,

    36 DEBUG_USART_TX_AF);

    37

    38 /* 配置串DEBUG_USART 模式 */

    39 /* 波特率设置:DEBUG_USART_BAUDRATE */

    40 USART_InitStructure.USART_BaudRate = DEBUG_USART_BAUDRATE;

    41 /* 字长(数据位+校验位)8 */

    42 USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    43 /* 停止位:1个停止位 */

    44 USART_InitStructure.USART_StopBits = USART_StopBits_1;

    45 /* 校验位选择:不使用校验 */

    46 USART_InitStructure.USART_Parity = USART_Parity_No;

    47 /* 硬件流控制:不使用硬件流 */

    48 USART_InitStructure.USART_HardwareFlowControl =

    49 USART_HardwareFlowControl_None;

    50 /* USART模式控制:同时使能接收和发送 */

    51 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    52 /* 完成USART初始化配置 */

    53 USART_Init(DEBUG_USART, &USART_InitStructure);

    54

    55 /* 嵌套向量中断控制器NVIC配置 */

    56 NVIC_Configuration();

    57

    58 /* 使能串口接收中断 */

    59 USART_ITConfig(DEBUG_USART, USART_IT_RXNE, ENABLE);

    60

    61 /* 使能串口 */

    62 USART_Cmd(DEBUG_USART, ENABLE);

    63 }

    64

    使用GPIO_InitTypeDefUSART_InitTypeDef结构体定义一个GPIO初始化变量以及一个USART初始化变量,这两个结构体内容我们之前已经有详细讲解。

    调用RCC_AHB1PeriphClockCmd函数开启GPIO端口时钟,使用GPIO之前必须开启对应端口的时钟。使用RCC_APB2PeriphClockCmd函数开启USART时钟。

    使用GPIO之前都需要初始化配置它,并且还要添加特殊设置,因为我们使用它作为外设的引脚,一般都有特殊功能。我们在初始化时需要把它的模式设置为复用功能。

    每个GPIO都可以作为多个外设的特殊功能引脚,比如PA10这个引脚不仅仅可以作为普通的输入\输出引脚,还可以作为USART1RX线引脚(USART1_RX)、定时器1通道3引脚(TIM1_CH3)、全速OTGID引脚(OTG_FS_ID)以及DCMI的数据1引脚(DCMI_D1)这四个外设的功能引脚,我们只能从中选择一个使用,这时就通过GPIO引脚复用功能配置(GPIO_PinAFConfig)函数实现复用功能引脚的连接。

    这时我们可能会想如果程序把PA10用于TIM1_CH3,此时USART1_RX就没办法使用了,那岂不是不能使用USART1了,实际上情况没有这么糟糕的,查阅表 203我们可以看到USART1_RX不仅仅只有PA10,还可以是PB7。所以此时我们可以PB7这个引脚来实现USART1通信。那要是PB7也是被其他外设占用了呢?那就没办法了,只能使用其他USART

    GPIO_PinAFConfig函数接收三个参数,第一个参数为GPIO端口,比如GPIOA;第二个参数是指定要复用的引脚号,比如GPIO_PinSource10;第三个参数是选择复用外设,比如GPIO_AF_USART1。该函数最终操作的是GPIO复用功能寄存器GPIO_AFRHGPIO_AFRL,分高低两个。

    接下来,我们配置USART1通信参数并调用USART初始化函数完成配置。

    程序用到USART接收中断,需要配置NVIC,这里调用NVIC_Configuration函数完成配置。配置NVIC就可以调用USART_ITConfig函数使能USART接收中断。

    最后调用USART_Cmd函数使能USART

    字符发送

    代码清单 204 字符发送函数

    /***************** 发送一个字符 **********************/

    void Usart_SendByte( USART_TypeDef * pUSARTx, uint8_t ch)

    {

    /* 发送一个字节数据到USART */

    USART_SendData(pUSARTx,ch);

    6

    /* 等待发送数据寄存器为空 */

    while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

    }

    10

    11 /***************** 发送字符串 **********************/

    12 void Usart_SendString( USART_TypeDef * pUSARTx, char *str)

    13 {

    14 unsigned int k=0;

    15 do {

    16 Usart_SendByte( pUSARTx, *(str + k) );

    17 k++;

    18 while (*(str + k)!='\0');

    19

    20 /* 等待发送完成 */

    21 while (USART_GetFlagStatus(pUSARTx,USART_FLAG_TC)==RESET) {

    22 }

    23 }

    Usart_SendByte函数用来在指定USART发送一个ASCLL码值字符,它有两个形参,第一个为USART,第二个为待发送的字符。它是通过调用库函数USART_SendData来实现的,并且增加了等待发送完成功能。通过使用USART_GetFlagStatus函数来获取USART事件标志来实现发送完成功能等待,它接收两个参数,一个是USART,一个是事件标志。这里我们循环检测发送数据寄存器为空这个标志,当跳出while循环时说明发送数据寄存器为空这个事实。

    Usart_SendString函数用来发送一个字符串,它实际是调用Usart_SendByte函数发送每个字符,直到遇到空字符才停止发送。最后使用循环检测发送完成的事件标志来实现保证数据发送完成后才退出函数。

    USART中断服务函数

    代码清单 205 USART中断服务函数

    void DEBUG_USART_IRQHandler(void)

    {

    uint8_t ucTemp;

    if (USART_GetITStatus(DEBUG_USART,USART_IT_RXNE)!=RESET) {

    ucTemp = USART_ReceiveData( DEBUG_USART );

    USART_SendData(DEBUG_USART,ucTemp);

    }

    8

    }

    这段代码是存放在stm32f4xx_it.c文件中的,该文件用来集中存放外设中断服务函数。当我们使能了中断并且中断发生时就会执行中断服务函数。

    我们在代码清单 203使能了USART接收中断,当USART有接收到数据就会执行DEBUG_USART_IRQHandler函数。USART_GetITStatus函数与USART_GetFlagStatus函数类似用来获取标志位状态,但USART_GetITStatus函数是专门用来获取中断事件标志的,并返回该标志位状态。使用if语句来判断是否是真的产生USART数据接收这个中断事件,如果是真的就使用USART数据读取函数USART_ReceiveData读取数据到指定存储区。然后再调用USART数据发送函数USART_SendData把数据又发送给源设备。

    主函数

    代码清单 206 主函数

    int main(void)

    {

    /*初始化USART 配置模式为 115200 8-N-1,中断接收*/

    Debug_USART_Config();

    5

    Usart_SendString( DEBUG_USART,"这是一个串口中断接收回显实验\n");

    7

    while (1) {

    9

    10 }

    11 }

    首先我们需要调用Debug_USART_Config函数完成USART初始化配置,包括GPIO配置,USART配置,接收中断使用等等信息。

    接下来就可以调用字符发送函数把数据发送给串口调试助手了。

    最后主函数什么都不做,只是静静地等待USART接收中断的产生,并在中断服务函数把数据回传。

    20.5.3 下载验证

    保证开发板相关硬件连接正确,用USB线连接开发板"USB TO UART"接口跟电脑,在电脑端打开串口调试助手,把编译好的程序下载到开发板,此时串口调试助手即可收到开发板发过来的数据。我们在串口调试助手发送区域输入任意字符,点击发送按钮,马上在串口调试助手接收区即可看到相同的字符。

     2012 实验现象

    20.6 USART1指令控制RGB彩灯实验

    在学习C语言时我们经常使用C语言标准函数库输入输出函数,比如printfscanfgetchar等等。为让开发板也支持这些函数需要把USART发送和接收函数添加到这些函数的内部函数内。

    正如之前所讲,可以在串口调试助手输入指令,让开发板根据这些指令执行一些任务,现在我们编写让程序接收USART数据,根据数据内容控制RGB彩灯的颜色。

    20.6.1 硬件设计

    硬件设计同第一个实验。

    20.6.2 软件设计

    这里只讲解核心的部分代码,有些变量的设置,头文件的包含等并没有涉及到,完整的代码请参考本章配套的工程。我们创建了两个文件:bsp _usart.cbsp _usart.h文件用来存放USART驱动程序及相关宏定义。

    1.    编程要点

    1)    初始化配置RGB彩色灯GPIO;

    2)    使能RX和TX引脚GPIO时钟和USART时钟;

    3)    初始化GPIO,并将GPIO复用到USART上;

    4)    配置USART参数;

    5)    使能USART;

    6)    获取指令输入,根据指令控制RGB彩色灯。

    2.    代码分析
    GPIO和USART宏定义

    代码清单 207 GPIOUSART宏定义

    
    						1 //引脚定义
    			

    /*******************************************************/

    #define USARTx USART1

    4

    /* 不同的串口挂载的总线不一样,时钟使能函数也不一样,移植时要注意

    串口16 RCC_APB2PeriphClockCmd

    串口2/3/4/5/7 RCC_APB1PeriphClockCmd

    */

    #define USARTx_CLK RCC_APB2Periph_USART1

    10 #define USARTx_CLOCKCMD RCC_APB2PeriphClockCmd

    11 #define USARTx_BAUDRATE 115200 //串口波特率

    12

    13 #define USARTx_RX_GPIO_PORT GPIOA

    14 #define USARTx_RX_GPIO_CLK RCC_AHB1Periph_GPIOA

    15 #define USARTx_RX_PIN GPIO_Pin_10

    16 #define USARTx_RX_AF GPIO_AF_USART1

    17 #define USARTx_RX_SOURCE GPIO_PinSource10

    18

    19 #define USARTx_TX_GPIO_PORT GPIOA

    20 #define USARTx_TX_GPIO_CLK RCC_AHB1Periph_GPIOA

    21 #define USARTx_TX_PIN GPIO_Pin_9

    22 #define USARTx_TX_AF GPIO_AF_USART1

    23 #define USARTx_TX_SOURCE GPIO_PinSource9

    24

    25 /************************************************************/

    使用宏定义方便程序移植和升级,这里我们可以USART1,设定波特率为115200

    USART初始化配置

    代码清单 208 USART初始化配置

    void USARTx_Config(void)

    {

    GPIO_InitTypeDef GPIO_InitStructure;

    USART_InitTypeDef USART_InitStructure;

    5

    RCC_AHB1PeriphClockCmd(USARTx_RX_GPIO_CLK|USARTx_TX_GPIO_CLK,ENABLE);

    7

    /* 使能 USART 时钟 */

    USARTx_CLOCKCMD(USARTx_CLK, ENABLE);

    10

    11 /* GPIO初始化 */

    12 GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;

    13 GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;

    14 GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;

    15

    16 /* 配置Tx引脚为复用功能 */

    17 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    18 GPIO_InitStructure.GPIO_Pin = USARTx_TX_PIN ;

    19 GPIO_Init(USARTx_TX_GPIO_PORT, &GPIO_InitStructure);

    20

    21 /* 配置Rx引脚为复用功能 */

    22 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    23 GPIO_InitStructure.GPIO_Pin = USARTx_RX_PIN;

    24 GPIO_Init(USARTx_RX_GPIO_PORT, &GPIO_InitStructure);

    25

    26 /* 连接 PXx  USARTx_Tx*/

    27 GPIO_PinAFConfig(USARTx_RX_GPIO_PORT,USARTx_RX_SOURCE,USARTx_RX_AF);

    28

    29 /* 连接 PXx  USARTx__Rx*/

    30 GPIO_PinAFConfig(USARTx_TX_GPIO_PORT,USARTx_TX_SOURCE,USARTx_TX_AF);

    31

    32 /* 配置串DEBUG_USART 模式 */

    33 /* 波特率设置:DEBUG_USART_BAUDRATE */

    34 USART_InitStructure.USART_BaudRate = USARTx_BAUDRATE;

    35 /* 字长(数据位+校验位)8 */

    36 USART_InitStructure.USART_WordLength = USART_WordLength_8b;

    37 /* 停止位:1个停止位 */

    38 USART_InitStructure.USART_StopBits = USART_StopBits_1;

    39 /* 校验位选择:偶校验 */

    40 USART_InitStructure.USART_Parity = USART_Parity_No;

    41 /* 硬件流控制:不使用硬件流 */

    42 USART_InitStructure.USART_HardwareFlowControl =

    43 USART_HardwareFlowControl_None;

    44 /* USART模式控制:同时使能接收和发送 */

    45 USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;

    46 /* 完成USART初始化配置 */

    47 USART_Init(USARTx, &USART_InitStructure);

    48

    49 /* 使能串口 */

    50 USART_Cmd(USARTx, ENABLE);

    51 }

    使用GPIO_InitTypeDefUSART_InitTypeDef结构体定义一个GPIO初始化变量以及一个USART初始化变量,这两个结构体内容我们之前已经有详细讲解。

    调用RCC_AHB1PeriphClockCmd函数开启GPIO端口时钟,使用GPIO之前必须开启对应端口的时钟。

    初始化配置RX线和TX线引脚为复用功能,并将指定的GPIO连接至USART1,然后配置串口的工作参数为115200-8-N-1。最后调用USART_Cmd函数使能USART

    重定向prinft和scanf函数

    代码清单 209 重定向输入输出函数

    ///重定向c库函数printf到串口,重定向后可使用printf函数

    int fputc(int ch, FILE *f)

    {

    /* 发送一个字节数据到串口 */

    USART_SendData(USARTx, (uint8_t) ch);

    6

    /* 等待发送完毕 */

    while (USART_GetFlagStatus(USARTx, USART_FLAG_TXE) == RESET);

    9

    10 return (ch);

    11 }

    12

    13 ///重定向c库函数scanf到串口,重写向后可使用scanfgetchar等函数

    14 int fgetc(FILE *f)

    15 {

    16 /* 等待串口输入数据 */

    17 while (USART_GetFlagStatus(USARTx, USART_FLAG_RXNE) == RESET);

    18

    19 return (int)USART_ReceiveData(USARTx);

    20 }

    C语言标准库中,fputc函数是printf函数内部的一个函数,功能是将字符ch写入到文件指针f所指向文件的当前写指针位置,简单理解就是把字符写入到特定文件中。我们使用USART函数重新修改fputc函数内容,达到类似"写入"的功能。

    fgetc函数与fputc函数非常相似,实现字符读取功能。在使用scanf函数时需要注意字符输入格式。

    还有一点需要注意的,使用fputfgetc函数达到重定向C语言标准库输入输出函数必须在MDK的工程选项把"Use MicroLIB"勾选上,MicoroLIB是缺省C库的备选库,它对标准C库进行了高度优化使代码更少,占用更少资源。

    为使用printfscanf函数需要在文件中包含stdio.h头文件。

    输出提示信息

    代码清单 2010 输出提示信息

    static void Show_Message(void)

    {

    printf("\r\n这是一个通过串口通信指令控制RGB彩灯实验 \n");

    printf("使用 USART1 参数为:%d 8-N-1 \n",USARTx_BAUDRATE);

    printf("开发板接到指令后控制RGB彩灯颜色,指令对应如下:\n");

    printf(指令 ------ 彩灯颜色 \n");

    printf(" 1 ------  \n");

    printf(" 2 ------ 绿 \n");

    printf(" 3 ------  \n");

    10 printf(" 4 ------  \n");

    11 printf(" 5 ------  \n");

    12 printf(" 6 ------  \n");

    13 printf(" 7 ------  \n");

    14 printf(" 8 ------  \n");

    15 }

    Show_Message函数全部是调用printf函数,"打印"实验操作信息到串口调试助手。

    主函数

    代码清单 2011 主函数

    int main(void)

    {

    char ch;

    4

    /* 初始化RGB彩灯 */

    LED_GPIO_Config();

    7

    /* 初始化USART 配置模式为 115200 8-N-1 */

    USARTx_Config();

    10

    11 /* 打印指令输入提示信息 */

    12 Show_Message();

    13 while (1)

    14 {

    15 /* 获取字符指令 */

    16 ch=getchar();

    17 printf("接收到字符:%c\n",ch);

    18

    19 /* 根据字符指令控制RGB彩灯颜色 */

    20 switch (ch)

    21 {

    22 case '1':

    23 LED_RED;

    24 break;

    25 case '2':

    26 LED_GREEN;

    27 break;

    28 case '3':

    29 LED_BLUE;

    30 break;

    31 case '4':

    32 LED_YELLOW;

    33 break;

    34 case '5':

    35 LED_PURPLE;

    36 break;

    37 case '6':

    38 LED_CYAN;

    39 break;

    40 case '7':

    41 LED_WHITE;

    42 break;

    43 case '8':

    44 LED_RGBOFF;

    45 break;

    46 default:

    47 /* 如果不是指定指令字符,打印提示信息 */

    48 Show_Message();

    49 break;

    50 }

    51 }

    52 }

    首先我们定义一个字符变量来存放接收到的字符。

    接下来调用LED_GPIO_Config函数完成RGB彩色GPIO初始化配置,该函数定义在bsp_led.c文件内。

    调用USARTx_Config函完成USART初始化配置。

    Show_Message函数使用printf函数打印实验指令说明信息。

    getchar函数用于等待获取一个字符,并返回字符。我们使用ch变量保持返回的字符,接下来判断ch内容执行对应的程序了。

    我们使用switch语句判断ch变量内容,并执行对应的功能程序。

    20.6.3 下载验证

    保证开发板相关硬件连接正确,用USB线连接开发板"USB TO UART"接口跟电脑,在电脑端打开串口调试助手,把编译好的程序下载到开发板,此时串口调试助手即可收到开发板发过来的数据。我们在串口调试助手发送区域输入一个特定字符,点击发送按钮,RGB彩色灯状态随之改变。

    20.7 每课一问

    1、串口1实验中发送的数据都是8位的,如果要发送的数据是16位的话,怎么办,程序应该怎么修改?

    答案如下

    /***************** 发送一个16位数 **********************/

    void Usart_SendHalfWord( USART_TypeDef * pUSARTx, uint16_t ch)

    {

    uint8_t temp_h, temp_l;

    5

    /* 取出高八位 */

    temp_h = (ch&0XFF00)>>8;

    /* 取出低八位 */

    temp_l = ch&0XFF;

    10

    11 /* 发送高八位 */

    12 USART_SendData(pUSARTx,temp_h);

    13 while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

    14

    15 /* 发送低八位 */

    16 USART_SendData(pUSARTx,temp_l);

    17 while (USART_GetFlagStatus(pUSARTx, USART_FLAG_TXE) == RESET);

    18 }

    2、改写USART1指令控制RGB彩灯实验程序,把串口1换成串口2。

    开源共享,共同进步。
    展开全文
  • 【STM32】串口通信基本原理(超基础、详细版)

    万次阅读 多人点赞 2019-05-19 14:30:22
    STM32F1xx官方资料: 《STM32中文参考手册V10》-第25章通用同步异步收发器(USART) 通信接口背景知识 设备之间通信的方式 一般情况下,设备之间的通信方式可以分成并行通信和串行通信两种。...
  • 串口通讯—通信协议

    万次阅读 2015-10-15 09:09:47
    所谓通信协议是指通信双方的一种约定。约定包括对数据格式、同步方式、传送速度、传送步骤、检纠错方式以及控制字符定义等问题做出统一规定,通信双方必须共同遵守。因此,也叫做通信控制规程,或称传输控制规程,它...
  • 串口通讯介绍

    千次阅读 2017-08-07 18:39:22
    串口通讯的物理连接和传输协议,是学习单片机串口编程的基础。 本文参照《深入浅出玩转51单片机》和《零死角玩转STM》书籍,对通讯以及串口一些基本概念做了详解。1. 串口通讯的基本概念1.1 基本方式基本方式分并行...
  • 串口通信协议简介

    万次阅读 2020-01-07 13:20:03
    串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,大部分电子设备都支持该通讯方式,电子工程师在调试设备时也经常使用该通讯方式输出调试信息。 在计算机科学里,大部分...
  • 串口通信原理和简介

    万次阅读 多人点赞 2017-06-28 09:43:29
    串口通信定义  串口是计算机上一种非常通用设备通信的协议。大多数计算机包含两个基于RS232的串口串口同时也是仪器仪表设备通用的通信协议;很多GPIB兼容的设备也带有RS-232口。同时,串口通信协议也可以用于...
  • C# 串口通讯

    万次阅读 热门讨论 2020-09-24 09:55:20
    本人做的一个C#串口上位机程序,最近有空就写了点感悟,见笑大方了。 一,软件概述 本上位机采用VisualC#2010编写,用于与单片机通信,发送并接收固定格式的数据包。 上位机每次点击“发送”按钮后将发送18字节...
  • 51单片机串口通讯详解

    千次阅读 2019-11-04 22:26:31
    串口,作为单片机程序开发中最常用、最方便,也是应用最广泛的程序调试方法;无论是作为调试工具,打印出调试信息,还是对功能模块进行通信,串口是每个单片机开发人员最常用的单片机外设。 由于大部分51单片机不...
  • Java使用开源Rxtx实现串口通讯 串口开发

    千次下载 热门讨论 2020-07-30 23:30:32
    Java使用开源Rxtx实现串口通讯 串口开发,里面包含实例,下载后按自己的要求进行修改即可(仅限对java有基础的人员)。
  • STM32—串口通讯详解

    万次阅读 多人点赞 2019-07-30 22:26:34
    串口通讯目录物理层协议层USART简介代码讲解 串口通讯(Serial Communication)是一种设备间非常常用的串行通讯方式,因为它简单便捷,因此大部分电子设备都支持该通讯方式,其通讯协议可分层为协议层和物理层。物理层...
  • C#串口通讯实例

    万次阅读 2016-12-19 20:33:21
    C#串口通讯实例 参考《C#网络通信程序设计》 serialport
  • C# 串口通讯Demo(VS2010)

    千次下载 热门讨论 2020-07-30 16:56:32
    一个简单的C# 串口通讯Demo,可收发数据。
  • VB中串口通讯的实现

    千次阅读 2012-03-13 16:46:33
     串口通讯作为一种古老而又灵活的通讯方式,被广泛地应用于PC间的通讯以及PC和单片机之间的通讯之中。 提到串口通讯的编程,人们往往立刻想到C、汇编等对系统底层操作支持较好的编程语言以及大串繁琐的代码。  ...
  • web串口通讯

    千次阅读 2013-10-29 22:06:13
    最近项目需要读取串口...刚开始用java ,java提供的javacomm20-win32工具读取串口数据,不晓得怎么回事,我的电脑往串口发送数据后死活接收不到数据,后来在网上搜了下,有一款开源的java读取串口的框架RXTX,地址:...
  • c#实现串口通讯

    千次阅读 2018-03-15 12:56:00
    1、c#实现简单的串口通信2、实现需要的空间如下图,lable、button、textbox、serial、timer,如下图3、初始化串口初始化的内容包括指定串口的波特率、接受数据的函数、端口号等(1)波特率选择如下图,直接点击按钮...
  • c#编写串口通讯代码 多线程实现.rar

    热门讨论 2020-07-29 14:19:00
    c#编写串口通讯代码 多线程实现.rarc#编写串口通讯代码 多线程实现.rarc#编写串口通讯代码 多线程实现.rar
  • Arduino基础入门篇23—串口通讯

    万次阅读 多人点赞 2019-11-04 15:05:08
    在很多时候,Arduino需要和其他设备相互通讯,而最常见最简单的方式就是串口通讯。本篇介绍Arduino硬件串口通讯,了解相关函数的使用。
1 2 3 4 5 ... 20
收藏数 39,705
精华内容 15,882
关键字:

串口通讯