三大通信协议(1)UART

2023-05-16

目录

一、UART通信协议简介

二、UART通信时序

三、UART、RS232、TTL关系阐述

1.简介

2.电平转换

四、实例

1.程序代码

2.仿真验证

总结 



一、UART通信协议简介

    UART(Universal Asynchronous Receiver-Transmitter)是一种通用串行数据总线,用于异步通信,是一种低速、全双工的通信数据总线,在FPGA中,UART常应用于PC与FPGA之间的慢速通信。UART有tx(发送数据线),rx(接收数据线)两条数据传输线,因此是一种全双工的、异步通信模式。在通信的过程中,双方需要事先约定好通信速率,UART常用的通信速率9600bite/s、19200bite/s、115200bite/s等。

二、UART通信时序

       UART异步串行通信是以字符为传输单位,一位一位的顺序输送。由于UART通信无时钟线,因此UART通信不同于IIC通信和SPI通信,属于异步串行通信,通信双方需要事先约定好通信速率,即误码率:每秒传输二进制bite的个数。

      下图给出了UART通信的时序图:

空闲位:高电平表示空闲状态

起始位:由高电平到低电平的跳变,表示进入到起始位,依靠检测起始位来实现发送与接收方的时

               间的自同步。

数据传输:可以是4、5、6、7、8位逻辑0或者1,构成一个字符,从最低位开始传送。

奇偶校验:数据位加上这一位后,使得“1”的位数为偶数(偶校验)或奇数(奇校验)以此来校验

                  数据传送的正确性,可以没有该部分。

结束位:它是一个字符数据的结束标志,可以是1位、1.5位、2位的高电平,适用于停止位的位数

              越多,不同时钟同步的容忍程度越大,数据传输率同时也越低。

三、UART、RS232、TTL关系阐述

1.简介

      uart即上述所说的一种通用的异步收发器,或者说是串行通信的一种协议,这里不再赘述。

     CMO口是指针对串行通信协议的一种端口,即串行通讯端口,简称串口。大部分为9针D型,常见于台式电脑的后边,目前DB9型的接口基本已经被USB接口取代;还有一部分为4针杜邦头,也就是我们常说的四针串口,常见于pcb板上预留接口。RS-232和RS-485是CMO口的两种协议,或者说是通信的电平标准:RS-232采用的是负逻辑,即逻辑“1”表示-3V到-15V之间的电平,逻辑“0”表示+3V到+15V之间的电平,实际上RS-232电平标准已经在PC界成为了默认的标准;RS-485利用的是两根数据线之间的电压差进行数据传输,即逻辑“1”以两线间的电压差+2V~+6V表示,逻辑“0”以两线间的电压差-6V~-2V表示。两者之间的区别主要在于以下几点:1.传输方式不同,S-232采取不平衡传输方式,即所谓单端通讯. 而RS485则采用平衡传输,即差分传输方式。2.传输距离不同。RS-232适合本地设备之间的通信,传输距离一般不超过20m。而RS-485的传输距离为几十米到上千米。3.RS-232 只允许一对一通信,而RS-485 接口在总线上是允许连接多达128个收发器。

     TTL全名是晶体管-晶体管逻辑集成电路(Transistor-Transistor Logic),也是一种通信电平的标准。TTL对应的物理电平,始终是在0V和Vcc之间,其中常见的Vcc是5V或3.3V。TTL 采用的是正逻辑,即逻辑“1”表示>=2.4V的电平,逻辑"0"表示<=0.5V的电平。

2.电平转换

     对于同样传输8'b01010101来说,RS232和TTL的时序对比如下:

      RS232和TTL之间的转换,可以通过MAX3232芯片,把TTL电平转换成RS232电平,该芯片同样也可以实现RS232转换成TTL电平。

      USB转TTL电平可以通过PL2303或者CP2102芯片来完成转换,目前市面上一些USB转TTL串口的小板使用起来相对比较方便,如下图所示,可以随时完成PC端与FPGA开发板之间的数据通信。

四、实例

        该例子实现了PC主机与FPGA之间的数据环回,即主机通过UART串口通信协议向FPGA发送一串数据,FPGA将接收到的数据再经串口发送给主机。

       下边是整个系统模块的示意图:

      下边是接收端时序图:

     下边是发送端时序图:

1.程序代码

主程序Verilog代码:

module uart_receive  (

     input             clk,
     input             res,
     input             rxd,
     
     output  reg [7:0] data,
     output  reg       done
);
parameter   clk_fre  = 50000000;
parameter   uart_bps = 115200;
localparam  BPS_CONT = clk_fre/uart_bps;


reg         rx_d0;
reg         rx_d1;
reg         rx_flag;
reg  [15:0] clk_cnt;
reg  [3:0]  rx_cnt;
reg  [7:0]  rdata;

wire         start_flag;

assign  start_flag = (~rx_d0)& rx_d1; 

always @(posedge clk or negedge res) begin
       if(!res) begin
          rx_d0 <= 1'b0;
          rx_d1 <= 1'b0;
       end
       else begin
          rx_d0 <= rxd;
          rx_d1 <= rx_d0;
       end  
end 

always @(posedge clk or negedge res) begin
       if(!res) begin
          rx_flag <= 1'b0; 
       end
       else begin
          if(start_flag)
             rx_flag <= 1'b1;
          else if((rx_cnt == 4'd9) && (clk_cnt == BPS_CONT/2))
             rx_flag <= 1'b0;
          else
             rx_flag <= rx_flag;
       end  
end 

always @(posedge clk or negedge res) begin
       if(!res) begin
          rx_cnt  <= 4'd0;
          clk_cnt <= 16'd0;
       end
       else if(rx_flag) begin
          if(clk_cnt <= BPS_CONT-1) begin 
             clk_cnt <= clk_cnt + 1'd1;
             rx_cnt  <= rx_cnt;
          end 
          else  begin
             clk_cnt <= 16'd0;
             rx_cnt  <= rx_cnt + 1'd1;
          end 
       end  
       else begin
           rx_cnt  <= 4'd0;
           clk_cnt <= 16'd0;
       end 
end 


always @(posedge clk or negedge res) begin
       if(!res) begin
           rdata <= 8'd0;
       end
       else if (rx_flag)begin
           if(clk_cnt == BPS_CONT/2)begin
              case (rx_cnt)
               4'd1: rdata[0] <= rxd;
               4'd2: rdata[1] <= rxd;
               4'd3: rdata[2] <= rxd;
               4'd4: rdata[3] <= rxd;
               4'd5: rdata[4] <= rxd;
               4'd6: rdata[5] <= rxd;
               4'd7: rdata[6] <= rxd;
               4'd8: rdata[7] <= rxd;
               default:;
               endcase 
           end 
           else 
               rdata <= rdata;
       end  
       else
           rdata <= 8'd0; 
end 


always @(posedge clk or negedge res) begin
       if(!res) begin
          done <= 1'b0;
          data <= 8'd0;
       end
       else if(rx_cnt == 4'd9) begin
              done <= 1'b1;
              data <= rdata;
       end
       else begin
             done <= 1'b0;
             data <= 8'd0;       
       end  
end 

endmodule 

module uart_send(

     input         clk,
     input         res,
     input  [7:0]  data,
     input         en,
     
     output reg    txd

);
reg               tx_d0;
reg               tx_d1;
reg               tx_flag; 

reg  [15:0]       clk_cnt;
reg  [3:0]        tx_cnt;
reg  [7:0]        tdata;

wire              start_flag; 

parameter   clk_fre = 50000000;
parameter   uart_bps = 115200;
localparam  BPS_CONT = clk_fre/uart_bps;

assign  start_flag = (~tx_d1) & tx_d0; 

always @(posedge clk or negedge res) begin
       if(!res) begin
          tx_d0 <= 1'b0;
          tx_d1 <= 1'b0;
       end
       else begin
          tx_d0 <= en;
          tx_d1 <= tx_d0;
       end  
end 

always @(posedge clk or negedge res) begin
       if(!res) begin
           tx_flag <= 1'b0; 
           tdata   <= 8'b0;
       end
       else begin
          if(start_flag)  begin 
             tx_flag <= 1'b1;
             tdata   <= data;
          end
          else if((tx_cnt == 4'd9) && (clk_cnt == BPS_CONT/2)) begin 
             tx_flag <= 1'b0;
             tdata   <= 8'b0;
          end 
          else  begin 
             tx_flag <= tx_flag;
             tdata   <= tdata;
          end     
       end  
end 


always @(posedge clk or negedge res) begin
       if(!res) begin
          tx_cnt  <= 4'd0;
          clk_cnt <= 16'd0;
       end
       else if(tx_flag) begin
          if(clk_cnt <= BPS_CONT-1) begin 
             clk_cnt <= clk_cnt + 1'd1;
             tx_cnt  <= tx_cnt;
          end 
          else  begin
             clk_cnt <= 16'd0;
             tx_cnt  <= tx_cnt + 1'd1;
          end 
       end  
       else begin
           tx_cnt  <= 4'd0;
           clk_cnt <= 16'd0;
       end 
end 

always @(posedge clk or negedge res) begin
       if(!res) begin
           txd <= 1'b1;
       end
       else if(tx_flag)begin
              case (tx_cnt)
               4'd0: txd <= 1'b0;
               4'd1: txd <= tdata[0];
               4'd2: txd <= tdata[1];
               4'd3: txd <= tdata[2];
               4'd4: txd <= tdata[3];
               4'd5: txd <= tdata[4];
               4'd6: txd <= tdata[5];
               4'd7: txd <= tdata[6];
               4'd8: txd <= tdata[7];
               4'd9: txd <= 1'b1;
               default:;
               endcase 
           end 
       else
           txd  <= 1'b1; 
end 





endmodule

  下边给出顶层模块的代码:

module uart(
     input   sys_clk,
     input   sys_res,
     input   uart_rxd,
     
     output  uart_txd
);

parameter   clk_fre = 50000000;
parameter   uart_bps = 115200;

wire   [7:0] uart_data;
wire         uart_done_en;

uart_receive  #(
     .clk_fre(clk_fre),
     .uart_bps(uart_bps)

) u_uart_receive(
     .clk(sys_clk),
     .res(sys_res),
     
     .rxd(uart_rxd),
     
     .data(uart_data),
     .done(uart_done_en)
);

uart_send  #(
     .clk_fre(clk_fre),
     .uart_bps(uart_bps)

) u_uart_send(
      .clk(sys_clk),
      .res(sys_res),
      
      .data(uart_data),
      .en(uart_done_en),
     
      .txd(uart_txd)
);

endmodule

2.仿真验证

`timescale 1ns/1ns

module tb_uart;

reg          sys_clk;
reg          sys_res;

reg          uart_rxd;
wire         uart_txd;

reg   [0:0]  mem1_16[31:0];
reg   [15:0] clk_cnt;
reg          clk_flag;
parameter   T        = 20;
parameter   clk_fre  = 50000000;
parameter   uart_bps = 115200;
localparam  BPS_CONT = clk_fre/uart_bps;
initial begin
     sys_clk = 1'b0;
     sys_res = 1'b0;
     #(5*T) sys_res = 1'b1;
end  
always #(T/2)  sys_clk  <= ~sys_clk;
initial  begin
	    $readmemb("./data.txt",mem1_16);
end 
initial begin
        uart_rxd = 1'b1;
	    #180 indata(); 
end

always @(posedge sys_clk or negedge sys_res) begin
       if(!sys_res) begin
          clk_cnt <= 16'd0;
          clk_flag <= 1'b0; 
       end
       else begin
          if(clk_cnt <= BPS_CONT-1) begin 
             clk_cnt <= clk_cnt + 1'd1;
	     clk_flag <= 1'b0;
          end 
          else  begin
             clk_cnt <= 16'd0;
	     clk_flag <= 1'b1;
          end 
       end  
      
end 
task indata();
	    integer i;
		begin
		    for(i=0;i<256;i=i+1)
			begin
			    @(posedge clk_flag)
				  uart_rxd <= mem1_16[i[31:0]];
			end 
		end 
	endtask

uart u_uart(

     .sys_clk(sys_clk),
     .sys_res(sys_res),
     .uart_rxd(uart_rxd),
     
     .uart_txd(uart_txd)

);  
endmodule

      上述tb_uart.v文件中通过声明了一个memeory数据类型的寄存器,用于寄存从data.txt文件中读取的数据,data.txt文件中的数据如下图所示:

    下图是Modelsim中得到的仿真结果:

       红色框中给出了uart_recive模块接收到八位数据10010111(先高位后低位),与上述data.txt文件中发送的数据11101001(先低位后高位)一致,说明程序的可执行性。


总结 

        该例子算是我初学FPGA后编写的第一个系统小程序,内容相对比较基础。文章中罗列了一些基本的概念和设计的流程,十分适合初学者学习。初次创作,难免文章中存在错误,希望读者能够及时纠正并给予私信,望大家共同进步!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

三大通信协议(1)UART 的相关文章

  • Jetson nano串口的使用——UART

    UART串口使用两条杜邦线就可以实现数据发送和接收 xff0c 可以很方便的与其他扩展进行数据连接 xff0c 比如微雪的L76X GPS HAT就可以直接连接40Pin的GPIO接口通过UART串口进行数据传递 接下来具体说明Jetson
  • 03-串口(UART)的使用

    目录 第一节 UART概述1 1 UART的用处 xff1a 1 2 UART的优点1 3 UART原理与概念1 4 UART数据传输原理与过程1 5 关于电平转换1 6 UART内部具体机制 第二节 UART编程 第一节 UART概述 1
  • UART、RS232 、RS485 区别

    UART RS232 RS485 区别 UART RS232 RS485这些物理层的串口通信 xff0c 它们都是在同一时间发送一位 RS232 RS485只是串口通讯的变种 xff0c 理解了UART串口通讯 xff0c 那么RS232和
  • 串口、UART、USART、COM、USB、TTL、RS232、RS485、RS422简介

    串口 COM口 USB口是指的物理接口形式 xff08 硬件 xff09 xff1b TTL RS 232 RS 485 USB电平是指的电平标准 xff08 电信号 xff09 串口 UART口 USART口 COM口 USB口 xff0
  • 基于uart的RS232和RS485总线

    我们之前讲uart的时候就已经提过一个问题 xff0c 就是它并不是直接连接到SOC里面的 xff0c 而是经过了一个芯片的转换 这个芯片的转换就是和我们要说的rs232 485总线有关的 RS232和RS485总线其实本质就是uart 只
  • Uart串口收发回环验证

    Uart串口收发回环验证 接受模块发送模块波特率设置模块顶层模块TBModelsim仿真结果板级验证总结 本次所做的项目比较复杂 xff08 对我本人来讲 xff09 xff0c 设计一个Uart IP核 xff0c 在其基础 xff0c
  • WK2114(一个异步串口UART 扩展为4个串口UART)

    WK2114是UART接口的4通道UART器件 WK2114将一个标准3线异步串口 xff08 UART xff09 扩展成为4个增强 功能串口 xff08 UART xff09 主接口UART在数据传输时主接口的UART可以通过引脚配置为
  • UART+DMA数据传输

    DMA的概念 DMA xff08 Direct Memory Access xff09 即直接内存访问 xff0c DMA传输方式无需CPU直接控制传输 xff0c 通过硬件为RAM I O设备开辟一条直接传输数据的通路 xff0c 能使C
  • UART通信中流控RTS和CTS的理解

    一 流控 xff0c 顾名思义就是流量控制的意思 目的是协调收发双方 xff0c 使数据不会丢失 如果UART只有RX TX两个信号 xff0c 要流控的话只能是软流控 xff1b 如果有RX xff0c TX xff0c CTS xff0
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数(作者自己生成的函数代码,中间有关闭接收中断,但是原子教程中没有关闭中断的语句注意区别)

    前言 1 UART Receive IT 2 HAL UART Receive 3 HAL UART Receive IT 前言 看了很长时间串口中断的HAL库 xff0c 最容易混淆的就是函数的名称 xff0c 主要集中在UART Rec
  • UART串口通信协议概述

    1 UART协议介绍 UART是一种通用串行数据总线 xff0c 用于异步通信 UART能实现双向通信 xff0c 在嵌入式设计中 xff0c 常用于主机与辅助设备通信 UART包括RS232 RS449 RS423等接口标准规范和总线标准
  • 一起学nRF51xx 6 - uart

    前言 通用异步接收器 发送器提供快速 全双工 内置流量控制的异步串行通信 CTS RTS 在硬件方面支持高达1Mbps波特率 支持奇偶校验和第9位数据生成 用于每个UART接口线的GPIO可从芯片上的GPIO中任选 而且可独立配置 这使得芯
  • mega328p-ADC,PWM,UART驱动

    ADC驱动 函 数 名 Ai Init 函数功能 Ai端口初始化 输入参数 void 输出参数 void 返 回 值 void 参考文档 void 创 件 人 程强刚 创建日期 2016 02 09 修改历史 void Ai Init vo
  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • ESP32-C3入门教程 基础篇(三、UART模块 — 与Enocean无线模块串口通信)

    测试第三课 ESP32 C3的串口通信测试 老样子 使用Enocean无线模块和ESP32 C3进行串口通信 目录 前言 1 UART示例测试 1 1 UART 基础测试 1 2 与Enocean无线模块串口通信测试 2 ESP32 C3
  • STM32CubeMX HAL库串口+DMA+IDLE空闲中断不定长度数据接收和发送

    本文开发环境 MCU型号 STM32F103ZET6 IDE环境 MDK 5 29 代码生成工具 STM32CubeMx 5 3 0 HAL库版本 STM32Cube FW F1 V1 8 0 STM32Cube MCU Package f
  • UART ISR Tx Rx 架构

    我让事情变得复杂了吗 我正在构建我的代码 以便通过 UART 从 8051 micro 与外围设备进行通信 外设响应主机的命令 一次只能响应一个命令 这是一个简单的发送和接收协议 tx1 rx1 tx2 rx2 tx3 rx3 每个 TX
  • 启用 DMA 的 UART Tx 模式

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 如何将 microbit 与 BLE 连接并监听按钮按下事件?

    2021 年 11 月 28 日编辑 如果您需要使用蓝牙低功耗将 microbit 连接到计算机 并在单击按钮时执行操作 直接跳并跟随 ukBaz https stackoverflow com users 7721752 ukbaz的回答
  • 嵌入式Linux中UART上的9位协议

    我正在尝试在嵌入式 Linux 中的 UART 上强制使用 9 位协议 目前我正在 am335x evm 板上对此进行测试 我计划使用坚持平价来做到这一点 理想情况下 我希望不需要实际修改 omap serial c 驱动程序的任何代码 9

随机推荐

  • Centos8 制作qcow2及使用

    制作及使用方法如下 xff1a 1 下载ios wget https archive kernel org centos vault 8 2 2004 isos x86 64 CentOS 8 2 2004 x86 64 dvd1 iso
  • 免费的期刊论文文献检索网站(收集整理)

    文献免费下载神器 xff0c 这里放5个可以直接下载SCI等论文网站 以下网站去地址栏直接搜 xff01 1 Sci Hub可谓是无人不知无人不晓 xff0c 其自开发以来 xff0c 便以星火燎原之势席卷学术界 xff0c 因为它可以免费
  • k8s 中 pod 之间的通信

    1 pod 内部通信 xff1a 通过 localhost 通信 2 同节点不同 pod 之间通信 xff1a 通过 linux 虚拟以太网设备或者是用两个虚拟接口组成的以太网接口对不同的网络命名空间连接起来通信 3 不同节点的不同 pod
  • 从零写VIO|第二节——作业:使用Allen方差工具标定IMU

    这里写目录标题 作业内容1 安装im utils1 1 安装依赖 xff1a 1 2 编译1 3 可能出的错误 2 运行 2 1 采集IMU数据 2 2 生成imu bag2 3 新建imu launch文件2 4 播放数据2 5 61 6
  • [VIO|实践]UBUNTU16.04跑MSCKF-双目代码

    编译环境 编译 新建文件夹msckf catkin ws xff0c 里面再建一个叫src的文件夹 xff0c 然后把解压好的代码集msckf放进去 命令行进入到 msckf catkin ws这一层 xff0c 进行catkin make
  • 华为系列设备优先级总结(一)

    现整理一部分华为系列交换机 路由器各项配置优先级 xff0c 欢迎各位朋友收藏备查 xff0c 若有遗漏或者是错误 xff0c 也欢迎在评论区提出交流 本文主要适合具有一定基础的网络工程师查阅参考 xff0c 阅读本文 xff0c 需要对本
  • OSPFv3中LSA详解(一)——概述

    今天给大家详细介绍一下OSPFv3中LSA的变化 xff0c 这也是OSPFv3相对于OSPFv2的一大重要改变 本文将详细介绍OSPFv3中9类LSA相对于OSPFv2中7类LSA的异同 阅读本文 xff0c 您需要有一定的OSPFv2和
  • OSPFv3中LSA详解(五)——Intra-Area-Prefix LSA详解

    今天继续给大家介绍OSPFv3中LSA变化 xff0c LSA的变化时OSPFv3相对于OSPFv2的一大重大改变 xff0c 本文的主要内容是OSPFv3中新增的一类LSA Intra Area Prefix LSA的详解 阅读本文 xf
  • OSPFv3中LSA详解(六)——Type3类LSA详解

    今天继续给大家介绍OSPFv3中LSA变化 xff0c LSA的变化时OSPFv3相对于OSPFv2的一大重大改变 xff0c 本文的主要内容是OSPFv3中变化的第三类LSA的详解 阅读本文 xff0c 您需要有一定的OSPF基础知识 x
  • OSPFv3中LSA详解(七)——Type4类LSA详解

    今天继续给大家介绍OSPFv3中LSA变化 xff0c LSA的变化时OSPFv3相对于OSPFv2的一大重大改变 xff0c 本文的主要内容是OSPFv3中变化的第四类LSA的详解 阅读本文 xff0c 您需要有一定的OSPF基础知识 x
  • KVM详解(六)——KVM虚拟机快照

    今天继续给大家介绍Linux运维相关知识 xff0c 本文主要内容是KVM的快照 一 KVM快照简介 KVM支持对虚拟机创建快照 xff0c 但是前提是该虚拟机镜像不可以是raw格式 xff0c 而应该是qcow2格式 但是 xff0c 如
  • Docker详解(十五)——Docker静态IP地址配置

    今天继续给大家介绍Linux运维相关知识 xff0c 本文主要内容是Docker静态IP地址配置 一 安装Docker桥接网络 在前文Docker详解 xff08 十四 xff09 Docker网络类型详解中 xff0c 我们讲解了Dock
  • 计算机硬盘备份和恢复解决方案

    问题背景 xff1a 项目需要提供一份系统使用的计算机硬盘备份和恢复方案 xff0c 方便计算机软硬件故障后快速的恢复系统 之前项目使用的工具是Macrium reflect工具 xff0c 但这个工具现在收费了 xff0c 而且功能比较多
  • Python函数详解(一)——函数的定义、调用及变量

    今天继续给大家介绍Python相关知识 xff0c 本文主要内容是Python函数的定义 调用及变量 一 Python函数的定义与调用 在Python中 xff0c 如果我们要反复的进行一种相同或者类似的代码 xff0c 那么我们就可以将这
  • vscode SSH 保存密码自动登录服务器vs code

    先在win local mac 上拿到公钥和私钥 xff0c 然后再把这公钥copy 进服务器 让ssh 身份认证转化为秘钥认证 xff08 mac也是一样的 xff09 1 创建 RSA 密钥对 第一步是在客户端机器 xff08 通常是您
  • 普罗米修斯

    普罗米修斯 xff08 Prometheus xff09 概述 Prometheus是一套开源的监控 报警 时间序列数据库的组合 xff0c 起始是由SoundCloud公司开发的 从2016年加入CNCF xff0c 2016年6月正式发
  • ROS-mavros-PX4加速度控制

    要写的飞控算法本来的输入是roll pitch以及推进力 xff0c 由于PX4不支持输入具体大小的推进力 xff0c 改用三方向加速度 xff08 可用旋转矩阵进行变换 xff09 进行控制 但是PX4的setpoint accel实际控
  • C# 委托(Delegate)与事件(Event)、Func与Action

    一 委托 1 概念 xff1a 从内存角度看 xff0c 委托是一个存储方法的容器 xff0c 当使用该容器时 xff0c 会把容器里面的方法全部执行一遍 xff0c 容器里面的方法可增 43 61 可减 61 从IL Microsoft中
  • STM32 UART串口通信IDLE空闲中断的使用步骤

    参考了各路大神的资料 xff0c 蒙蔽了半天 xff0c 终于学会了 xff0c 记录一下 xff0c 以后忘了可以回来复习参考 一 首先在stm32cube中配置打开对应uart串口的中断 二 工程main函数调用 HAL UART EN
  • 三大通信协议(1)UART

    目录 一 UART通信协议简介 二 UART通信时序 三 UART RS232 TTL关系阐述 1 简介 2 电平转换 四 实例 1 程序代码 2 仿真验证 总结 一 UART通信协议简介 UART xff08 Universal Asyn