串口UART

2023-05-16

目录

串口概念

串口rs232 

数据格式

注意事项 

总体结构图 

代码verilog 

接收模块 

结构图 

 波形图​​​​​​​​编辑

代码 verilog

发送模块 

结构图

 波形图

代码 verilog

串口rs485


串口概念

  • 串口是异步串行通信接口,spi和iic是同步串行通信接口
  • 同步表示收发双方在一个时钟下,发送时包含数据和时钟信号,数据和时钟是同步的;
  • 异步表示收发双方不同时钟下,发送时只需要发送数据,不需要时钟信号,根据起始位和停止位进行数据的同步,异步接收

串口rs232 

全双工通信

信号采用单端传输方式

缺点:传输距离近和传输速度慢

优点:都有com口,方便使用

波特率:每秒钟传输码元的个数 baus Bps 码元:一个二进制位 常用:4800 9600 115200

比特率:每秒钟传输bit数  比特率=波特率*单个调制状态对应二进制数 bps

单端传输:使用一根信号线,通过与地信号比较来区分逻辑0,1;

数据格式

共10bit的数据,其中起始位1bit,8bit的数据位,停止位1bit 

注意事项 

数据接受模块需要进行寄存器打拍,因为数据与时钟不同步,会出现亚稳态

亚稳态:信号在进入寄存器时的建立时间和保持时间不满足条件(信号 是必须稳定的才满足)导致的

危害:亚稳态会一直向下传播,组合逻辑是无法消除的

解决:多级寄存器,因为寄存器会减缓亚稳态 一般两级打拍

 Tco:寄存器延迟 Tmet:决断时间

总体结构图 

代码verilog 

module AX301_rs232(
    input clk,
	 input rst_n,
	 input rx,
	 
	 output tx
);	 
wire [7:0] po_data;
wire po_flag;

rs232_rx
#(
  .uart_Bps   ('d9600),
  .clk_fre    ('d50_000_000)
)
rs232_rx_inst
(
   .clk   (clk),
	.rst_n (rst_n),
	.rx           (rx),
	
	.po_data      (po_data),
	.po_flag      (po_flag)
);

rs232_tx
#(
  .uart_Bps   ('d9600),
  .clk_fre    ('d50_000_000)
)
rs232_tx_inst
(
   .clk   (clk),
	.rst_n (rst_n),
	.po_data      (po_data),
	.po_flag      (po_flag ),     
	
	.tx      (tx)
);
endmodule

接收模块 

结构图 

 波形图​​​​​​​

代码 verilog

module rs232_rx
#(
   parameter uart_Bps = 'd9600,
	parameter clk_fre = 'd50_000_000
)
(
   input clk,
	input rst_n,
	input rx,
	
	output reg po_flag,
	output reg [7:0] po_data
);
parameter max_cnt = clk_fre / uart_Bps;
reg rx_reg1,rx_reg2,rx_reg3;
reg work_en;
reg [15:0] bps_cnt;
reg bit_flag;
reg [3:0] bit_cnt;
reg [7:0] rx_data;
reg rx_flag;

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
      rx_reg1 <= 1'b1;
	else 
	   rx_reg1 <= rx;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
      rx_reg2 <= 1'b1;
	else 
	   rx_reg2 <= rx_reg1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
      rx_reg3 <= 1'b1;
	else 
	   rx_reg3 <= rx_reg2;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	   work_en <= 1'b0;
   else if(rx_reg2 == 1'b0 && rx_reg3 == 1'b1)
	   work_en <= 1'b1;
   else if(bit_cnt ==4'd8 && bit_flag ==1'b1)
	   work_en <=1'b0;
	else 
	   work_en <= work_en;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bps_cnt <= 16'd0;
	else if(work_en == 1'b0 || bps_cnt == max_cnt - 1)
	  bps_cnt <= 16'd0;
	else 
	  bps_cnt <= bps_cnt + 16'd1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bit_flag <= 1'b0;
	else if(bps_cnt == max_cnt/2 - 1)
	  bit_flag <= 1'b1;
	else 
	  bit_flag <= 1'b0;
end		

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bit_cnt <= 4'd0;
	else if(bit_cnt ==4'd8 && bit_flag ==1'b1)
	  bit_cnt <= 4'd0;
	else if(bit_flag ==1'b1)
     bit_cnt <= bit_cnt + 4'd1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  rx_data <= 8'b0;
	else if(bit_cnt >= 4'd1 && bit_cnt <=4'd8 && bit_flag == 1'b1)
	  rx_data <= {rx_reg3,rx_data[7:1]};
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  rx_flag <= 1'b0;
	else if(bit_cnt ==4'd8 && bit_flag == 1'b1)
	  rx_flag <= 1'b1;
	else 
	  rx_flag <= 1'b0;
end 

always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
	  po_data<=8'b0;
	else if(rx_flag==1'b1)
	  po_data<=rx_data;
end

always @(posedge clk or negedge rst_n)
begin
	if(!rst_n)
	  po_flag<=1'b0;
	else 
	  po_flag<=rx_flag;
end
endmodule

发送模块 

结构图

 波形图

代码 verilog

module rs232_tx
#(
   parameter uart_Bps = 'd9600,
	parameter clk_fre = 'd50_000_000
)
(
   input clk,
	input rst_n,
	input [7:0] po_data,
	input po_flag,
	
	output reg tx
);

parameter max_cnt = clk_fre / uart_Bps;
reg work_en;
reg [15:0] bps_cnt;
reg bit_flag;
reg [3:0] bit_cnt;

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  work_en <= 1'b0;
	else if(po_flag == 1'b1)
	  work_en<=1'b1;
	else if(bit_cnt == 4'd9 &&bit_flag == 1'b1)
	  work_en <= 1'b0;
	else 
	  work_en <= work_en;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bps_cnt <= 16'd0;
	else if(work_en == 1'b0 || bps_cnt == max_cnt - 1)
	  bps_cnt <= 16'd0;
	else 
	  bps_cnt <= bps_cnt + 16'd1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bit_flag <= 1'b0;
	else if(bps_cnt == 16'd1)
	  bit_flag <= 1'b1;
	else 
	  bit_flag <= 1'b0;
end	

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  bit_cnt <= 4'd0;
	else if(bit_cnt ==4'd9 && bit_flag ==1'b1)
	  bit_cnt <= 4'd0;
	else if(bit_flag ==1'b1)
     bit_cnt <= bit_cnt + 4'd1;
end

always@(posedge clk or negedge rst_n)begin
   if(!rst_n)
	  tx <=1'b1;
	else if(bit_flag == 1'b1)
	  case(bit_cnt)
	     0: tx<=1'b0;
		  1: tx<=po_data[0];
		  2: tx<=po_data[1];
		  3: tx<=po_data[2];
		  4: tx<=po_data[3];
		  5: tx<=po_data[4];
		  6: tx<=po_data[5];
		  7: tx<=po_data[6];
		  8: tx<=po_data[7];
		  9: tx<=1'b1;
		  default: tx<=1'b1;
    endcase
end
endmodule

串口rs485

  • 半双工通信
  • 信号采用差分传输方式
  • 允许多个驱动器和接收器挂在总线上,其中每个驱动器都能够脱离总线。
  • 优点:rs485相对于rs232抗干扰能力强,传输距离远,因为rs485上有收发器,可以检测到200mv的电压,最远通信距离可以达到1200m左右,速度可以达到10Mb/s
  • 差分传输:使用两根信号线进行传输,两个信号相位相反,幅值相同,通过两根信号的电压差值判断是逻辑0还是1,抗干扰能力强;
  • rs485相对于rs232抗干扰能力强,传输距离远,因为rs485上有收发器,可以检测到200mv的电压,最远通信距离可以达到1200m左右,速度可以达到10Mb/s
  • 具体代码实现同RS232相同
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

串口UART 的相关文章

  • STM32串口接受和发送数据的程序(USART/UART)

    本实验中 STM32通过串口1和串口2上位机对话 xff0c STM32通过串口1在收到上位机发过来的字符串 以回车换行结束 后 xff0c 通过串口2原原本本的返回给上位机 串口 xff08 USART UART xff09 通信配置详解
  • UART、IIC、SPI、CAN通信的区别与应用

    文章目录 1 通信的基本知识1 1 数据通信的种类1 1 1 串行通信1 1 2 并行通信1 1 3 总结 1 2 数据通信的传输方向1 2 1 单工1 2 2 半双工1 2 3 全双工1 2 4 总结 1 3 数据通信的方式1 3 1 同
  • UART详解

    UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART 是一种异步全双工串行通信协议 xff0c 它将要传输的资料在串行通信与并行通信之
  • UART通信协议

    UART通信协议 一 UART是什么 xff1f 1 同步串口通信 vs 异步串口通信2 串行通信 二 通信协议三 工作原理四 特点 一 UART是什么 xff1f 通用异步收发传输器 xff08 Universal Asynchronou
  • UART, IIC, SCI, SPI, 232, 485, 422, CAN, SDIO, GPIO, MODBUS, TCP/IP汇总简介

    UART IIC SCI SPI 232 485 422 CAN SDIO GPIO MODBUS TCP IP汇总简介 UART xff1a Universal Asynchronous Receiver Transmitter xff1
  • UART,SPI,IIC,RS232通信时序和规则

    一 UART 1 串口通信方式 2 串口通信步骤 注意 xff1a 串口协议规定 xff0c 闲置时必须是高电平 校验位 xff1a 是使用奇偶校验 停止位必须高电平 一个0和多个0区分是靠掐时间 异步通信 xff1a 时钟各不一样 二 I
  • UART串口通信

    串口是 串行接口 的简称 xff0c 即采用串行通信方式的接口 串行通信将数据字节分成一位一位的形式在一条数据线上逐个传送 xff0c 其特点是通信线路简单 xff0c 但传输速度较慢 因此串口广泛应用于嵌入式 工业控制等领域中对数据传输速
  • GD32E23x的USART被断点打断后重新运行,会一直进入中断的问题

    GD32E23x的USART被断点打断后重新运行 会一直进入中断的问题 GD32E230K8单片机USART0连接一个从机芯片 该芯片每100ms发来一串16Bytes的数据 MCU中断接收 没有开启FIFO 只开启了RBNE 接收缓存非空
  • UART通信原理

    UART 通信格式 串口全称叫做串行接口 通常也叫做 COM 接口 串行接口指的是数据一个一个的顺序传输 通信线路简单 使用两条线即可实现双向通信 一条用于发送 一条用于接收 串口通信距离远 但是速度相对会低 串口是一种很常用的工业接口 I
  • STM32双串口

    STM32双串口的使用 最近老是需要stm32通过串口去跟WiFi模块 蓝牙模块 openmv进行数据交互 然后需要用到stm32的串口调试 就把这个程序整理成一个工程 方便调试 实验目的 外设模块 WiFi模块 蓝牙模块 openmv 发
  • UART串口协议

    通用异步收发传输器 Universal Asynchronous Receiver Transmitter 通常称作UATR 是一种异步收发传输器 将数据由串行通信与并行通信间做传输转换 作为并行输入称为串行输出的芯片 UART是一种通用串
  • 以字符串形式接收数字(uart)

    我正在尝试通过 uart 接收一个包装为字符串的数字 我发送数字 1000 所以我得到 4 个字节 空字符 但是 当我使用 atoi 将数组转换为数字并将整数与 1000 进行比较时 我并不总是得到正确的数字 这是我用于接收号码的中断处理函
  • 从 Linux 用户空间设置 16550A UART 硬件 FIFO 中断级别

    我目前正在使用 16550 兼容的 UART 并且我希望能够更改 FIFO 中断触发级别 我在高 UART 负载下丢失字节 并且我想降低阈值 这是一个动力不足的嵌入式系统 当然 如果我愿意 我可以在 8250 port c 驱动程序中更改它
  • IOError:[Errno 2]没有这样的文件或目录(当它确实存在时)Python [重复]

    这个问题在这里已经有答案了 我正在通过 python 中的 uart 传输文件文件夹 下面您可以看到简单的功能 但有一个问题 因为我收到如标题所示的错误 IOError Errno 2 No such file or directory 1
  • 英特尔伽利略裸机 UART

    我想编写一些 hello world 程序裸机申请于英特尔伽利略木板 当然 使用 UEFI 打印文本 到 UART 1 效果很好 但我想 手动 访问 UART 而不需要 UEFI 的任何帮助 在 QEMU 中我的代码运行良好 h file
  • 使用 read(...) 时在换行符处停止

    我需要从通过 UART 连接的 GPS 读取 NMEA 语句 操作系统是Debian 语言必须是C 为此 我使用以下命令打开文件open 并读取一个字符串read 但是 这样我必须指定字符串长度 这会分解句子 相反 我想读到 NMEA 句子
  • GATT 配置文件和 UART 服务

    我是开发通过蓝牙连接到外围设备的移动应用程序的新手 我搜索到 GATT 是用于蓝牙LE 通信的相关配置文件 但我们的客户建议我们使用 UART 服务 现在我很困惑 1 这两件事是如何关联的 2 我们是否必须选择其中之一 如果是的话 每一个的
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过
  • 如何检测来自 QNX 中 ncurses 的屏幕调整大小事件?

    我无法配置为接收有关使用 ncurses QNX Momentics 更改终端大小的事件 我使用Putyy作为终端 通过COM端口传输数据 我的问题是如何实现使用远程终端时接收屏幕变化事件 FILE fcons fopen dev ser1
  • Android Things 5​​.1 - 9 位 UART

    我正在尝试使用 Android Things 支持 9 位 UART 当我尝试将数据大小设置为 9 时 我收到 IO 异常 唯一有效的配置是 7 位和 8 位 我知道可以使用奇偶校验错误中断进行 9 位模拟 但在 Android 上 我没有

随机推荐

  • 使用keil软件添加.C文件和.H文件到工程

    使用keil软件添加 C文件和 H文件到工程 1 第一步 在所建工程的文件夹下的HARDWARE子文件夹下创建一个所要添加文件名称 xff0c 例如要添加led c和led h文件 xff0c 可以先在HARDWARE文件目录下创建一个命名
  • STL常用容器——String容器的使用

    文章目录 STL常用容器 String容器1 string构造器2 string的赋值操作3 拼接字符串4 字符串查找和替换5 字符串比较6 字符串存取7 字符串插入与删除8 截取字符串 STL常用容器 String容器 string类封装
  • STL常用容器——vector容器的使用

    文章目录 STL常用容器 vector容器的使用1 vector容器概念2 vector容器构造方式3 vector赋值操作4 vector容量 capacity 和大小 size 的区别5 vector添加和删除6 vector数据存取
  • STL常用容器——deque容器的使用

    文章目录 STL常用容器 deque容器的使用1 deque 容器简介2 deque容器的构造函数3 deque的赋值操作4 deque大小操作5 deque容器添加和删除元素6 deque容器访问元素7 容器内元素排序 STL常用容器 d
  • STL常用容器——stack容器的使用

    文章目录 STL常用容器 stack容器的使用1 stack容器介绍2 stack容器常用接口 STL常用容器 stack容器的使用 1 stack容器介绍 stack容器简介 stack容器是堆栈容器 xff0c 该容器具有先进后出的特性
  • STL常用容器——queue容器的使用

    文章目录 STL常用容器 queue容器的使用1 queue容器的介绍2 queue容器常用接口2 1 queue容器构造函数2 2 queue队列容器常用的成员函数 STL常用容器 queue容器的使用 1 queue容器的介绍 queu
  • STL常用容器—— list 容器的使用

    文章目录 STL常用容器 list 容器的使用1 list 容器介绍2 list容器的构造函数3 list容器的赋值和交换4 list容器大小操作5 list容器添加和删除元素操作6 list容器数据存取7 list容器反转和排序 STL常
  • STL常用容器——set容器的使用

    文章目录 STL常用容器 set容器的使用1 set容器简介2 set容器的构造和赋值3 set容器的大小和交换4 set容器的添加与删除5 set容器的查找与统计6 pair类模板7 set和multiset的区别8 set容器的排序 S
  • STL常用容器——map容器的使用

    文章目录 STL常用容器 map容器的使用1 map容器介绍2 map容器构造和赋值3 map容器大小和交换4 map容器的添加和删除4 1 insert插入数据的四种方式4 2 删除键值对 5 map容器查找和统计6 map容器排序 ST
  • STL常用算法——遍历算法

    文章目录 STL常用算法 遍历算法1 for each 2 transform STL常用算法 遍历算法 1 for each for each xff1a 遍历容器 xff0c 对容器中的每一个元素调用函数或函数对象 函数原型 xff1a
  • STL常用算法——查找算法

    文章目录 STL常用算法 查找算法1 find 2 find if 3 adjacent find 4 binary search 5 count 和count if 5 1 count 5 2 count if STL常用算法 查找算法
  • 视觉识别示例-海康威视

    视觉识别示例 海康威视 C Program Files x86 MVS Development Documentations1 在海康威视软件MVS xff0c 默认安装目录下有示例及说明 xff0c 如上图是示例说明 C Program
  • STL常用算法——排序算法

    文章目录 STL常用算法 排序算法1 sort 2 random shuffle 3 merge 4 reverse STL常用算法 排序算法 1 sort sort xff1a 对容器或普通数组中范围内的元素进行排序 xff0c 默认进行
  • STL常用算法——拷贝和替换算法

    文章目录 STL常用算法 拷贝和替换算法1 copy 2 replace 3 replace if 4 swap STL常用算法 拷贝和替换算法 1 copy copy 函数 xff1a 将源容器内指定范围的元素拷贝到目的容器中 函数原型
  • STL常用算法——算术生成算法和集合算法

    文章目录 STL常用算法 算术生成算法和集合算法1 算术生成算法1 1 accumulate 1 2 fill 和fill n 2 集合算法2 1 set intersection 2 2 set union 2 3 set differe
  • CompletableFuture的使用

    文章目录 1 Future2 CompletableFuture 并行 xff0c 并发 并发 xff1a 一个实体上 xff0c 多个任务有序执行 并行 xff1a 多个实体上 xff0c 多个任务同时执行 用户线程 用户线程是系统的工作
  • 将本地jar添加到Maven仓库

    一 将jar添加到本地仓库的做法 xff1a 以下面pom xml依赖的jar包为例 xff1a 实际项目中pom xml依赖写法 xff1a html view plain copy lt dependency gt lt groupId
  • nodejs如何实现Digest摘要认证?

    文章目录 1 前言2 原理3 过程4 node实现摘要认证5 前端如何Digest摘要登录认证 xff08 下面是海康的设备代码 xff09 1 前言 根据项目需求 xff0c 海康设备ISAPI协议需要摘要认证 xff0c 那么什么是摘要
  • HAL库中断方式进行串口通信

    目录 一 通过CubeMX配置项目 二 在keil配置代码 三 烧录运行 四 输出 五 总结 六 参考链接 一 通过CubeMX配置项目 二 在keil配置代码 main函数中的while循环里面添加传输代码 if flag 61 61 1
  • 串口UART

    目录 串口概念 串口rs232 数据格式 注意事项 总体结构图 代码verilog 接收模块 结构图 波形图 编辑 代码 verilog 发送模块 结构图 波形图 代码 verilog 串口rs485 串口概念 串口是异步 串行通信接口 x