【UART】Verilog实现UART接收和发送模块

2023-11-04

目录

 

写在前面

UART 工作原理

UART 接收部分

UART RX 模块图

UART RX 时序图

Verilog 实现  UART RX 模块

UART 发送部分

UART TX 模块图

UART TX 时序图

Verilog 实现  UART TX 模块

总结


 

写在前面

UART协议在之前的一篇博客中有介绍,直达链接如下:

【总线】一文看懂 UART 通信协议

这里只是做简单的介绍,重点在 Verilog 实现部分。

UART 工作原理

将要传输数据的UART从数据总线接收数据。数据总线用于通过另一个设备(如CPU,内存或微控制器)将数据发送到UART。数据以并行形式从数据总线传输到传输UART。在发送UART从数据总线获取并行数据后,它会添加一个起始位、一个奇偶校验位和一个停止位,从而创建数据包。接下来,数据包在Tx引脚上逐位串行输出。接收UART在其Rx引脚上逐位读取数据包。然后,接收的UART将数据转换回并行形式,并删除起始位、奇偶校验位和停止位。最后,接收UART将数据包并行传输到接收端的数据总线:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

 UART传输的数据被组织成数据包。每个数据包包含 1 个起始位、5 到 9 个数据位(取决于 UART)、一个可选的奇偶校验位以及 1 个或 2 个停止位:

watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBATGluZXN0LTU=,size_20,color_FFFFFF,t_70,g_se,x_16

UART 接收部分

UART RX 模块图

UART 接受模块的作用是将接受到的串行数据转换成并行数据。

由于我做的实验工程是将 UART 和 RS485 共同使用,所以需要一个信号 dir 控制RS485的传输方向,如果不用 RS485 的话可以将此信号忽略。

UART 的接受模块分为六个信号,三个输入信号:时钟信号clk、复位信号(低有效)rst_n、接受串行数据信号;三个输出信号:并行数据po_data、输出并行数据的同步标志信号pi_flag、控制方向信号 dir。

54627046424e41528d41fa547e201ab9.png

UART RX 时序图

时序图清晰的描述了数据是如何变化的。

09f1fdd5cf8b4cfc8b4ea6558a03da42.png

Verilog 实现  UART RX 模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: Linest-5
// Create Date: 2022/04/14
// Design Name: 
// Module Name: UART_RX
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: UART 接收模块,将串行的数据转成并行的数据接收
// Dependencies: 
// Revision:
// Additional Comments:
// 
//


module UART_RX #(
	parameter	BAUD_RATE = 'd9600,					//波特率
	parameter	CLK_FREQ  = 'd250000000,			//时钟周期
	parameter	BAUD_CNT_MAX = CLK_FREQ/BAUD_RATE
	)
	(
	input	wire		  clk,						//接收到的数据
	input	wire		  rst_n,					//复位信号,低电平有效
	input	wire		  rx,						//输入的串行数据		
	output	reg   [7:0]	  po_data,					//输出的并行数据
	output	reg           po_flag					//并行数据输出的同步标志信号
	);			
				
	reg					  rx_reg1;					//打三拍,稳定数据
	reg 				  rx_reg2;		
	reg 				  rx_reg3;		
	reg 				  start_flag;				//数据稳定信号
	reg 				  work_en;					//开始提取数据有效信号
	reg 				  bit_flag;					//数据提取标志信号
	reg   [3:0]			  bit_cnt;					//数据位计数信号
	reg   [12:0]		  baud_cnt;					//比特计数信号,一个数据需要多少个时钟周期
	reg   [7:0]			  rx_data; 					//串转并数据
	reg 				  rx_flag;					//串转并完成信号


	//消除亚稳态
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_reg1 <= 'd1;
		end
		else begin
			rx_reg1 <= rx;
		end
	end

	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_reg2 <= 'd1;
		end
		else begin
			rx_reg2 <= rx_reg1;
		end
	end

	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_reg3 <= 'd1;
		end
		else begin
			rx_reg3 <= rx_reg2;
		end
	end
	//下降沿检测
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			start_flag <= 'd0;
		end
		else if ((rx_reg2 == 0) && (rx_reg3 == 1) && (work_en == 'd0)) begin 
			start_flag <= 'd1;
		end
		else begin
			start_flag <= 'd0;
		end
	end
	//开始数据计数信号
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			work_en <= 'd0;
		end
		else if (start_flag == 1) begin
			work_en <= 'd1;
		end
		else if ((bit_flag == 1) && (bit_cnt == 'd8)) begin
			work_en <= 'd0;
		end
	end
	//波特计数信号,用时钟频率除以波特率即每个数据需要的时钟周期数
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			baud_cnt <= 'd0;
		end
		else if ((baud_cnt == BAUD_CNT_MAX-1) || (work_en == 'd0)) begin
			baud_cnt <= 'd0;
		end
		else begin
			baud_cnt <= baud_cnt + 'd1;
		end
	end
	//数据中间提取最稳定
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			bit_flag <= 'd0;
		end
		else if (baud_cnt == BAUD_CNT_MAX/2-1) begin
			bit_flag <= 'd1;
		end
		else begin
			bit_flag <= 'd0;
		end
	end
	//数据位计数信号,只去有效的数据位,起始位和结束位不要
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			bit_cnt <= 'd0;
		end
		else if ((bit_flag == 'd1) && (bit_cnt == 'd8)) begin
			bit_cnt <= 'd0;
		end
		else if (bit_flag == 'd1) begin
			bit_cnt <= bit_cnt + 'd1;
		end
	end
	//将提取的数据串转并
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_data <= 'd0;
		end
		else if ((bit_flag == 'd1) && (bit_cnt >= 'd1) && (bit_cnt <= 'd8)) begin
			rx_data <= {rx_reg3,rx_data[7:1]};
		end
	end
	//完成最后一个数据的拼接之后, 就把此信号拉高 
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			rx_flag <= 'd0;
		end
		else if ((bit_flag == 'd1) && (bit_cnt == 'd8)) begin
			rx_flag <= 'd1;
		end
		else begin
			rx_flag <= 'd0;
		end
	end
	//并行数据输出
	always @(posedge clk or negedge rst_n) begin
		if (rst_n == 'd0) begin
			po_data <= 'd0;
		end
		else if (rx_flag == 'd1) begin
			po_data <= rx_data;
		end
		else begin
			po_data <= po_data;
		end
	end
	//并行数据输出标志信号
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            po_flag <= 'd0;
        end
        else begin
            po_flag <= rx_flag;
        end
    end
	
endmodule

UART 发送部分

UART TX 模块图

输入信号:时钟信号clk、复位信号rst_n、输入并行数据、输入并行数据的同步标志信号

输出信号:发送串行数据tx、数据发送完成标志信号tx_done、方向控制信号dir、发哦是那个端空闲标志信号tx_ready

7e05b53b55ec45d68afd3ffd42e14539.png

UART TX 时序图

014a900e3d75424295a0c1e8d51f3015.png

Verilog 实现  UART TX 模块

`timescale 1ns / 1ps
//
// Company: 
// Engineer: Linest-5
// Create Date: 2022/04/15
// Design Name: 
// Module Name: UART_TX
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: UART 发送模块,将接收到的并行数据转成串行数据并发送
// Dependencies: 
// Revision:
// Additional Comments:
// 
//

module UART_TX(

    input 			clk,					//系统时钟
    input 			rst_n,					//系统复位,低电平有效
    input 			valid,					//数据有效信号
    input [7:0] 	pi_data,				//输入的并行数据

    output 			tx,						//并转串的输出数据
    output 			tx_done, 				//并转串的输出数据发送完成标志信号
    output	reg		dir=1,					//控制max3485的dir使能信号
    output	reg 	ready,					//tx模块可以接收数据信号
    output	reg 	ena 					//使能信号
    );

    reg   [7:0] 	pi_data_reg;			//输入数据寄存
    reg 			work_en;				//开始提取数据有效信号
    reg   [17:0] 	baud_cnt;				//波特计数信号,每个数据需要的波特数
    reg   [3:0] 	bit_cnt;				//数据位计数信号
    reg 			bit_flag;				//数据提取标志信号
    reg 			tx_reg;					//发送数据寄存
    reg 			tx_done_reg;			//发送数据完成标志信号

    //参数定义
    parameter	CLK_FREQ 	 = 'd50000000;				
    parameter	BAUD_RATE 	 = 'd9600;
    parameter	BAUD_CNT_MAX = CLK_FREQ/BAUD_RATE;

	//检测输入数据的到来,并将数据寄存
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            pi_data_reg <= 'd0;
        end
        else if (valid == 'd1) begin
            pi_data_reg <= pi_data ;
        end
        else begin
            pi_data_reg <= pi_data_reg;
        end
    end
	//工作使能,在数据标志信号为高时拉高,在发送数据完成信号为高时拉低
   	always @(posedge clk or negedge rst_n) begin
   	    if (rst_n == 'd0) begin
   	        work_en <= 'd0;
   	    end
   	    else if (valid == 'd1) begin 
   	        work_en <= 'd1;
   	    end
   	    else if (tx_done == 'd1) begin
   	        work_en <= 'd0;
   	    end
   	end
	//根据不同的波特率,对每个数据需要波特数进行计数
    always @(posedge clk or negedge rst_n) begin
        if(rst_n == 'd0)begin
            baud_cnt <= 'd0;
        end
        else if(work_en == 'd1 && (baud_cnt == BAUD_CNT_MAX - 'd1))begin
			baud_cnt <= 'd0 ;
        end
        else if (work_en == 'd1) begin
            baud_cnt <= baud_cnt + 'd1 ; 
        end
        else begin
            baud_cnt <= 'd0;
        end
    end
	//比特标志信号拉高,在每一个波特计数为1时拉高,相当于对数据的提取标志信号
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            bit_flag <= 'd0;
        end
        else if (baud_cnt == 'd1) begin
            bit_flag <= 'd1;
        end
        else begin
            bit_flag <= 'd0;
        end
    end
    //比特计数信号,在对每一个数据为进行计数
    always @(posedge clk or negedge rst_n) begin
        if(rst_n == 'd0)begin
            bit_cnt <= 'd0;
        end
        else if ((work_en == 'd1) && (bit_flag == 'd1) && (bit_cnt == 'd11)) begin
			bit_cnt <= 'd0;                       
        end
        else if ((work_en == 'd1) && (bit_flag == 'd1)) begin
            bit_cnt <= bit_cnt + 'd1;
        end
        else if (work_en == 'd0) begin
            bit_cnt <= 'd0;
        end
    end
	//对并行数据映射到串行数据
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            tx_reg <= 'd0;
        end
        else begin
            case (bit_cnt)
                4'd1: tx_reg <= 'd0;
                4'd2: tx_reg <= pi_data_reg[0];
                4'd3: tx_reg <= pi_data_reg[1];
                4'd4: tx_reg <= pi_data_reg[2];
                4'd5: tx_reg <= pi_data_reg[3];
                4'd6: tx_reg <= pi_data_reg[4];
                4'd7: tx_reg <= pi_data_reg[5];
                4'd8: tx_reg <= pi_data_reg[6];
                4'd9: tx_reg <= pi_data_reg[7];
                4'd10:tx_reg <= 'd1;
                4'd11:tx_reg <= 'd1;
                default :tx_reg <= 'd1; 
            endcase
        end
    end
	//发送数据完成标志信号
    always @(posedge clk or negedge rst_n) begin
        if (rst_n == 'd0) begin
            tx_done_reg <= 'd0;
        end
        else if ((bit_flag == 'd1) && (bit_cnt == 'd10)) begin
            tx_done_reg <= 'd1;
        end
        else begin
            tx_done_reg <= 'd0;
        end
    end
    //在tx模块发送数据完成时或者空闲状态时拉高,拉高表示可以接收上游传来的数据,在数据并转串时拉低
    always @(posedge clk or negedge rst_n) begin
    	if (rst_n == 'd0) begin
    		ready <= 'd1;
    	end
    	else if (tx_done == 'd1) begin
    		ready <= 'd1;
    	end
    	else if (valid == 'd1) begin
    		ready <= 'd0;
    	end
    end
    //Bram的使能信号
    always @(posedge clk or negedge rst_n) begin
    	if (rst_n) begin
    		ena <= 'd0;
    	end
    	else begin
    		ena <= tx_done;
    	end
    end
    
    assign tx = tx_reg;
    assign tx_done = tx_done_reg;

endmodule

总结

UART 的时序并不复杂,最重要的是理解比特率的概念,以及在计数当中如何设定,这两个模块在实际的工程中可以正常跑通。

 

 

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

【UART】Verilog实现UART接收和发送模块 的相关文章

  • Gem5 中与 ARM 裸机的 UART 通信

    我目前正在使用 Gem5 我必须通过 UART 从我的主机访问 ARMv8 裸机选项 所以我尝试了很多方法 但我还没有准备好 您能否让我知道 如何在裸机类型编程中将主机的串行端口映射到 ARMv8 的串行端口 任何帮助 将不胜感激 工作设置
  • [Verilog] Verilog 基本格式和语法

    主页 元存储博客 全文 3000 字 文章目录 1 声明格式 1 1 模块声明 1 2 输入输出声明 1 3 内部信号声明 1 4 内部逻辑声明
  • 基于FPGA的简易BPSK和QPSK

    1 框图 2 顶层 3 m generator M序列的生成 输出速率为500Kbps 4 S2P是串并转换模块 将1bit的m序列转换到50M时钟下的2bit M序列数据 就有4个象限 5 my pll是生成256M的时钟作为载波 因为s
  • 用于 Verilog 或 SystemVerilog 的 TAP(测试任何协议)模块

    是否有 TAP 测试任何协议 http testanything org Verilog 的实现 那就太好了 因为这样我就可以使用证明来自动检查我的结果 更新 10 9 09 有人问为什么不使用断言 部分 TAP 为我提供了一些很好的报告
  • 使用forever和always语句

    以下两个代码都会生成一个时钟 我需要知道除了时钟生成之外 永远循环是否还有其他用途 我只在时钟一代中遇到过永远 如果只是为了这个目的 那岂不是毫无用处 initial begin clk 0 forever begin 5 clk clk
  • 使用 Verilator 和 VPI 读取寄存器数组

    所以我在我的verilog中定义了以下寄存器 reg 31 0 register mem 0 15 verilator public 我的目标是从我的 verilator c 代码中读取存储在其中的 16 个值中的每一个 我发现有关 VPI
  • STM32F4-Discovery (STM32F429ZIT6) 上的 RS232 (UART) 与 HAL 库?

    背景 这是我的一些背景 以便你们知道我有或没有哪些相关知识 我完全是这种嵌入式系统的新手 而且我对电子产品一无所知 我是一个纯粹的软件人员 我唯一的嵌入式系统经验是Raspberry Pi 它与STM32F4 Discovery有很大不同
  • Verilog:添加寄存器的各个位(组合逻辑,寄存器宽度可参数化)

    我正在尝试想出一种方法来添加寄存器的各个位 例如 if regA 111000 then regB 3 位的总和regA 1 Verilog或SystemVerilog中是否有可以直接使用的可综合函数 运算符来执行此操作 如果不是 那么问题
  • 启用 DMA 的 UART Tx 模式

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

    本专栏的目的是分享可以通过HDLBits仿真的Verilog代码 以提供参考 各位可同时参考我的代码和官方题解代码 或许会有所收益 题目链接 Gates4 HDLBits module top module input 3 0 in out
  • TRICONEX MA2211-100 芯片上相互连接

    TRICONEX MA2211 100 芯片上相互连接 TRICONEX MA2211 100 所有相同的组件 io的电源 处理器 和内存将需要 但是 你可以看到所有这些带存储器和处理器的OO板 针不能嵌入到一个小的单片机上 现在是 普拉克
  • 使用 read(...) 时在换行符处停止

    我需要从通过 UART 连接的 GPS 读取 NMEA 语句 操作系统是Debian 语言必须是C 为此 我使用以下命令打开文件open 并读取一个字符串read 但是 这样我必须指定字符串长度 这会分解句子 相反 我想读到 NMEA 句子
  • 如何将 microbit 与 BLE 连接并监听按钮按下事件?

    2021 年 11 月 28 日编辑 如果您需要使用蓝牙低功耗将 microbit 连接到计算机 并在单击按钮时执行操作 直接跳并跟随 ukBaz https stackoverflow com users 7721752 ukbaz的回答
  • 如何将时钟门映射到技术库单元

    我的设计中有以下时钟门 module my clkgate clko clki ena Clock gating latch triggered on the rising clki edge input clki input ena ou
  • verilog $readmemh 对于 50x50 像素 RGB 图像花费太多时间

    我正在尝试编译用于 FPGA 编程的 verilog 代码 我将在其中实现 VGA 应用程序 我使用 QuartusII 和 Altera 我正在尝试正确使用 readmemh 来逐像素获取图片 现在 我已经使用 matlab 将图片转换为
  • 为什么 Verilog 不被视为编程语言? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 教授在课堂上说学生不应该说他们学会了用Verilog 编程 他说 Verilog 之类的东西不是用来编程的 而是用来设计的 那么 Verilog
  • 标识符必须用端口模式声明:busy。 (Verilog)

    我有如下所示的 Verilog 代码 当我编译它时 我收到以下错误消息 并且代码的第一行突出显示 Error 标识符必须用端口模式声明 busy Code module main clk rst start busy ready cnt s
  • 如何在 Verilog 中推断 Block RAM

    我在一个项目中遇到了一个非常具体的问题 这个问题已经困扰我好几天了 我有以下 RAM 模块的 Verilog 代码 module RAM param clk addr read write clear data in data out pa
  • 具有内部赋值延迟的阻塞和非阻塞语句之间的区别

    以下 2 个 verilog 代码片段有什么区别 1 always in out 5 in AND 2 always in out lt 5 in 考虑到always块中不存在其他行 输出会有什么不同吗 问题参考幻灯片 16 参见 o5 和
  • 学习 Verilog 的资源 [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我是 Verilog 新手 有人可以推荐学习资源 书籍 视频 博客或任何他们有良好个人经验并帮助他们更

随机推荐

  • redis教程

    Redis和tp使用 类型 支持多种数据结构类型 包括string 字符串 hash 哈希 list 链表 set 无序集合 Zset 有序集合 Redis能读的速度是110000次 s 写的速度是81000次 s Redis所有单个命令的
  • AIX字体丢失——解决方案

    问题 图标中文显示为方框 报表工具FineReport 解决办法 拷贝中文字体到操作系统 1 将 WINDOWS Fonts 目录下SIMSUN TTC 宋体 拷贝到 AIX JDK安装目录 jre lib fonts 目录下 2 如果是j
  • Pixel手机电信4G破解(含解锁BL和root)

    Pixel电信4G破解 由于谷歌没有支持电信 因此若想使用电信的网络就需要破解 仅支持欧洲版 其它版的可以试试 本文分为两种电信破解方式 第二种不需要格式化 要想破解电信 必须root 首先需要下载电脑的驱动 下载完成后还需要安装 方法 安
  • 学习笔记借助ChatGPT自动制作PPT

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 文章目录 一 两步实现自动制作PPT 二 步骤 1 通过ChatGPT生成文本文档 2 借助MINDSHOW生成PPT 总结 一 两步实现自动制作PPT 文本内容生成 cha
  • Git基础操作:合并某个分支的一个commit到另一个分支

    有的时候不小心在错误的分支A上开发了一点代码 也已经提交了 这个时候如果想把这部分代码移到正确的分支B上可以如下操作 使用git log命令找到错误提交的那次commitid git log commit 8b19200eed045d5be
  • QT布局

    布局管理 以下是Qt手册中的 布局管理 的译文 在一个Widget中 Qt布局管理系统提供了一个简单而有效的方式来自动组织子widget 以保证他们能够很好地利用可用空间 介绍 Qt包含一个布局管理类的集合 它们被用来描述widgets如何
  • JSON的编写规则

    JSON的规则很简单 对象是一个无序的 名称 值 对 集合 一个对象以 左括号 开始 右括号 结束 每个 名称 后跟一个 冒号 名称 值 对 之间使用 逗号 分隔 规则如下 1 映射用冒号 表示 名称 值 2 并列的数据之间用逗号 分隔 名
  • 敏感性、特异度、α、β、阳性预测值(PPV)、阴性预测值(NPV)等指标及置信区间计算(附R语言代码)

    这个虽然简单但老是被绕进去 所以整理一下方便查阅 首先画一个2 2的混淆矩阵confusion matrix TP True positive 真阳性 FP False positive 假阳性 FN False negative 假阴性
  • 微信小程序存在的风险_浅谈微信小程序会中病毒事件

    小程序其实是云端数据 不在软件里 所以小程序没有进入的端口 所以华为的管家也检测不出来 但是你按照腾讯的方法收索的话 就等于默认开通小程序 把你的数据放到云端 同时你拥有的账号就绑定了一大堆应用程序 这些程序你永远也别想删除掉 除非不用那个
  • C语言学习(四)——字符串处理函数

    字符串处理函数 17个 1 gets include
  • Jmeter(十五) - 从入门到精通 - JMeter导入自定义的Jar包(详解教程)

    1 简介 原计划这一篇是介绍前置处理器的基础知识的 结果由于许多小伙伴或者童鞋们在微信和博客园的短消息中留言问如何引入自己定义的Jar包呢 我一一回复告诉他们和引入插件的Jar包一样的道理 一通百通 但是感觉他们还是很迷糊很迷惘 因此在这里
  • powerdesigner 创建物理结构视图

    PowerDesigner系列产品提供了一个完整的建模解决方案 业务或系统分析人员 设计人员 数据库管理员DBA和开发人员可以对其裁剪以满足他们的特定的需要 本系列将简单介绍PowerDesigner入门使用操作 若有不足或需要补充之处 欢
  • 深度学习环境配置9——Ubuntu下的tensorflow-gpu==2.4.0环境配置

    深度学习环境配置9 Ubuntu下的tensorflow gpu 2 4 0环境配置 注意事项 一 2022 09 04更新 学习前言 各个版本tensorflow2的配置教程 环境内容 环境配置 一 Anaconda安装 1 Anacon
  • 股票获取最大利润

    1 题目背景 给定一个数组 prices 它的第i个元素prices i 表示一支给定股票第i天的价格 你只能选择某一天买入这只股票 并选择在未来的某一个不同的日子卖出该股票 设计一个算法来计算你所能获取的最大利润 返回你可以从这笔交易中获
  • 操作中 "Chinese_PRC_CI_AS" 和 "Chinese_PRC_CI_AI" 之间的排序规则冲突 的解决办法

    最主要就一句话 在条件中不同排序规则的列后面加上 collate Chinese PRC CI AS 即可解决 有个需求 要求数据库系统自动同步两个不同数据库中的人员信息 首先想到写一个存储过程然后由系统任务来自动处理 尝试性的写了下面的查
  • H5实现高德地图的uni.chooseLocation

    在uniapp中获取当前定位和选择当前位置都是做了兼容 在各个平台都可以使用 这篇文章讲解如何定位当前位置 搜索位置 点击进行定位在H5中实现uni chooseLocation 如下图所示 左侧微信小程序的选择位置 右侧为高德地图在H5中
  • 微信小程序 修改三方组件中的自带样式

    众所周知 微信小程序会引用诸如vant weiui等三方组件 当我们想要对组件自带样式进行修改的时候该怎么做呢 1 在调试器中找到想要修改样式的组件的class类名 在对应的wxss中添加样式 此时样式未生效 2 官方文档中提到可以在ext
  • python写的串口助手并连接腾讯云服务器数据库

    结合上一期的基于pyqt5开发的图书管理系统UI 带登录页面 文章做一个此章节的补充 因为老师说需要结合数据库实现登录系统 于是我就想起了自己在腾讯云上买的一个服务器 因此经过百度查询大量的资料 功夫不负有心人 在这个Pyqt5实现的可视化
  • three.js展示obj模型

    利用three js展示obj模型 环境 必须是在web服务器中 下载objShow js
  • 【UART】Verilog实现UART接收和发送模块

    目录 写在前面 UART 工作原理 UART 接收部分 UART RX 模块图 UART RX 时序图 Verilog 实现 UART RX 模块 UART 发送部分 UART TX 模块图 UART TX 时序图 Verilog 实现 U