Java实现串口通信,Python串口通讯

  Java实现串口通信,Python串口通讯

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

  UART是一种通用异步收发器,采用异步串行通信。它在发送数据时将并行数据转换为串行数据进行传输,在接收数据时将接收到的串行数据转换为并行数据。

  补充部分串口通讯知识。

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

  UART通信需要两条信号线,一条用于串行传输,另一条用于串行接收。在UART发送或接收过程中,一帧数据由起始位、数据位、奇偶位和停止位四部分组成,如图所示。其中,起始位标志一帧数据的开始,停止位标志一帧数据的结束,数据位为一帧数据中的有效数据。奇偶校验位分为奇奇偶校验位和偶奇偶校验位,用于检查数据传输中是否存在错误。在奇数校验期间,发送方应使数据位中1的数量和校验位中1的数量之和为奇数;接收数据时,接收器检查1的数量。如果不是奇数,说明数据传输过程中有错误。同样,even check检查1的数量是否为偶数。

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

  一般上位机是PC机,UART模块写在FPGA中实现串行通信。主机将数据发送给FPGA,FPGA再将数据发回,其中涉及到并串和串并转换。所以我们主要写三个模块,

  第一个是数据接收模块,接收来自pc机的并行数据,并转换成串行。

  第二个是数据发送模块,将之前收到的数据,从串行发送到并行。

  第三个是环回模块,类似于一个驿站,处理两个模块之间的关系。

  串口接收模块

  从图中可以看出,接收数据时,uart_rxd的起始位先被拉低,第一位不是真实数据。检测到uart_rad的下降沿(在输入信号的上升沿或下降沿检测到Verilog码),从而将start_flag拉高,告知接收模块开始接收数据。start_flag拉高后,rx_flag拉高,表示整个模块正在接收数据,而低电平没有接收数据。

  Clk_cnt是用于记录时钟周期的计数器。如前所述,当波特率为115,200时,传输一个位需要434个周期,每434个周期计为接收一个数据位。Rx_cnt表示总共接收多少位数据,其中最后一位stop_bit,clk_cnt,不需要434个周期,但可能更少。当rx_cnt计数到9,即总共接收到10位数据时,rx_flag变为低电平,uart_done变为高电平,数据传输到uart_data,接收过程结束。

  串口发送模块

  时钟计数器和位计数器与接收模块类似,只是uart_data的数据发送到uart_txd,然后数据发送到PC。

  最后三个模块集成在一起,如图所示,带有特定的代码描述。

  所有模块和tb文件已经打包,欢迎下载。

  https://wws.lanzous.com/iEoIwllkzli

  密码:f7dj

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

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: