首页 > 编程知识 正文

java实现串口通信,python实现串口通信

时间:2023-05-03 23:10:24 阅读:241661 作者:4974

串行通信分为两种方式:同步串行通信和异步串行通信。 同步串行通信需要通信双方在同一时钟的控制下,同步传输数据;异步串行通信是指通信双方使用各自的时钟控制数据的发送和接收过程。

UART 是一种采用异步串行通信方式的通用异步收发传输器(universal asynchronous receiver-transmitter),它在发送数据时将并行数据转换成串行数据来传输,在接收数据时将接收到的串行数据转换成并行数据。

补充一部分串口通信知识

在学习串口通信知识时候,我们会看到波特率名词定义。波特率:每秒传输二进制数据的位数,单位bps。本实验采用的波特率是115200 。也就是一秒钟需要传输115200个bit位的数据。那么可以得到,传输一个bit位需要多少时钟周期,不是一个周期传一个bit位,那么传输1bit位需要,1s=10e9ns/115200ns,对于时钟周期是50M来说,传输1bit数据需要,10e9ns/115200ns/(1/50M)=434,所以传输1bit需要434个时钟周期。

UART 串口通信需要两根信号线来实现, 一根用于串口发送,另外一根负责串口接收。 UART 在发送或接收过程中的一帧数据由 4 部分组成,起始位、数据位、奇偶校验位和停止位,如图所示。其中,起始位标志着一帧数据的开始,停止位标志着一帧数据的结束, 数据位是一帧数据中的有效数据。 校验位分为奇校验和偶校验, 用于检验数据在传输过程中是否出错。 奇校验时, 发送方应使数据位中 1 的个数与校验位中 1 的个数之和为奇数;接收方在接收数据时, 对 1 的个数进行检查,若不为奇数,则说明数据在传输过程中出了差错。 同样,偶校验则检查 1 的个数是否为偶数。


一般基于UART的传输形式如下

上位机一般是PC,在FPGA端写UART模块实现串行通信。上位机发送数据给FPGA,然后FPGA发送数据回来,其中涉及并转串行,串转并行。所以我们主要写三个模块,
第一个是接收数据模块,接收来自pc的并行数据,并行转成串行
第二个是发送数据模块,发送之前接收到的数据,串行变并行
第三个是环回模块,类似一个驿站,处理两个模块之间的关系

串口接收模块

由图可知,当接收数据时,uart_rxd起始位先拉低,第一位不是真正的数据。检测uart_rad的下降沿,(输入信号上升沿或者下降沿检测 Verilog代码)使得start_flag拉高,此为告诉接收模块开始接收数据,start_flag拉高后,拉高rx_flag,此为代表整个模块是接收数据状态,低电平则为不是接收数据状态。
clk_cnt为记录时钟周期计数器,之前说到,波特率115200换算一下传输一个bit位需要434个周期,每434算接收一个数据位。rx_cnt代表一共接收了多少位数据,其中最后一位stop_bit那个,clk_cnt不一定需要到434个周期,可以更少。当rx_cnt数到9时候,也就是一共接收了10bit个数据,rx_flag拉低,uart_done拉高,数据传输到uart_data,一个接收过程结束。

串口发送模块

其中时钟计数器和位计数器和接收模块类似,不同的是uart_data的数据发送给uart_txd,然后此数据再发送给PC。

最后三个模块综合后如图,具体有代码说明

所有模块和tb文件已经打包,欢迎下载
https://wws.lanzous.com/iEoIwllkzli
密码:f7dj

感谢正点原子达芬奇开发板资料!

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。