Uart串口收发回环验证

2023-05-16

Uart串口收发回环验证

    • 接受模块
    • 发送模块
    • 波特率设置模块
    • 顶层模块
    • TB
    • Modelsim仿真结果
    • 板级验证
    • 总结

本次所做的项目比较复杂(对我本人来讲),设计一个Uart IP核,在其基础,封装axi接口,使其成为面向AXI口的IP,再例化个microblaze作为主机,使microblaze与Uart之间通过AXI总线进行通信。具体模块图如下,包含主机microblaze,主接口模块,从接口模块,从机Uart。

在这里插入图片描述
本文首先介绍Uart基本模块。该顶层模块包含接受模块、发送模块、发送波特率设置模块、接受波特率设置模块。为了方便验证,我们将接受模块与发送模块连接,采用回环的形式。

接受模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2019/05/24 16:58:41
// Design Name: 
// Module Name: uart_rx
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module uart_rx(
    clk,
    rst_n,
    Rs232_rx,
    bps_clk,
    rx_data,
    rx_int,
    bps_start
    );
    input clk;
    input rst_n;
    input bps_clk;
    input Rs232_rx;
    output [7:0] rx_data;
    output reg rx_int;
    output reg bps_start;
    
    reg Rs232_rx0,Rs232_rx1,Rs232_rx2,Rs232_rx3;
    wire neg_edge;
    reg [3:0] num;
    
    reg [7:0] rx_data_t1; 
    reg [7:0] rx_data_t2;
     
    always@(posedge clk or negedge rst_n)
        if(!rst_n) begin 
            Rs232_rx0 <= 1'b1;
            Rs232_rx1 <= 1'b1;
            Rs232_rx2 <= 1'b1;
            Rs232_rx3 <= 1'b1;
        end
        else begin
            Rs232_rx0 <= Rs232_rx;
            Rs232_rx1 <= Rs232_rx0;
            Rs232_rx2 <= Rs232_rx1;
            Rs232_rx3 <= Rs232_rx2;    
        end
    assign neg_edge = Rs232_rx3 & Rs232_rx2 & ~Rs232_rx1 & ~Rs232_rx0;
    
    always@(posedge clk or negedge rst_n)
    if(!rst_n) begin
        bps_start <= 1'b0;
        rx_int <= 1'b0;
    end
    else if (neg_edge) begin 
        bps_start <= 1'b1;
        rx_int <= 1'b1;
    end
    else if (num == 4'd10) begin
        bps_start <= 1'b0;
        rx_int <= 1'b0;  
    end 
   
   always@(posedge clk or negedge rst_n)
   if(!rst_n) begin
        rx_data_t1 <= 8'd0; 
        rx_data_t2 <=8'd0;
        num <= 4'd0;
   end
   else if(rx_int) begin 
    if (bps_clk) begin 
        num <= num+1'b1;
        case(num)
            4'd1: rx_data_t1[0] <= Rs232_rx;
            4'd2: rx_data_t1[1] <= Rs232_rx;
            4'd3: rx_data_t1[2] <= Rs232_rx;
            4'd4: rx_data_t1[3] <= Rs232_rx;
            4'd5: rx_data_t1[4] <= Rs232_rx;
            4'd6: rx_data_t1[5] <= Rs232_rx;
            4'd7: rx_data_t1[6] <= Rs232_rx;
            4'd8: rx_data_t1[7] <= Rs232_rx;
            default:;
        endcase 
     end
   end       
  else if(num >= 4'd9) begin 
    num <= 4'd0;
    rx_data_t2 <= rx_data_t1;
  end
 assign  rx_data = rx_data_t2;  
             
endmodule

发送模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2019/05/24 15:39:09
// Design Name: 
// Module Name: uart_tx
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module uart_tx(
    clk,
    rst_n,
    tx_int,
    rx_data,
    bps_clk,
    Rs232_tx,
    bps_start
    );
    input clk;
    input rst_n;
    input tx_int;
    input [7:0] rx_data;
    input bps_clk;
    output Rs232_tx;
    output bps_start;
    
    reg tx_int0;
    reg tx_int1;
    reg tx_int2;
    wire neg_edge;
    
    (* keep = "true" *) reg en;
    reg [3:0] num;
    reg bps_start_t;
    //reg [7:0] rx_data_t;
    
    reg Rs232_tx_t;
   
    
    always@(posedge clk or negedge rst_n)
        if(!rst_n) begin 
            tx_int0 <= 1'b0;
            tx_int1 <= 1'b0;
            tx_int2 <= 1'b0;
        end
        else begin
            tx_int0 <= tx_int;
            tx_int1 <= tx_int0;
            tx_int2 <= tx_int1;
        end   
    assign neg_edge = tx_int2 & ~tx_int1;
     
    always@(posedge clk or negedge rst_n)
        if(!rst_n) begin 
            en <= 1'b0;
            bps_start_t <= 1'b0;
        end
        else if (neg_edge) begin
            en <= 1'b1;
            bps_start_t <= 1'b1;
            //rx_data_t <= rx_data;
        end    
        else if (num == 4'd10) begin
            en <= 1'b0;
            bps_start_t <= 1'b0;  
        end
    assign bps_start = bps_start_t;
    
    always@(posedge clk or negedge rst_n)
        if(!rst_n) begin 
            Rs232_tx_t <= 1'b1;
            num <= 12'd0;
        end
        else if (en) begin 
            if (bps_clk) begin 
                case (num) 
                    4'd0: Rs232_tx_t <= 1'b0;
                    4'd1: Rs232_tx_t <= rx_data[0];
                    4'd2: Rs232_tx_t <= rx_data[1];
                    4'd3: Rs232_tx_t <= rx_data[2];
                    4'd4: Rs232_tx_t <= rx_data[3];
                    4'd5: Rs232_tx_t <= rx_data[4];
                    4'd6: Rs232_tx_t <= rx_data[5];
                    4'd7: Rs232_tx_t <= rx_data[6];
                    4'd8: Rs232_tx_t <= rx_data[7];
                    4'd9: Rs232_tx_t <= 1'b1;
                    default: Rs232_tx_t <= 1'b1;
                endcase
                num <= num +1'b1;  
            end   
        end        
        else if(num == 4'd10) begin
             num <= 1'b0;       
        end      
        
        assign Rs232_tx = Rs232_tx_t;
        
                     
endmodule

波特率设置模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2019/05/24 15:06:47
// Design Name: 
// Module Name: speed_set
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module speed_set(
    bps_start,
    clk,
    rst_n,
    bps_clk
    );
    input bps_start;
    input clk;
    input rst_n;
    output reg bps_clk;
    (* keep = "true" *) reg [12:0] cnt;
    
    `define BPS_NUM 5207
    `define BPS_NUM_2 2306
    
 
    always@(posedge clk or negedge rst_n)
    if (!rst_n)
        cnt <= 13'd0;
    else if (cnt == `BPS_NUM ||  !bps_start)
        cnt <= 13'd0;
    else 
        cnt <= cnt + 1'b1;
        
        
    always@(posedge clk or negedge rst_n)
    if(!rst_n)
        bps_clk <= 1'b0;
    else if (cnt == `BPS_NUM_2)
        bps_clk <= 1'b1;
    else 
        bps_clk <= 1'b0;
        

endmodule

顶层模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: 
// 
// Create Date: 2019/05/27 10:00:56
// Design Name: 
// Module Name: uart_top
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//


module uart_top(
    clk_p,
    clk_n,
    rst_n,
    Rx,
    Tx
    );
    input clk_p;
    input clk_n;
    input rst_n;
    input Rx;
    output Tx;
    
    wire clk_50m;
    wire bps_clk_tx;
    wire bps_clk_rx;
    wire bps_start_tx;
    wire bps_start_rx;
    wire [7:0] rx_data;
    wire int;
    
    
    clk_wiz_0 instance_name
       (
        // Clock out ports
        .clk_50m(clk_50m),     // output clk_50m
        // Status and control signals
        .resetn(rst_n), // input resetn
       // Clock in ports
        .clk_in1_p(clk_p),    // input clk_in1_p
        .clk_in1_n(clk_n));    // input clk_in1_n
    
    
    speed_set speed_tx(
        .bps_start(bps_start_tx),
        .clk(clk_50m),
        .rst_n(rst_n),
        .bps_clk(bps_clk_tx)
        );        
    uart_tx uart_tx(
        .clk(clk_50m),
        .rst_n(rst_n),
        .tx_int(int),
        .rx_data(rx_data),
        .bps_clk(bps_clk_tx),
        .Rs232_tx(Tx),
        .bps_start(bps_start_tx)
        );
    speed_set speed_rx(
        .bps_start(bps_start_rx),
         .clk(clk_50m),
         .rst_n(rst_n),
         .bps_clk(bps_clk_rx)
         );
    uart_rx uart_rx(
        .clk(clk_50m),
        .rst_n(rst_n),
        .Rs232_rx(Rx),
        .bps_clk(bps_clk_rx),
        .rx_data(rx_data),
        .rx_int(int),
        .bps_start(bps_start_rx)
        );
endmodule

TB

`timescale 1ns / 1ps
`define clock_period 20
//
// Company: 
// Engineer: 
// 
// Create Date: 2019/05/27 10:38:22
// Design Name: 
// Module Name: uart_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//



module Uart_tb;
    reg clk_p;
    reg clk_n;
    reg rst_n;
    reg Rx;
    wire Tx;
    
            
    uart_top uart_top(
         .clk_p(clk_p),
         .clk_n(clk_n),
         .rst_n(rst_n),
         .Rx(Rx),
         .Tx(Tx)
    );
    
    initial clk_p = 0;
    always #2.5 begin 
        clk_p = ~clk_p;
        clk_n = ~clk_p;
    end
    initial begin
        Rx = 1'b1; 
        rst_n = 1'b0;
        #(`clock_period*20);
        rst_n = 1'b1;
        #(`clock_period*52080);
        
        //起始位
        Rx = 1'b0;       
        #(`clock_period*5208);
        
        //数据位
        Rx = 1'b1;  
        #(`clock_period*5208);
        Rx = 1'b0; 
        #(`clock_period*5208);
        Rx = 1'b0; 
        #(`clock_period*5208);
        Rx = 1'b0; 
        #(`clock_period*5208);
        
        Rx = 1'b1; 
        #(`clock_period*5208);
        Rx = 1'b0; 
        #(`clock_period*5208);
        Rx = 1'b0; 
        #(`clock_period*5208);
        Rx = 1'b0; 
        #(`clock_period*5208);
        
        //停止位
        Rx = 1'b1; 
        #(`clock_period*5208); 
        
         Rx = 1'b1; 
         #(`clock_period*52080); 
    end
   
endmodule

Modelsim仿真结果

在这里插入图片描述

板级验证

在这里插入图片描述在这里插入图片描述

总结

本项目Uart设计没有什么难度,基本原理在看完Uart之后spe之后基本了解,再加上之前有点底子,在代码表写上很快完成。但由于Vivado工具使用不熟练,导致花费大量时间,尤其在debug调试之后生成ILA核,抓取的波形不知道怎么看,自己摸索始终不会,最终还是在 老同志的帮助下知道了怎么回事,一方面感谢,另一发方面感概其其奇妙之后,感觉在数字芯片这么难之下下,我们工程师(妄称)还是要多多交流,这样才能共同进步。终极学习法费曼学习法不是说了吗,学习最快的途径是教会一个外行人,你教别人的同时自己也在快速成长。另外自身而言,实在琢磨不出在,还是问问别人,又是你半天搞不出来,一问就回了,提高效率不是。
扯哪去了,回归正题。在前期写好代码之后,兴致勃勃地仿真还通过了,感觉没啥问题,直接上板子烧入,之后崩了,没有结果。前期以为串口工具有问题,想不到还真有问题,板子上USB口接错了,COM口出错,小白尽是犯这种低级错误啊。改完之后重新烧入,还是不行,心态有点炸。实在没办法请教了大神,让我用debug来找出代码那不对,刚开始我始终不以为意,认为仿真通过我写的代码肯定没问题,肯定是其他硬件问题。再加上我debug不会用,浪费了大量时间。在慢慢琢磨与请教之后,发现了问题(前方高能):
1.我在一个always进程中对一个变量赋值之前,没有对其进行复位(TX模块的bps_start_t),导致仿真出现红线未知态。不过这不是主要问题
2.也是tx模块中我竟然多num信号在两个进程中同时对其赋值,明显不过的代码错误,但是综合尽然通过了,什么鬼
总结:
在那个alway进程中间对所有变量赋值之前,现在Rst中对所有进行复位
不要感觉没有错误仿真通过就感觉代码没问题,万事大吉EDA也不是万能的,错误看完的看看警告。
对变量进行暂存再赋值是将reg型变量变为wire型。如果其他进程用到了就不需要转变,只是偶尔输出时需要转变。

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

Uart串口收发回环验证 的相关文章

  • 【IoT开发】UART通信高频测试

    测试所使用芯片 STM32F103RCT6 UART收发的极限频率 xff1a bytes s 1 发送频率 主程序循环发送一字节u8整型 xff0c 记录次数 while 1 t 43 43 if t 61 61 255 t 61 0 p
  • 【FPGA】UART串口通信

    文章目录 一 通信方式1 串行通信2 并行通信 二 UART串口通信1 模块设计与时序图2 代码实现 三 测试结果1 仿真结果2 上板验证 一 通信方式 1 串行通信 串行通信是指利用一条传输线将数据一位位地顺序传送 xff08 也就是说串
  • UART

    一 S3C2410内置的UART控制器 S3C2410内部具有3个独立的UART控制器 xff0c 每个控制器都可以工作在Interrupt xff08 中断 xff09 模式或DMA xff08 直接内存访问 xff09 模式 xff0c
  • STM32 HAL UART 使用关键思路(无代码,但是很关键)

    1 到底使用哪种方式 xff0c 或者说有哪几种方式 xff1f STM32 中的 UART 允许使用不同的发送 TX 和接收 RX 模式进行配置 xff0c 有什么区别和优势 xff1f xff1a 轮询模式 xff08 简单来说就是无
  • UART详解

    UART 通用异步收发传输器 xff08 Universal Asynchronous Receiver Transmitter xff0c 通常称作UART xff09 是一种串行异步收发协议 xff0c 应用十分广泛 UART工作原理是
  • HAL_UART_IRQHandler(UART_HandleTypeDef *huart)里面的中断接收函数(作者自己生成的函数代码,中间有关闭接收中断,但是原子教程中没有关闭中断的语句注意区别)

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

    3 1 串口基本认知 串行接口简称串口 xff0c 也称串行通信接口或串行通讯接口 xff08 通常指COM接口 xff09 xff0c 是采用串行通信方式的扩展接口 串行接口 xff08 Serial Interface xff09 是指
  • STM32—UART中断收发 Day4

    软件 xff1a STM32CubeMX xff0c MDK ARM 硬件 xff1a 蓝桥杯物联网Lora开发板 xff0c 板载芯片STM32L071 一 STM32CubeMX配置 1 先在连接 xff08 Connectivity
  • MCU-串口通信协议

    MCU 串口通信协议 一 介绍 串行通信就像单车道 所有数据得一个一个通行 并行就像多车道 一次可以通行多辆车 MCU常用到的串口通信模块主要有两种 UART和USART UART 全称是Universal Asynchronous Rec
  • Node.js笔记:SerialPort(串口)模块使用(基于9.x.x)

    文章目录 目的 模块安装 基础使用 扫描端口 打开端口 发送数据 接收数据 错误处理 数据解析器 SerialPort类 构造方法 属性 事件 方法 命令行工具 总结 目的 上位机与各种电路模块间常常采用串口进行通讯 Node js中可以使
  • 一起学nRF51xx 6 - uart

    前言 通用异步接收器 发送器提供快速 全双工 内置流量控制的异步串行通信 CTS RTS 在硬件方面支持高达1Mbps波特率 支持奇偶校验和第9位数据生成 用于每个UART接口线的GPIO可从芯片上的GPIO中任选 而且可独立配置 这使得芯
  • IOError:[Errno 2]没有这样的文件或目录(当它确实存在时)Python [重复]

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

    我已经为 UART 在传输模式下编写了一个简单的设备驱动程序 并启用了 DMA 和中断 我使用的硬件是 omap 4460 pandaboard 其中加载了 Linux 3 4 下面我分享一下相关部分的代码 在开放阶段 dma map io
  • 英特尔伽利略裸机 UART

    我想编写一些 hello world 程序裸机申请于英特尔伽利略木板 当然 使用 UEFI 打印文本 到 UART 1 效果很好 但我想 手动 访问 UART 而不需要 UEFI 的任何帮助 在 QEMU 中我的代码运行良好 h file
  • C语言UART通信(十六进制)

    我想向写入函数发送一个十六进制值 例如 0 90 这是因为需要通信的设备接收到的是十六进制数的命令 未使用的变量在测试时出现 并注释为丢失十六进制值 稍后将被删除 如何编写具有字符串以外的十六进制值的写入函数 对于初学者 请告诉我们如何通过
  • 如何将 microbit 与 BLE 连接并监听按钮按下事件?

    2021 年 11 月 28 日编辑 如果您需要使用蓝牙低功耗将 microbit 连接到计算机 并在单击按钮时执行操作 直接跳并跟随 ukBaz https stackoverflow com users 7721752 ukbaz的回答
  • 通过 USB 模拟 UART

    有谁知道是否可以通过 USB 模拟 UART 简单串行发送和接收 这将如何实现 我在 Microchip 网站上找到了这个链接 但不是很容易找到 http www microchip com forums m522571 print asp
  • 嵌入式Linux中UART上的9位协议

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

随机推荐

  • windows 10 内存居高不下,实际没开多少进程

    windows 10 内存居高不下 xff0c 实际没开多少进程 关闭快速启动 就好了
  • opkg list 报错

    opkg list Collected errors opkg conf load Could not lock var lock opkg lock Resource temporarily unavail echo 34 nameser
  • openwrt opkg install 强制替换安装

    查询 opkg list installed grep XXX opkg install XXX ipk force downgrade
  • stm32 硬件spi半双工三线的一些研究心得

    a7105可以使用四线spi 或者3线spi 但是之前都是使用3线的软件模拟的三线spi的 xff0c 所以不想改其它代码了 xff0c 就想可以提高一个spi的读写速度 xff0c 原来软件方式的读写速度 xff0c 在48Mhz的03x
  • Openwrt tftp刷机

    第一次写论坛 xff0c 今天早上才拿到路由器 开始学习openwrt 之前学过嵌入式Linux arm 移植 xff0c 开始正题 xff1a 拿到开发板后 xff0c 就开始烧写自己编译的 bin文件 xff0c 在烧写的过程中出现了问
  • openwrt ipk 安装 luci 界面

    试试看可行不 慢慢更新 opkg update 更新 opkg list grep svn
  • OpenWRT php 安装

    一 安装PHP opkg update opkg install php5 php5 mod apc opkg install php5 mod gd php5 mod session opkg install php5 mod pdo m
  • ESP8266 固件擦除

    折腾了两天 真是醉了 首先确认安装 python python2是否安装 python2 version sudo apt isntall python pip 安装pip和他的许多其他依赖 pip 9 0 1 from usr lib p
  • 第二次实验报告:使用Packet Tracer分析应用层协议

    姓名 xff1a 刘钰学号 xff1a 201821121036班级 xff1a 计算1812 1 实验目的 熟练使用Packet Tracer工具 分析抓到的应用层协议数据包 xff0c 深入理解应用层协议 xff0c 包括语法 语义 时
  • C++的类与C语言结构体比较

    C 43 43 的类与C语言结构体比较 C 43 43 的类与C语言结构体比较 一 结构体 xff0c 类的介绍二 结构体和类的具体区别1 C语言对结构体数组初始化 必须要在定义时初始化 xff1a 2 C 43 43 的类的初始化 构造函
  • CPP-网络/通信:经典HTTP协议详解

    2008 11 03 09 11 by Hundre 266688 阅读 23 评论 收藏 编辑 转自 xff1a http blog csdn net gueter archive 2007 03 08 1524447 aspx Auth
  • 串口编程3:使用串口读取GPS信息

    关于GPS的使用 xff0c 参考 本文主要参考的博客 xff0c 在此表示感谢 xff01 xff01 xff01 主函数 主函数gps main c xff0c 这里便涉及到了串口的打开 xff0c 读操作 xff0c 以及调用了串口设
  • 基于单片机语音智能导盲仪仿真设计-毕设课设资料

    资料下载地址 1110 xff08 百度网盘 xff09 xff1a 点击下载 包含超声波传感器检测障碍物 xff0c 温度传感器检测当前温度 可以通过按键设置距离报警范围 xff0c 报警装置通过声光报警 包含的电路有电源电路 显示电路
  • 宏定义详解

    宏定义有无参数宏定义和带参数宏定义两种 无参数的宏定义的一般形式为 define 标识符 字符序列 其中 define之后的标识符称为宏定义名 简称宏名 xff0c 要求宏名与字符序列之间用空格符分隔 这种宏定义要求编译预处理程序将源程序中
  • 一个无线鼠标的HID Report Desc

    HID设备是USB规范定义的设备类型之一 xff0c 其分类号为0x03 关于USB设备类型定义 xff0c 可参见本站 xff1a USB设备类型定义 USB中文网 HID设备除了用于专门的输入输出设备外 xff0c 有时也与其它的设备类
  • 虚拟机的三种网络连接方式

    1 NAT模式 xff1a 用于共享主机的IP地址 安装完VMware后在本地网络连接里会虚拟出两块网卡 xff08 VMnet1 xff0c VMnet8 xff09 如果选择的是NAT模式 xff0c 则会使用VMnet8这块网卡来和虚
  • 全局变量不能放在头文件当中

    看网上各种说法说 变量的声明和变量的定义 xff0c 但是还是没有讲清楚什么是声明什么是定义 xff0c 如果说定义要分配内存 xff0c 声明不分配 xff0c 这个谁都知道 刚我在VS2012中测试 xff1b 按理说 int i xf
  • 使用strcat连接字符串

    include lt iostream gt using namespace std int main int argc char argv char str1 61 34 hello 34 char str2 61 34 china 34
  • 单片机学习笔记————51单片机实现常用的自定义串口通讯协议

    proteus虚拟串口的实现 xff1a https mp csdn net console editor html 107251649 一 使用proteus绘制简单的电路图 xff0c 用于后续仿真 二 编写程序 64 Project
  • Uart串口收发回环验证

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