精华内容
下载资源
问答
  • UART串口通信

    2014-09-17 12:39:57
    工程实用项目,里面含有工程文件和测试文件,已经用于实际项目。
  • UART串口通讯总结

    万次阅读 多人点赞 2019-04-09 17:35:25
    UART全称为Universal Asynchronous Receiver/Transmitter,即通用异步收发器,是串行通信一种通信技术,常用于单片机和电脑之间以及单片机和单片机之间的板级通信。 串口有三根线,分别如下: (1)TXD:发送; ...

    1. 串口的基本概念

    UART全称为Universal Asynchronous Receiver/Transmitter,即通用异步收发器,是串行通信一种通信技术,常用于单片机和电脑之间以及单片机和单片机之间的板级通信。

     串口有三根线,分别如下:

    (1)TXD:发送;

    (2)RXD:接收;

    (3)GND:接地

    串口通信是异步通讯,端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

    2.串口配置基本属性

    (1)波特率

    波特率是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如9600波特表示每秒钟发送9600个bit。在时钟周期中,若波特率为4800,则表示时钟是4800Hz,同时表示串口通信在数据线上的采样率为4800Hz。串口通常用的波特率为1200、2400、4800、9600、14400、19200、28800、38400、57600、115200、128000、256000。其中如果串口速率越高,其传输的距离和稳定性就有所下降。一般常用为9600和115200。

    (2)数据位

    数据位表征通信中实际数据位的参数。当计算机发送一个信息包,其中需指定有效数据位,一般有5、7和8位。常规使用一般定义为8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。   

    (3)停止位

    停止位表征单包数据的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,在传输中可能存在不同步的情况,因此停止位不仅仅是表示传输的结束,同时也是校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。   

    (4)奇偶校验位

    在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。

    例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位,保证逻辑高为奇数个。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰,通信的传输和接收数据是否不同步。

    3.串口(Serial port)和RS-232

    在PC机和单片机的串口通讯中,需要接一块电平转换芯片,用于将TTL/CMOS(单片机电平)转换为RS232(PC机电平)。

    TTL/CMOS电平范围:0~1.8/2.5/3.3/5V(不同单片机范围不同),高电压表示1,低电压表示0。

    RS232逻辑电平范围:-12V~12V,-5~-12表示高电平,+5~+12V表示低电平。

    RS-232定义了各种形态的串口接口,常见的有DE-9、DB-25。

    因此理论上,PC机与单片机中的通讯转换原理应为:

     PC(串口)<---------->电平转换电路<---------->单片机(串口)

    现在常用的是通过USB转串口实现:

    PC(USB接口)<---------->USB转串口<---------->单片机(串口)

    4. 串口通讯流控制

    在串行通讯处理中,常有RTS/CTS和XON/XOFF选项,表示流控制选项,目前流控制主要应用于调制解调器的数据通讯中,
    (1)流控制在串行通讯中的作用
    这流的“流”,指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。现在我们在网络上通过MODEM进行数据传输,这个问题就尤为突出。流控制能解决这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。 PC机中常用的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止)。 


    (2)硬件流控制
    硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
    硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停来自计算机的数据流。

    这种硬件握手方式的过程为:在编程时,根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将CTS线置低电平(送逻辑0),当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS置高电平。RTS则用来标明接收设备有没有准备好接收数据。
    常用的流控制还有还有DTR/DSR(数据终端就绪/数据设置就绪)。我们在此不再详述。由于流控制的多样性,我个人认为,当软件里用了流控制时,应做详细的说明,如何接线,如何应用。 
    (3)软件流控制
    由于电缆线的限制,在普通的控制通讯中一般不用硬件流控制,而用软件流控制。一般通过XON/XOFF来实现软件流控制。

    常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出XOFF字符(十进制的19或Control-S,设备编程说明书应该有详细阐述),发送端收到XOFF字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON字符(十进制的17或Control-Q),发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的是什么字符。
    应该注意,若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。

     

     

     

    展开全文
  • 简介 今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做...UART包括RS232、RS449、RS423等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS232等式对应各种异步串行通信口的接口标准和总线

    简介

    今天购买了AXLINX AX7020的开发板,从今天开始每一个例程都要做文档记录,为自己加油。
    本实验,基于ALINX AX7020开发板,芯片为xc7z020clg400-2。开发板输入时钟为50MHz。

    1.UART协议介绍

    UART是一种通用串行数据总线,用于异步通信。UART能实现双向通信,在嵌入式设计中,常用于主机与辅助设备通信。UART包括RS232、RS449、RS423等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS232等式对应各种异步串行通信口的接口标准和总线标准,它们规定了通信口的电气特性、传输速率、连接特性和接口的机械特性等内容。实际上是属于通信网络中的物理层(最底层)的概念,与通信协议并没有关系。

    UART传输中,相关名词解释如下:
    (1)波特率:每秒钟发送的符号数
    (2)起始位:先发出一个逻辑0的信号,表示传输数据的开始
    (3)数据位:衡量通信中实际数据位的参数。标准的数据位可以是5、7、8位,从最低位开始传输
    (4)奇偶校验位:UART发送时,检查发送数据中1的个数,自动在奇偶校验位上添上1或0,用于发送数据的校验
    数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验),以此来校验数据传送的正确性。就比如传输“A”(01000001)为例:
    当为奇数校验:“A”字符的8个bit位中有两个1,那么奇偶校验位为1才能满足1的个数为奇数(奇校验);
    当为偶数校验:“A”字符的8个bit位中有两个1,那么奇偶校验位为0才能满足1的个数为偶数(偶校验);

    (5)停止位:数据结束的标志,可以是1位、1.5位、2位的高电平
    (6)空闲位:处于逻辑1的状态,表示当前线路上无数据传输

    2.UART传输时序

    在这里插入图片描述
    **发送数据过程:**空闲状态,线路处于高电平,当收到发送数据指令后,拉低电平一个数据位的时间,接着数据按低位到高位依次发送,数据位发送完毕,接着发送奇偶校验位和停止位,停止位为高电平,一帧数据发送结束;
    **接收数据过程:**空闲状态,线路处于高电平,当检测到线路的下降沿,说明线路有数据传输,按照约定的波特率从低位到高位接收数据,数据接收完毕后接着接收奇偶校验位并比较,看奇偶校验位是否正确,如果正确则通知接收端设备准备接收数据;

    2.UART工程设计

    在这里插入图片描述
    UART_TOP模块中共包含三个子模块:
    1、Baud_Clock模块用来产生115200的波特率时钟;
    2、RX模块为接收(receive)模块,输入信号rx_pin为接收的序列数据,rx_ready为接收端的反压信号,只有当ready信号为高时才会输出rx_data数据,rx_valid用来表明什么时候rx_data有效。rx_erro输出接收的rx_pin序列的奇偶校验是否正确,0表示正确,1表示错误,若检验到错误,会要求发送端重发。
    3、TX模块为发送(transmission)模块,输入信号为tx_data并行信号,tx_valid表示tx_data的有效性,tx_ready表示当前发送模块是否空闲;tx_pin为输出的串行数据,tx_erro为检错重发信号,当受到erro=1时就把ready=1拉高,重新发送上一次的数据;

    3.RX模块(receive)

    在这里插入图片描述

    `timescale 1ns/1ps
    module rx_control(
        input           clk,//50MHz
        input           rst_n,
        input           baud_clk,
    
        input           rx_pin,
        output          rx_erro,
    
        input           rx_ready,
        output          rx_valid,
        output  [6:0]   rx_data
        );
    
        parameter  IDLE = 4'b0001, RECEIVE = 4'b0010, 
                   END  = 4'b0100, ERRO    = 4'b1000;
        
        reg     [3:0]   state_curt; //current state
        reg     [3:0]   state_next; //next state
        reg     [3:0]   count;
        reg     [7:0]   data;
    
        always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                state_curt <= IDLE;
        end
        always@(posedge baud_clk)
        begin
                state_curt <= state_next;
        end
    
        always@(*)
        begin
            case(state_curt)
                IDLE:
                    if(rx_pin==0)
                        state_next <= RECEIVE;
                RECEIVE:
                    if(count==7)
                    begin
                        if((^data)==0)
                            state_next <= END;
                        else
                            state_next <= ERRO;
                    end
                    else
                        state_next <= state_next;
                END:
                    if(rx_ready)
                        state_next <= IDLE;
                    else
                        state_next <= END;
                ERRO:
                    state_next <= IDLE;
                default :
                    state_next <= IDLE;
            endcase
        end
    
        always@(posedge baud_clk)
        begin
            if(state_curt==RECEIVE)
                count <= count +1'b1;
            else
                count <= 32'd0;
        end
        
        always@(posedge baud_clk)
        begin
            if(state_curt==RECEIVE)
            begin
                data[7]   <= rx_pin;
                data[6:0] <= data[7:1];
            end
            else 
            begin
                if(state_curt==END | state_curt==ERRO)
                    data <= data;
                else
                    data <= 8'b0;
            end
        end
        
        assign rx_erro = (state_curt == ERRO)? 1'b1:1'b0;
        assign rx_data = (state_curt == END )? data[6:0]:7'b0;
        assign rx_valid= (state_curt == END )? 1'b1:1'b0;
        
    endmodule
    

    4.TX模块(transmission)

    在这里插入图片描述

    `timescale 1ns/1ps
    module tx_control(
        input           clk,
        input           rst_n,
        input           baud_clk,
        
        input           tx_erro,
        output  reg     tx_pin,
    
        input           tx_valid,
        input   [6:0]   tx_data,
        output          tx_ready
        );
    
        parameter   IDLE = 4'b0001, START = 4'b0010,
                    SEND = 4'b0100, END   = 4'b1000;
    
        reg     [3:0]   state_curt;
        reg     [3:0]   state_next;
    
        reg     [7:0]   data;
        reg     [7:0]   r_data;
        reg     [3:0]   count;
    
        always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
                state_curt <= IDLE;
        end
        always@(posedge baud_clk)
        begin
            state_curt <= state_next;
        end
    
        always@(*)
        begin
            case(state_curt)
                IDLE:
                    if((tx_valid==1'b1)&(tx_erro==1'b0))
                        begin
                        state_next <= START;
                        r_data     <= tx_data;
                        end
                    else
                        state_next <= IDLE;
                START:
                    state_next <= SEND;
                SEND:
                    if(count==3'd7)
                        state_next <= END;
                    else
                        state_next <= SEND;
                END:
                    if((tx_valid==1'b1)&(tx_erro==1'b0))
                        begin
                        state_next <= START;
                        r_data     <= tx_data;
                        end
                    else
                        state_next <= IDLE;
                default:
                    state_next <= IDLE;
            endcase
        end
    
        always@(posedge baud_clk)
        begin
            if(state_curt==SEND)
                count <= count + 1'b1;
            else
                count <= 4'b0;
        end
    
        assign tx_ready = ((state_curt==IDLE)|(state_curt==END))? 1'b1:1'b0;
    
        always@(posedge baud_clk)
        begin
            if(state_next==START)
                begin
                    tx_pin    <= 1'b0;
                    data[6:0] <= r_data;
                    data[7]   <= ^r_data;
                end
            else
            begin
                if(state_next==SEND) 
                    begin
                        tx_pin <= data[0];
                        data[6:0] <= data[7:1];
                    end
                else
                    tx_pin <= 1'b1;
            end
        end
    
    endmodule
    
    
    

    5.Baud_Clock模块

    `timescale 1ns/1ps
    module baud_clock(
        input   clk,
        input   rst_n,
        output  baud_clk
        );
        
        parameter   CLK_FRE   = 32'd50;
        parameter   BAUD_RATE = 32'd115200;//波特率:1s传输的二进制码元个数
        parameter   CNT_NUM   = CLK_FRE * 1000_000 / BAUD_RATE;
        
        reg     [31:0]  count;
        reg             b_clk;
        always@(posedge clk or negedge rst_n)
        begin
            if(!rst_n)
            begin
                count <= 32'd0;
                b_clk <= 0;
            end
            else 
            begin
                if(count == CNT_NUM-1)
                    begin
                        count <= 32'd0;
                        b_clk <= 1;
                    end
                else
                    begin
                        count <= count + 32'd1;
                        b_clk <= 0;
                    end
            end
        end
        assign baud_clk = b_clk;
    
    endmodule
    
    展开全文
  • 01、UART串口通信

    2021-04-02 16:05:40
    文章目录UART串口通信0、前言1、串行通信的初步认识2、RS232 通信接口3、USB 转串口通信4、IO 口模拟 UART 串口通信5、UART串口通信的基本应用5.1、通信的三种基本类型5.2、UART 模块介绍5.3、UART 串口程序6、ASCII...

    0、前言


      通信,按照传统的理解就是信息的传输与交换。对于单片机来说,通信则与传感器、存 储芯片、外围控制芯片等技术紧密结合,成为整个单片机系统的“神经中枢”。没有通信, 单片机所实现的功能仅仅局限于单片机本身,就无法通过其它设备获得有用信息,也无法将 自己产生的信息告诉其它设备。如果单片机通信没处理好的话,它和外围器件的合作程度就 受到限制,最终整个系统也无法完成强大的功能,由此可见单片机通信技术的重要性。UART (Universal Asynchronous Receiver/Transmitter,即通用异步收发器)串行通信是单片机最常 用的一种通信技术,通常用于单片机和电脑之间以及单片机和单片机之间的通信。

    1、串行通信的初步认识


      通信按照基本类型可以分为并行通信和串行通信。并行通信时数据的各个位同时传送,可以实现字节为单位通信,但是通信线多占用资源多,成本高。比如我们用到的P0 = 0xFE; 一次给 P0 的 8 个 IO 口分别赋值,同时进行信号输出,类似于有 8 个车道同时可以过去 8 辆 车一样,这种形式就是并行的,我们习惯上还称 P0、P1、P2 和 P3 为 51 单片机的 4 组并行总线。

      而串行通信,就如同一条车道,一次只能一辆车过去,如果一个 0xFE 这样一个字节的 数据要传输过去的话,假如低位在前高位在后的话,那发送方式就是 0-1-1-1-1-1-1-1-1,一位 一位的发送出去的,要发送 8 次才能发送完一个字节。

      单片机有两个引脚是专门用来做 UART 串行通信的,它们分别叫做 RXD 和 TXD,由它们组成的通信接口就叫做串行接口,简称串口。
    用两个单片机进行 UART 串口通信,接线如下图所示。

      图中,GND 表示单片机系统电源的参考地,TXD 是串行发送引脚,RXD 是串行接收引 脚。两个单片机之间要通信,首先电源基准得一样,所以我们要把两个单片机的 GND 相互 连接起来,然后单片机 1 的 TXD 引脚接到单片机 2 的 RXD 引脚上,即此路为单片机 1 发送 而单片机 2 接收的通道,单片机 1 的 RXD 引脚接到单片机 2 的 TXD 引脚上,即此路为单片 机 2 发送而单片机 1 接收的通道。这个示意图就体现了两个单片机相互收发信息的过程。
      当单片机 1 想给单片机 2 发送数据时,比如发送一个 0xE4 这个数据,用二进制形式表 示就是 0b11100100,在 UART 通信过程中,是低位先发,高位后发的原则,那么就让 TXD 首先拉低电平,持续一段时间,发送一位 0,然后继续拉低,再持续一段时间,又发送了一 位 0,然后拉高电平,持续一段时间,发了一位 1……一直到把 8 位二进制数字 0b11100100 全部发送完毕。这里就涉及到了一个问题,就是持续的这“一段时间”到底是多久?由此便引入了通信中的一个重要概念——波特率,也叫做比特率。

      波特率就是发送二进制数据位的速率,习惯上用 baud 表示,即我们发送一位二进制数据的持续时间=1/baud。在通信之前,单片机 1 和单片机 2 首先都要明确的约定好它们之间的通 信波特率,必须保持一致,收发双方才能正常实现通信,这一点大家一定要记清楚。

      约定好速度后,我们还要考虑第二个问题,数据什么时候是起始,什么时候是结束呢? 不管是提前接收还是延迟接收,数据都会接收错误。在 UART 通信的时候,一个字节是 8 位,规定当没有通信信号发生时,通信线路保持高电平,当要发送数据之前,先发一位 0 表示起 始位,然后发送 8 位数据位,数据位是先低后高的顺序,数据位发完后再发一位 1 表示停止 位。这样本来要发送一个字节的 8 位数据,而实际上我们一共发送了 10 位,多出来的两位其中一位起始位,一位停止位。而接收方呢,原本一直保持的高电平,一旦检测到了一位低电平,那就知道了要开始准备接收数据了,接收到 8 位数据位后,然后检测到停止位,再准备下一个数据的接收。如下图所示:

      上图实际上是一个时域示意图,就是信号随着时间变化的对应关系。比如在单片机的发送引脚上,左边的是先发生的,右边的是后发生的,数据位的切换 时间就是波特率分之一秒,如果能够理解时域的概念,后边很多通信的时序图就很容易理解了。

    2、RS232 通信接口


      在我们的台式电脑上,一般都会有一个 9 针的串行接口,这个串行接口叫做 RS232 接口, 它和 UART 通信有关联,但是由于现在笔记本电脑都不带这种 9 针串口了,所以和单片机通 信越来越趋向于使用 USB 虚拟的串口,因此这一节的内容作为了解内容,大家知道有这么回事就行了。

      RS232 接口一共有 9 个引脚,分别定义是:1、载波检测 DCD;2、接收数据 RXD;3、 发送数据 TXD;4、数据终端准备好 DTR;5、信号地线 SG;6、数据准备好 DSR;7、请求发送 RTS;8、清除发送 CTS;9、振铃提示 RI。我们要让这个串口和我们单片机进行通信, 我们只需要关心其中的 2 脚 RXD、3 脚 TXD 和 5 脚 GND 即可。

      虽然这三个引脚的名字和我们单片机上的串口名字一样,但是却不能直接和单片机对连通信,这是为什么呢?随着我们了解的内容越来越多,我们得慢慢知道,不是所有的电路都 是 5V 代表高电平而 0V 代表低电平的。对于 RS232 标准来说,它是个反逻辑,也叫做负逻辑。为何叫负逻辑?它的 TXD 和 RXD 的电压,-3V~-15V 电压代表是 1,+3~+15V 电压代 表是 0。低电平代表的是 1,而高电平代表的是 0,所以称之为负逻辑。因此电脑的 9 针 RS232 串口是不能和单片机直接连接的,需要用一个电平转换芯片 MAX232 来完成,如图下图所示。

      这个芯片就可以实现把标准 RS232 串口电平转换成我们单片机能够识别和承受的UART 0V/5V 电平。从这里大家似乎慢慢有点明白了,其实 RS232 串口和 UART 串口,它们的协议类型是一样的,只是电平标准不同而已,而 MAX232 这个芯片起到的就是中间人的作用,它 把 UART 电平转换成 RS232 电平,也把 RS232 电平转换成 UART 电平,从而实现标准 RS232 接口和单片机 UART 之间的通信连接。

    3、USB 转串口通信


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

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

      右侧的 CH340T 这个电路很简单,把电源、晶 振接好后,6 脚和 7 脚的 DP 和 DM 分别接 USB 口的 2 个数据引脚上去,3 脚和 4 脚通过跳 线接到了我们单片机的 TXD 和 RXD 上去。

    4、IO 口模拟 UART 串口通信


      为了让大家充分理解 UART 串口通信的原理,我们先把 P3.0 和 P3.1 当做 IO 口来进行模拟实际串口通信的过程,原理搞懂后,我们再使用寄存器配置实现串口通信过程。

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

      串口调试助手,这里我们直接使用 STC-ISP 软件自带的串口调试助手,先把串口调试助手的使用给大家说一下。

    【第一步】要选择串口助手菜单

    【第二步】选择十六进制显示

    【第三步】选择十六进制发送

    【第四步】选择 COM 口,这个 COM 口要和自己电脑设备管理器里的那个 COM 口一致,波特率按我们程序设定好的选择,我们程序中让一个数据位持续时间是 1/9600 秒,那这个地方选择波特率就是选 9600,校验位选 N,数据位 8,停止位 1。

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

    先上代码,在作解释。

    IO口模拟串口通信实例:

    #include <reg52.h> 
     
    sbit PIN_RXD = P3^0;		//接收引脚定义 
    sbit PIN_TXD = P3^1;		//发送引脚定义 
    
    bit RxdOrTxd = 0;  			//指示当前状态为接收还是发送 
    bit RxdEnd = 0;    			//接收结束标志 
    bit TxdEnd = 0;    			//发送结束标志 
    unsigned char RxdBuf = 0;  //接收缓冲器 
    unsigned char TxdBuf = 0;  //发送缓冲器 
    
    void ConfigUART(unsigned int baud); 
    void StartTXD(unsigned char dat); 
    void StartRXD(); 
     
    void main() 
    { 
        EA = 1;   				//开总中断 
     	ConfigUART(9600); 		//配置波特率为 9600 
         
        while (1) 
        { 
            while (PIN_RXD);     //等待接收引脚出现低电平,即起始位 
            StartRXD();          //启动接收 
            while (!RxdEnd);     //等待接收完成 
            StartTXD(RxdBuf+1);  //接收到的数据+1后,发送回去 
            while (!TxdEnd);     //等待发送完成 
        } 
    }
    
    /* 串口配置函数,baud-通信波特率 */ 
    void ConfigUART(unsigned int baud) 
    { 
         TMOD &= 0xF0; 				//清零 T0的控制位 
         TMOD |= 0x02; 				//配置 T0为模式 2 
         TH0 = 256 - (11059200/12)/baud; //计算 T0重载值 
    }
    
    /* 启动串行接收 */
    void StartRXD() 
    { 
    	TL0 = 256 - ((256-TH0)>>1); //接收启动时的 T0定时为半个波特率周期 
        ET0 = 1; 					//使能 T0中断 
    	TR0 = 1; 					//启动 T0 
        RxdEnd = 0;     			//清零接收结束标志 
        RxdOrTxd = 0;   			//设置当前状态为接收 
    }
    
    /* 启动串行发送,dat-待发送字节数据 */ 
    void StartTXD(unsigned char dat) 
    { 
    	TxdBuf = dat;    			//待发送数据保存到发送缓冲器 
        TL0 = TH0;       			//T0计数初值为重载值 
     	ET0 = 1; 					//使能 T0中断 
     	TR0 = 1; 					//启动 T0 
        PIN_TXD = 0;    			//发送起始位 
        TxdEnd = 0;     			//清零发送结束标志 
        RxdOrTxd = 1;   			//设置当前状态为发送 
    }
    
    /* T0中断服务函数,处理串行发送和接收 */ 
    void InterruptTimer0() interrupt 1 
    { 
        static unsigned char cnt = 0;	//位接收或发送计数 
     
        if (RxdOrTxd)					//串行发送处理 
        { 
            cnt++; 
     		if (cnt <= 8)				//低位在先依次发送 8bit数据位 
            { 
                PIN_TXD = TxdBuf & 0x01; 
                TxdBuf >>=1; 
            } 
            else if (cnt == 9)  		//发送停止位 
            { 
                PIN_TXD = 1; 
            } 
            else  						//发送结束 
            { 
     			cnt = 0; 				//复位 bit计数器 
     			TR0 = 0; 				//关闭 T0 
                TxdEnd = 1; 			//置发送结束标志 
            } 
        } 
        else  //串行接收处理
        { 
            if (cnt == 0)     			//处理起始位 
            { 
     			if (!PIN_RXD) 			//起始位为 0时,清零接收缓冲器,准备接收数据位 
                { 
                    RxdBuf = 0; 
                    cnt++; 
                } 
     			else 					//起始位不为 0时,中止接收 
                { 
     				TR0 = 0; 			//关闭 T0 
                } 
            } 
     		else if (cnt <= 8) 			//处理 8位数据位 
            { 
                RxdBuf >>= 1;    		//低位在先,所以将之前接收的位向右移 
     			if (PIN_RXD) 			//接收脚为 1时,缓冲器最高位置 1, 
     			{ 						//而为 0时不处理即仍保持移位后的 0 
                    RxdBuf |= 0x80; 
                } 
                cnt++; 
            } 
            else  						//停止位处理 
            { 
     			cnt = 0; 				//复位 bit计数器 
     			TR0 = 0; 				//关闭 T0 
     			if (PIN_RXD) 			//停止位为 1时,方能认为数据有效 
                { 
                    RxdEnd = 1;  		//置接收结束标志 
                } 
            } 
        } 
    } 
    

      变量定义部分就不用说了,直接看 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()。接收函数最开始启动半个波特率周期,初学可能这里不是很明白。大家回头看一下串口数据示意图,如果在数据位电平变化的时候去读取,因为时序上的误差以及信号稳定性的问题很容易读错数据,所以我们希望在信号最稳定的时候去读数据。除了信号变化的那个沿的位置外,其它位置都很稳定,那么我们现在就约定在信号中间位置去读取电平状态,这样能够保证我们读的一定是正确的。

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

    5、UART串口通信的基本应用

    5.1、通信的三种基本类型

      常用的通信从传输方向上可以分为单工通信、半双工通信、全双工通信三类。

      单工通信是指只允许一方向另外一方传送信息,而另一方不能回传信息。比如电视遥 控器、收音机广播等,都是单工通信技术。

      半双工通信 是指数据可以在双方之间相互传播,但是同一时刻只能其中一方发给另外一 方,比如我们的对讲机就是典型的半双工。

      全双工通信是指发送数据的同时也能够接收数据,两者同步进行,就如同我们的电话一样, 我们说话的同时也可以听到对方的声音。

    5.2、UART 模块介绍

      IO 口模拟串口通信,让大家了解了串口通信的本质,但是我们的单片机程序却需要不停的检测扫描单片机 IO 口收到的数据,大量占用了单片机的运行时间。这时候就会有聪明人想了,其实我们并不是很关心通信的过程,我们只需要一个通信的结果,最终得到接收到的数据就行了。这样我们可以在单片机内部做一个硬件模块,让它自动接收数据,接收完了, 通知我们一下就可以了,我们的 51 单片机内部就存在这样一个 UART 模块,要正确使用它,当然还得先把对应的特殊功能寄存器配置好。

      51 单片机的 UART 串口的结构由串行口控制寄存器SCON、发送和接收电路三部分构成,先来了解一下串口控制寄存器 SCON。

      前边学了那么多寄存器的配置,相信 SCON 这个地方,对于大多数同学来说已经不是难点了,应该能看懂并且可以自己配置了。对于串口的四种模式,模式 1 是最常用的,就是我 们前边提到的 1 位起始位,8 位数据位和 1 位停止位。下面我们就详细介绍模式 1 的工作细 节和使用方法,至于其它 3 种模式与此也是大同小异,真正遇到需要使用的时候大家再去查 阅相关资料就行了。

      在我们使用 IO 口模拟串口通信的时候,串口的波特率是使用定时器 T0 的中断体现出来的。在硬件串口模块中,有一个专门的波特率发生器用来控制发送和接收数据的速度。对于 STC89C52 单片机来讲,这个波特率发生器只能由定时器 T1 或定时器 T2 产生,而不能由定 时器 T0 产生,这和我们模拟的通信是完全不同的概念。

      使用定时器 T1 作为波特率发生器来讲解,方式 1 下的波特率发生器必须使用定时器 T1 的模式 2,也就是自动重装载模式,定时器的重载值计算公式为:
    T H 1 = T L 1 = 256 − 晶 振 值 / 12 / 2 / 16 / 波 特 率 TH1 = TL1 = 256 - 晶振值/12 /2/16 /波特率 TH1=TL1=256/12/2/16/
      和波特率有关的还有一个寄存器,是一个电源管理寄存器 PCON,他的最高位可以把波
    特率提高一倍,也就是如果写 PCON |= 0x80 以后,计算公式就成了:
    T H 1 = T L 1 = 256 − 晶 振 值 / 12 / 16 / 波 特 率 TH1 = TL1 = 256 - 晶振值/12 /16 /波特率 TH1=TL1=256/12/16/
      公式中数字的含义这里解释一下,256 是 8 位定时器的溢出值,也就是 TL1 的溢出值,晶振值在我们的开发板上就是 11059200,12 是说 1 个机器周期等于 12 个时钟周期,值得关 注的是这个 16,我们来重点说明。在 IO 口模拟串口通信接收数据的时候,采集的是这一位数据的中间位置,而实际上串口模块比我们模拟的要复杂和精确一些。他采取的方式是把一 位信号采集 16 次,其中第 7、8、9 次取出来,这三次中其中两次如果是高电平,那么就认 定这一位数据是 1,如果两次是低电平,那么就认定这一位是 0,这样一旦受到意外干扰读 错一次数据,也依然可以保证最终数据的正确性。

      了解了串口采集模式,在这里要给大家留一个思考题。“晶振值/12/2/16/波特率”这个地方计算的时候,出现不能除尽,或者出现小数怎么办,允许出现多大的偏差?把这部分理解 了,也就理解了我们的晶振为何使用 11.0592M 了。

      串口通信的发送和接收电路在物理上有 2 个名字相同的 SBUF 寄存器,它们的地址也都 是 0x99,但是一个用来做发送缓冲,一个用来做接收缓冲。意思就是说,有 2 个房间,两个房间的门牌号是一样的,其中一个只出人不进人,另外一个只进人不出人,这样的话,我们 就可以实现 UART 的全双工通信,相互之间不会产生干扰。但是在逻辑上呢,我们每次只操 作 SBUF,单片机会自动根据对它执行的是“读”还是“写”操作来选择是接收 SBUF 还是 发送 SBUF,后边通过程序,我们就会彻底了解这个问题。

    5.3、UART 串口程序

      一般情况下,我们编写串口通信程序的基本步骤如下所示:
      1、配置串口为模式 1。
      2、配置定时器 T1 为模式 2,即自动重装模式。
      3、根据波特率计算 TH1 和 TL1 的初值,如果有需要可以使用 PCON 进行波特率加倍。 4、打开定时器控制寄存器 TR1,让定时器跑起来。
      这里还要特别注意一下,就是在使用 T1 做波特率发生器的时候,千万不要再使能 T1 的
    中断了。

      我们先来看一下由 IO 口模拟串口通信直接改为使用硬件 UART 模块时的程序代码,看
    看程序是不是简单了很多,因为大部分的工作硬件模块都替我们做了。程序功能和 IO 口模 拟的是完全一样的。

    #include <reg52.h> 
     
    void ConfigUART(unsigned int baud); 
     
    void main() 
    { 
        ConfigUART(9600);	//配置波特率为 9600
        while (1) 
        { 
            while (!RI);      //等待接收完成 
            RI = 0;            //清零接收中断标志位 
            SBUF = SBUF + 1; //接收到的数据+1后,发送回去 
            while (!TI);      //等待发送完成 
            TI = 0;            //清零发送中断标志位 
        } 
    }
    
    /* 串口配置函数,baud-通信波特率 */ 
    void ConfigUART(unsigned int baud) 
    { 
    	SCON = 0x50; //配置串口为模式 1 
    	TMOD &= 0x0F; //清零 T1的控制位 
        TMOD |= 0x20; //配置 T1为模式 2 
        TH1 = 256 - (11059200/12/32)/baud; //计算 T1重载值 
        TL1 = TH1;     //初值等于重载值 
    	ET1 = 0; //禁止 T1中断 
        TR1 = 1; //启动 T1 
    }
    

      当然了,这个程序还是用在主循环里等待接收中断标志位和发送中断标志位的方法来编写的,而实际工程开发中,当然就不能这么干了,我们也只是为了用直观的对比来告诉你们硬件模块可以大大简化程序代码,那么实际使用串口的时候就用到串口中断了,来看一下用中断实现的程序。请注意一点,因为接收和发送触发的是同一个串口中断,所以在串口中断函数中就必须先判断是哪种中断,然后再作出相应的处理。

    #include <reg52.h> 
     
    void ConfigUART(unsigned int baud); 
     
    void main() 
    { 
        EA = 1;   //使能总中断 
     	ConfigUART(9600); //配置波特率为 9600 
        while (1); 
    }
    
    /* 串口配置函数,baud-通信波特率 */ 
    void ConfigUART(unsigned int baud) 
    { 
    	SCON = 0x50; //配置串口为模式 1 
    	TMOD &= 0x0F; //清零 T1的控制位 
    	TMOD |= 0x20; //配置 T1为模式 2 
        TH1 = 256 - (11059200/12/32)/baud; //计算 T1重载值
    	TL1 = TH1;     //初值等于重载值 
        ET1 = 0; //禁止 T1中断 
        ES  = 1;       //使能串口中断 
        TR1 = 1; //启动 T1 
    }
    
    /* UART中断服务函数 */ 
    void InterruptUART() interrupt 4 
    { 
        if (RI)  //接收到字节 
        { 
        	RI = 0;   			//手动清零接收中断标志位 
     		SBUF = SBUF + 1; 	//接收的数据+1后发回,左边是发送 SBUF,右边是接收 SBUF 
        } 
        if (TI)  //字节发送完毕 
        { 
            TI = 0;   //手动清零发送中断标志位 
        } 
    }
    

      大家可以试验一下,看看是不是和前边用 IO 口模拟通信实现的效果一致,而主循环却完全空出来了,我们就可以随意添加其它功能代码进去。

    6、ASCII 码


      细心的同学可能会发现,在串口调试助手发送选项和接收选项处,还有个“字符格式发送”和“字符格式显示”,这是什么意思呢?
      先抛开我们使用的汉字不谈,那么我们常用的字符就包含了 0~9 的数字、A ~ Z/a ~ z 的字母、还有各种标点符号等。那么在单片机系统里面我们怎么来表示它们呢?

      ASCII 码(American Standard Code for Information Interchange,即美国信息互换标准代码)可以完成这个使命:我们知道,在单片机中一个字节的数据可以有 0~255 共 256 个值,我们取其中的 0~127 共 128 个值赋予了它另外一层涵义,即让它们分别来代表一个常用字符,其具体的对应关系如下图所示所示。

      这样我们就在常用字符和字节数据之间建立了一一对应的关系,那么现在一个字节就既可以代表一个整数又可以代表一个字符了,但它本质上只是一个字节的数据,而我们赋予了它不同的涵义,什么时候赋予它哪种涵义就看编程者的意图了。

    个值赋予了它另外一层涵义,即让它们分别来代表一个常用字符,其具体的对应关系如下图所示所示。

      这样我们就在常用字符和字节数据之间建立了一一对应的关系,那么现在一个字节就既可以代表一个整数又可以代表一个字符了,但它本质上只是一个字节的数据,而我们赋予了它不同的涵义,什么时候赋予它哪种涵义就看编程者的意图了。

    展开全文
  • uart串口通信

    2018-04-19 22:54:45
    uart串口通信的Verilog代码实现,基于Vivado平台,可以联合Modelsim进行软件仿真,同时也可以在Source文件夹下查看源码进行别的平台实现
  • 在测试文件中,设定串口发送模块发送的内容,并发给接收模块接收端,通过仿真,可知接收模块接收内容和发送内容一致
  • UART串口通讯

    2021-01-14 16:03:47
    UART串口通讯总结前言串口的基本概念串口配置的基本属性串口(Serial port)和RS-232串口通讯流控制 前言 此篇文章为转载,转载地址为uart串口通讯总结 串口的基本概念 UART全称为Universal Asynchronous Receiver/...

    前言

    此篇文章为转载,转载地址为uart串口通讯总结

    串口的基本概念

    UART全称为Universal Asynchronous Receiver/Transmitter,即通用异步收发器,是串行通信一种通信技术,常用于单片机和电脑之间以及单片机和单片机之间的板级通信。
    串口有三根线,分别如下:
    (1)TXD:发送;
    (2)RXD:接收;
    (3)GND:接地

    在这里插入图片描述
    串口通信是异步通讯,端口能够在一根线上发送数据同时在另一根线上接收数据。串口通信最重要的参数是波特率、数据位、停止位和奇偶校验。对于两个进行通信的端口,这些参数必须匹配。

    串口配置的基本属性

    (1)波特率
    波特率是一个衡量通信速度的参数。它表示每秒钟传送的bit的个数。例如9600波特表示每秒钟发送9600个bit。在时钟周期中,若波特率为4800,则表示时钟是4800Hz,同时表示串口通信在数据线上的采样率为4800Hz。串口通常用的波特率为1200、2400、4800、9600、14400、19200、28800、38400、57600、115200、128000、256000。其中如果串口速率越高,其传输的距离和稳定性就有所下降。一般常用为9600和115200。
    (2)数据位
    数据位表征通信中实际数据位的参数。当计算机发送一个信息包,其中需指定有效数据位,一般有5、7和8位。常规使用一般定义为8位。如何设置取决于你想传送的信息。比如,标准的ASCII码是0~127(7位)。扩展的ASCII码是0~255(8位)。如果数据使用简单的文本(标准 ASCII码),那么每个数据包使用7位数据。每个包是指一个字节,包括开始/停止位,数据位和奇偶校验位。由于实际数据位取决于通信协议的选取,术语“包”指任何通信的情况。   
    (3)停止位
    停止位表征单包数据的最后一位。典型的值为1,1.5和2位。由于数据是在传输线上定时的,并且每一个设备有其自己的时钟,在传输中可能存在不同步的情况,因此停止位不仅仅是表示传输的结束,同时也是校正时钟同步的机会。适用于停止位的位数越多,不同时钟同步的容忍程度越大,但是数据传输率同时也越慢。   
    (4)奇偶校验位
    在串口通信中一种简单的检错方式。有四种检错方式:偶、奇、高和低。当然没有校验位也是可以的。对于偶和奇校验的情况,串口会设置校验位(数据位后面的一位),用一个值确保传输的数据有偶个或者奇个逻辑高位。
    例如,如果数据是011,那么对于偶校验,校验位为0,保证逻辑高的位数是偶数个。如果是奇校验,校验位为1,这样就有3个逻辑高位,保证逻辑高为奇数个。高位和低位不真正的检查数据,简单置位逻辑高或者逻辑低校验。这样使得接收设备能够知道一个位的状态,有机会判断是否有噪声干扰,通信的传输和接收数据是否不同步。

    串口(Serial port)和RS-232

    在PC机和单片机的串口通讯中,需要接一块电平转换芯片,用于将TTL/CMOS(单片机电平)转换为RS232(PC机电平)。
    TTL/CMOS电平范围:0~1.8/2.5/3.3/5V(不同单片机范围不同),高电压表示1,低电压表示0。
    RS232逻辑电平范围:-12V——12V,-5 —— -12表示高电平,+5——+12V表示低电平。
    RS-232定义了各种形态的串口接口,常见的有DE-9、DB-25。

    因此理论上,PC机与单片机中的通讯转换原理应为:
    PC(串口)<---------->电平转换电路<---------->单片机(串口)
    现在常用的是通过USB转串口实现:
    PC(USB接口)<---------->USB转串口<---------->单片机(串口)

    串口通讯流控制

    在串行通讯处理中,常有RTS/CTS和XON/XOFF选项,表示流控制选项,目前流控制主要应用于调制解调器的数据通讯中(调制解调器.note)。
    (1)流控制在串行通讯中的作用
    这流的“流”,指的是数据流。数据在两个串口之间传输时,常常会出现丢失数据的现象,或者两台计算机的处理速度不同,如台式机与单片机之间的通讯,接收端数据缓冲区已满,则此时继续发送来的数据就会丢失。现在我们在网络上通过MODEM进行数据传输,这个问题就尤为突出。流控制能解决这个问题,当接收端数据处理不过来时,就发出“不再接收”的信号,发送端就停止发送,直到收到“可以继续发送”的信号再发送数据。因此流控制可以控制数据传输的进程,防止数据的丢失。 PC机中常用的两种流控制是硬件流控制(包括RTS/CTS、DTR/CTS等)和软件流控制XON/XOFF(继续/停止)。

    (2)硬件流控制
    硬件流控制常用的有RTS/CTS流控制和DTR/DSR(数据终端就绪/数据设置就绪)流控制。
    硬件流控制必须将相应的电缆线连上,用RTS/CTS(请求发送/清除发送)流控制时,应将通讯两端的RTS、CTS线对应相连,数据终端设备(如计算机)使用RTS来起始调制解调器或其它数据通讯设备的数据流,而数据通讯设备(如调制解调器)则用CTS来起动和暂停来自计算机的数据流。

    这种硬件握手方式的过程为:在编程时,根据接收端缓冲区大小设置一个高位标志(可为缓冲区大小的75%)和一个低位标志(可为缓冲区大小的25%),当缓冲区内数据量达到高位时,我们在接收端将CTS线置低电平(送逻辑0),当发送端的程序检测到CTS为低后,就停止发送数据,直到接收端缓冲区的数据量低于低位而将CTS置高电平。RTS则用来标明接收设备有没有准备好接收数据。
    常用的流控制还有还有DTR/DSR(数据终端就绪/数据设置就绪)。我们在此不再详述。由于流控制的多样性,我个人认为,当软件里用了流控制时,应做详细的说明,如何接线,如何应用。
    (3)软件流控制
    由于电缆线的限制,在普通的控制通讯中一般不用硬件流控制,而用软件流控制。一般通过XON/XOFF来实现软件流控制。
    常用方法是:当接收端的输入缓冲区内数据量超过设定的高位时,就向数据发送端发出XOFF字符(十进制的19或Control-S,设备编程说明书应该有详细阐述),发送端收到XOFF字符后就立即停止发送数据;当接收端的输入缓冲区内数据量低于设定的低位时,就向数据发送端发出XON字符(十进制的17或Control-Q),发送端收到XON字符后就立即开始发送数据。一般可以从设备配套源程序中找到发送的是什么字符。
    若传输的是二进制数据,标志字符也有可能在数据流中出现而引起误操作,这是软件流控制的缺陷,而硬件流控制不会有这个问题。

    展开全文
  • 串口通信UART学习心得

    2020-08-04 05:13:09
    CPLD学习心得之串口通信UART学习
  • 通过Verilog实现了RS232串口通信功能,包括串口的接收和发送,并给出了详细的注释,易于代码的理解,只需针对自己的实际情况稍加修改便可直接使用。实际上板验证可用
  • 1 计算机串行通信基础 2 80C51的串行口 3 单片机串行口编程应用举例
  • FPGA Uart串口发送

    2020-09-21 13:00:03
    FPGA Uart串口发送数据,通过Verilog HDL语言实现。
  • UART串口通信软件推荐

    千次阅读 2021-02-09 13:41:49
    UART串口通信软件推荐 在我们调试单片机的时候,经常用到UART串口通信(没有足够的资金购入LCD屏、OLED屏等显示器件)。市面上这么多的串口调试软件实在是让人无从下手,下面安利3款串口调试软件,提供大家参考选择...
  • 单片机UART串口通信 单片机的串口通信,一般指的就是UART串口通信(TXD,RXD)。本文实现的是单片机和电脑之间的串口通信,需要用到51单片机开发板,电脑,STC-ISP软件,代码已调试成功,切实可用。 文章目录单片机...
  • FPGA实现UART串口通信最全资料

    热门讨论 2012-02-19 20:11:37
    FPGA实现UART串口通信资料,不仅有基于Quratus II 的源代码,还有一篇WORD文档的详细说明,并附有串口调试助手。学习RS232串口通信,真的比较全了。
  • UART串口通信程序

    2020-07-31 06:57:11
    本文给大家提供一个UART串口通信的实验程序。
  • UART串口通讯协议

    千次阅读 2018-12-26 16:30:00
    一、UART定义 UART 通用异步收发传输器(Universal Asynchronous ... UART的作用是:把“要传输的数据”在串行通信与并行通信之间转换。在嵌入式领域,作为把并行信号转成串行信号的硬件设备,UART通常被集成...
  • 串口通信vivado实现,带有仿真文件,可实现数据收发
  • uart串口通信verilog源码,包含测试程序,包括cpu收发数据的模拟,可用modelsim,ncsim等软件编译运行
  • ESP32的UART串口通信(基于micropython)中所展示的所有代码
  • 为了让大家充分理解 UART 串口通信的原理,我们先把 P3.0 和 P3.1 当做 IO 口来进行模拟实际串口通信的过程,原理搞懂后,我们再使用寄存器配置实现串口通信过程。...IO 口模拟 UART 串行通信程序是一个简单...
  • 它将要传输的资料在串行通信与并行通信之间加以转换。作为把并行输入信号转成串行输出信号的芯片,UART通常被集成于其他通讯接口的连结上。 具体实物表现为独立的模块化芯片,或作为集成于微处理器中的周边设备。...
  • C51的UART 串口通信

    2020-05-30 11:19:50
    C51的UART 串口通信
  • UART串口通信协议概述

    万次阅读 2018-12-12 22:05:38
    UART包括RS232、RS449、RS423等接口标准规范和总线标准规范,即UART是异步串行通信口的总称。而RS232等式对应各种异步串行通信口的接口标准和总线标准,它们规定了通信口的电气特性、传输速率、连接特性和接口的机械...
  • 蓝桥杯单片机学习过程记录(二十)UART串口通信 今天学习了串口通信UART部分,理解得还不够深刻,总体来说感觉比IIC等简单一些,通用异步收发,实现发送接收指令控制的基础内容。 实现代码如下: //UART串口通信 #...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 29,261
精华内容 11,704
关键字:

uart串口通信