10通信入门之串口发送

Posted xwangzi66

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了10通信入门之串口发送相关的知识,希望对你有一定的参考价值。

一设计功能

    通过串口发送端,可以发送一字节的数据。有输入标志信号和发送完成的标志信号进行控制发送过程,核心是发送的时序图。串口发送分成两个部分:串口波特率和串口数据发送。即空闲时的高电平和起始位,八位数据位,停止位。

 

二设计输入

技术图片

下面的程序代码是从上到下,从最基本的时钟开始,分频计数器,分频标志信号,波特率,数据位,和输出数据信号,输出标志信号。

 

module uart_tx
(
input wire sclk,
input wire s_rst_n,
input wire [7:0]pi_data,
input wire pi_flag,
output reg tx
);

reg [3:0]bit_cnt;
reg bit_flag;
//data reg
reg [7:0]data_reg;
always@(posedge sclk or negedge s_rst_n)
if(s_rst_n==0)
data_reg<=8‘b0;
else if(pi_data)
data_reg<=pi_data;
else begin
data_reg<=data_reg;

end


//tx_flag
reg tx_flag;
always@(posedge sclk or negedge s_rst_n)
if(s_rst_n==0)
tx_flag <= 0;
else if(pi_flag)
tx_flag<=1;
else if(bit_cnt==4‘d8 & bit_flag)
tx_flag<=0;
else begin
tx_flag<=tx_flag;
end

//baud counter
parameter cnt_MAX = 13‘d5208;

reg [12:0]cnt_baud;

always@(posedge sclk or negedge s_rst_n)
if(!s_rst_n)
cnt_baud<=13‘d0;
else if(cnt_baud==cnt_MAX)
cnt_baud<=13‘d0;
else if(bit_cnt==4‘d8 & bit_flag)
cnt_baud<=13‘d0;
else if(tx_flag)
cnt_baud<=cnt_baud+1‘b1;

//bit_flag
//波特率标志信号,每计数满一个波特率周期拉高
always@(posedge sclk or negedge s_rst_n)
if(s_rst_n==0)
bit_flag<=1‘b0;
else if(cnt_baud==cnt_MAX)
bit_flag<=1‘b1;
else begin
bit_flag<=0;

end

//bit_cnt
always@(posedge sclk or negedge s_rst_n)
if(s_rst_n==0)
bit_cnt<=4‘d0;
else if(bit_cnt==4‘d8 & bit_flag)
bit_cnt<=4‘d0;
else if(bit_flag)
bit_cnt<=bit_cnt+1‘b1;

always@(posedge sclk or negedge s_rst_n)
if(s_rst_n==0)
tx<=1‘b1;
else begin
case(bit_cnt)
0:tx <=0;
1:tx <=data_reg[0];
2:tx <=data_reg[1];
3:tx <=data_reg[2];
4:tx <=data_reg[3];

5:tx <=data_reg[4];
6:tx <=data_reg[5];
7:tx <=data_reg[6];
8:tx <=data_reg[7];
default:tx <=1;
endcase
end
endmodule

 

 

根据发送时序图,写的串口发送模块。

 

以上是关于10通信入门之串口发送的主要内容,如果未能解决你的问题,请参考以下文章

Qt串口通信开发之QSerialPort模块

ROS串口通信简析(一)——串口发送

STM32串口发送接收数据

51单片机串口通信(字符串接收和发送)

STM32CubeMX之串口配置

Arduino和C51之串口通信