STM32速成笔记—串口通信

文章目录

  • 一、什么是串口通讯
  • 二、串口通讯有什么用
  • 三、STM32的串口通信
  • 四、串口通信相关概念
    • 4.1 波特率
    • 4.2 全双工和半双工
    • 4.3 同步通信和异步通信
  • 五、硬件连接
  • 六、串口通讯程序配置
    • 6.1 使能串口时钟和GPIO时钟
    • 6.2 初始化GPIO
    • 6.3 初始化串口参数
    • 6.4 使能串口
    • 6.5 串口接收中断
    • 6.6 串口接收中断服务函数
    • 6.7 串口发送函数
  • 七、拓展
    • 7.1 printf重定向
    • 7.2 接收帧解析
  • 八、实战项目
    • 8.1 前期准备
    • 8.2 项目要求
    • 8.3 串口程序
      • 8.3.1 初始化串口
      • 8.3.2 串口接收中断服务函数
      • 8.3.3 接收帧解析函数
      • 8.3.3 main函数

一、什么是串口通讯

串口通信是指外部设备与主控芯片之间,通过数据信号线、地线等,按位进行数据传输的一种通信方式,属于串行通信方式。串行通信是指使用一条数据线依次逐位传输数据,每一位数据占据固定长度的时间。可以看一下简单的串行通信示意图。
串口通信示意图

二、串口通讯有什么用

这里简单列举一下串口通信的用途

  • 下载程序
  • 外设与单片机通信
    单片机给外设发送一些指令或者配置信息,外设给单片机回传一些信息。
  • 打印信息
    比如将ADC采集到的电压发送给上位机的串口调试助手,或者实时监测某一个变量的变化。

三、STM32的串口通信

普中核心板上使用的STM32F103ZET6有三个USART,两个UART,他们都支持串口通信功能。USART(通用同步异步收发器)与UART(通用异步收发器)相比,多了一个同步功能,可以认为USART是UART的增强型。

四、串口通信相关概念

4.1 波特率

引用专业的说法,波特率表示单位时间内传送的码元符号的个数,它是对符号传输速率的一种度量。其实意思就是波特率表示1s内传输码元的个数。在单片机中数字都是二进制的01表示的,所以波特率可以说是1s内传输01的个数。常见的波特率有38400、9600和115200等。

波特率通常由波特率发生器产生,串口要想实现收发首先要有波特率发生器,网上介绍波特率发生器的作用是输入时钟转换出需要的波特率CLK。个人理解,波特率发生器就是提供一个时钟,这样才能发送出正确波特率的信息,比如1和0需要多久的高/低电平表示。

在串口通信时如果收发双方波特率不相同会导致通信失败,要么是接收不到,要么是接收到的是乱码。

4.2 全双工和半双工

  • 全双工可以简单解释为,我在接收消息的同时,你也可以发送消息。
  • 半双工可以简单解释为,我在接收消息时,没办法发送消息。类似于对讲机,你说话时占用了信道,对方无法跟你讲话,只有当你说完了,他才可以对你讲话。

4.3 同步通信和异步通信

同步通信和异步通信的区别在于通信双方是否需要时钟同步。同步通信的接收双方之间除了需要数据线之外,还需要一根时钟线,而异步通信不需要。关于二者的详细定义与区别,请大家自行搜索。

五、硬件连接

串口通信只需几条线即可在两个系统间交换信息,特别适用于计算机与计算机、计算机与外设之间的通信,常用的串口通信接口标准有很多,比如RS-232C、RS-232、RS-485等。但是放在单片机开发里,最简单的串口通信就是用四根线VCC、GND、TXD和RXD实现通信。

串口通信硬件连接示意图

普中核心板上常用的是USART1,其引脚对应如下

  • TXD——PA9
  • RXD——PA10

六、串口通讯程序配置

下面以配置USART1为例,来简单展示一下USART的配置方法。

6.1 使能串口时钟和GPIO时钟

// 使能USART1,GPIOA时钟
RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1|RCC_APB2Periph_GPIOA, ENABLE);

6.2 初始化GPIO

初始化USART1用到的GPIO。TXD引脚设置为复用推挽式输出,RXD引脚设置为输入浮空。

// USART1_TX   GPIOA.9
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   // PA.9
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.9

	// USART1_RX	  GPIOA.10初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   // PA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 输入浮空
	GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.10  

6.3 初始化串口参数

库函数提供了一个结构体,用于初始化串口。其中包括

    USART_InitTypeDef USART_InitStructure;
    
    // USART 初始化设置
	USART_InitStructure.USART_BaudRate = bound;   // 串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;   // 字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;   // 一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;   // 无奇偶校验位
	// 无硬件数据流控制
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   // 收发模式
	USART_Init(USART1, &USART_InitStructure);   // 初始化串口1

6.4 使能串口

USART_Cmd(USART1, ENABLE);   // 使能串口1 

6.5 串口接收中断

平时开发过程中经常需要开启串口接收中断,配置串口接收中断的方法与上一篇的外部中断有些类似,主要包括以下步骤

  • 配置中断分组(通常在main函数中初始化中配置)
  • 设置中断优先级
  • 使能中断

配置中断优先级

    NVIC_InitTypeDef NVIC_InitStructure;

    // Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;   // 抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   // 子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);   // 根据指定的参数初始化VIC寄存器

使能串口接收中断

USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   // 开启串口接收中断

6.6 串口接收中断服务函数

通常接收到的数据会是一帧,很少是一个单独的字符,这里给出一个接收一帧数据的串口中断服务函数。需要注意的是,在初始化串口时,需要使能空闲中断。

使能空闲中断的程序如下

USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);   // 使能空闲中断
/*
 *==============================================================================
 *函数名称:USART1_IRQHandler
 *函数功能:USART1中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 

void USART1_IRQHandler(void)  
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  
	{
		gReceFifo[gReceCount++] = USART_ReceiveData(USART1);
	}
	else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据
	{
		USART1->SR;   // 先读SR
		USART1->DR;   // 再读DR
		
		gReceEndFlag = 1;   // 接收完成标志置1 
	} 
}

接收完成后,接收完成标志位会置1。此时,对接收到的帧进行解析处理。解析完成后需要清除接收数组,同时,不要忘记清除接收完成标志位。

/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
	if (gReceEndFlag  == 1)   // 如果接收完成
	{
		// 解析接收内容
		
		// 清空接收数组
		for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
		{
			gReceFifo[gClearCount] = ' ';
		}
			
		gReceEndFlag = 0;   // 清除接收完成标志位
		gReceCount = 0;   // 清零接收计数变量
	}
}

6.7 串口发送函数

//串口发送函数
void USART1_Send(u8*str)
{
	u8 index=0;
	do
	{
		USART_SendData(USART1,str[index++]);
		while(USART1,str[index++]);
		while(USART_GetFlagStatus(USART1,USART_FLAG_TXE) == RESET);
	}
	while(str[index]!=0);
}

其实这里最根本的USART_SendData()本质就是将数据搬运到串口发送的寄存器。当然除了直接用发送函数发送,也可以直接重定向之后用printf发送,这里就不详细介绍了,有需要的友友可以直接去看普中或者正点的教程视频。

七、拓展

7.1 printf重定向

关于重定向的概念这里就不再做介绍了,重定向之后就可以在程序中使用printf直接打印或者发送字符串,不再需要串口发送函数。重定向的方法就是在串口的.c文件中添加下面的程序

// 加入以下函数可以使用printf
#pragma import(__use_no_semihosting)             
// 标准库需要的支持函数                 
struct __FILE 
{ 
	int handle; 
}; 

FILE __stdout;       
//定义_sys_exit()以避免使用半主机模式    
void _sys_exit(int x) 
{ 
	x = x; 
} 
//重定义fputc函数 
int fputc(int ch, FILE *f)
{      
	while((USART1->SR&0X40)==0);//循环发送,直到发送完毕   
    USART1->DR = (u8) ch;      
	return ch;
}

7.2 接收帧解析

这里的接收帧解析比较简单,比如有些项目要求接收到某些特定字符执行某些操作。这时需要根据接收帧的长度和固定位置的字符来解析命令。

比如项目要求上位机(电脑)发送“BEEP ON”时,蜂鸣器响。这时在解析时只要接收到长度为6,第5和第6个字符分别为“O”,“N”时,开启蜂鸣器即可。

// 解析接收内容
if (gReceCount == 6 && gReceFifo[5] == 'O' && gReceFifo[6] == 'N')
{
   // 开启蜂鸣器
}

当然上面的只是粗略的卡命令,也可以写的更详细。

八、实战项目

8.1 前期准备

  • CH340驱动
  • USB转TTL,用于单片机与电脑的通信
  • 串口调试助手

刚买来的普中核心板,不拔短接片的话可以直接通过USB下载程序,或者与电脑进行串口通信,串口为USART1。注意一定要插图中标出来的USB接口,另一个只能用来供电。
串口通信跳线帽连接

8.2 项目要求

  • 单片机上电发送“Sys Ready!”
  • 电脑串口助手发送“LED1 ON”(带回车换行),LED1点亮,同时单片机回复“OK!”
  • 电脑串口助手发送“LED1 OFF”(带回车换行),LED2熄灭,同时单片机回复“OK!”

8.3 串口程序

8.3.1 初始化串口

首先是串口初始化程序,需要开启接收中断和空闲中断。

/*
 *==============================================================================
 *函数名称:uart_init
 *函数功能:初始化USART1
 *输入参数:bound:波特率
 *返回值:无
 *备  注:可以修改成输入初始化哪个USART
 *==============================================================================
 */
void uart_init(u32 bound)
{
	// 相关结构体定义
	GPIO_InitTypeDef GPIO_InitStructure;
	USART_InitTypeDef USART_InitStructure;
	NVIC_InitTypeDef NVIC_InitStructure;

	// 使能USART1,GPIOA时钟
	RCC_APB2PeriphClockCmd (RCC_APB2Periph_USART1 | RCC_APB2Periph_GPIOA, ENABLE);	

	// USART1_TX   GPIOA.9
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;   // PA.9
	GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;   // 复用推挽输出
	GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.9

	// USART1_RX	  GPIOA.10初始化
	GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;   // PA10
	GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;   // 浮空输入
	GPIO_Init(GPIOA, &GPIO_InitStructure);   // 初始化GPIOA.10  

	// Usart1 NVIC 配置
	NVIC_InitStructure.NVIC_IRQChannel = USART1_IRQn;
	NVIC_InitStructure.NVIC_IRQChannelPreemptionPriority=3 ;   // 抢占优先级3
	NVIC_InitStructure.NVIC_IRQChannelSubPriority = 3;   // 子优先级3
	NVIC_InitStructure.NVIC_IRQChannelCmd = ENABLE;   // IRQ通道使能
	NVIC_Init(&NVIC_InitStructure);   // 根据指定的参数初始化VIC寄存器

	// USART 初始化设置
	USART_InitStructure.USART_BaudRate = bound;   // 串口波特率
	USART_InitStructure.USART_WordLength = USART_WordLength_8b;   // 字长为8位数据格式
	USART_InitStructure.USART_StopBits = USART_StopBits_1;   // 一个停止位
	USART_InitStructure.USART_Parity = USART_Parity_No;   // 无奇偶校验位
	// 无硬件数据流控制
	USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;
	USART_InitStructure.USART_Mode = USART_Mode_Rx | USART_Mode_Tx;   // 收发模式
	USART_Init(USART1, &USART_InitStructure);   // 初始化串口1
  
  USART_ITConfig(USART1, USART_IT_RXNE, ENABLE);   // 开启串口接收中断
	USART_ITConfig(USART1, USART_IT_IDLE, ENABLE);   // 使能空闲中断
	
  USART_Cmd(USART1, ENABLE);   // 使能串口1 
}

其次需要加上重定向函数,直接复制上面的即可。

8.3.2 串口接收中断服务函数

/*
 *==============================================================================
 *函数名称:USART1_IRQHandler
 *函数功能:USART1中断服务函数
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
u32 gReceCount = 0;   // 接收计数变量
u32 gClearCount = 0;   // 清空接收数组计数变量
u8 gReceFifo[1500];   // 接收数组
u8 gReceEndFlag = 0;   // 接收完成标志位 

void USART1_IRQHandler(void)  
{
	if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET)   //接收到一个字节  
	{
		gReceFifo[gReceCount++] = USART_ReceiveData(USART1);
	}
	else if(USART_GetITStatus(USART1,USART_IT_IDLE) != RESET)   //接收到一帧数据
	{
		USART1->SR;   // 先读SR
		USART1->DR;   // 再读DR
		
		gReceEndFlag = 1;   // 接收完成标志置1 
	} 
}

8.3.3 接收帧解析函数

/*
 *==============================================================================
 *函数名称:Uart_Rece_Pares
 *函数功能:解析串口接收内容
 *输入参数:无
 *返回值:无
 *备  注:无
 *==============================================================================
 */
void Uart_Rece_Pares(void)   // 串口接收内容解析函数
{
	if (gReceEndFlag  == 1)   // 如果接收完成
	{
		// 解析接收内容
		if (gReceFifo[6] == 'N')
		{
			Med_Led_StateCtrl (LED1,LED_ON);   // 点亮LED1
			printf ("OK!\r\n");
		}
		
		if (gReceFifo[6] == 'F' && gReceFifo[7] == 'F')
		{
			Med_Led_StateCtrl (LED1,LED_OFF);   // 熄灭LED1
			printf ("OK!\r\n");
		}
		
		// 清空接收数组
		for (gClearCount = 0;gClearCount < gReceCount;gClearCount ++)
		{
			gReceFifo[gClearCount] = ' ';
		}
			
		gReceEndFlag = 0;   // 清除接收完成标志位
		gReceCount = 0;   // 清零接收计数变量
	}
}

8.3.3 main函数

int main(void)
{
	Med_Mcu_Iint();   // 系统初始化
	printf ("Sys Ready!\r\n");
	
	while(1)
  {
		Uart_Rece_Pares ();   // 接收帧解析
	}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/29337.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

用python写网络爬虫

第二章 数据抓取 首先 &#xff0c; 我们会介绍一个叫 做Firebug Lite 的浏览器扩展&#xff0c; 用 于检查网页 内容 &#xff0c; 如 果你有一些网络开发背景的话&#xff0c; 可能 己经对该扩展十分熟悉 了 。 然后 &#xff0c;我们会介绍三 种抽取网 页数据的 方法 &…

java【抽象类与接口】

抽象类与接口 1 抽象类1.1 定义与使用1.2 抽象类和抽象方法使用原则 2 接口2.1 定义2.2 使用规则 3. JDK中内置接口3.1 Comparable接口3.2 Cloneable接口 抽象类与接口的对比 前言&#xff1a;如果强制要求子类必须覆写一些方法&#xff0c;则就会用到抽象类和抽象方法 1 抽象类…

使用 MATLAB 进行气象激光雷达图像分析(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

STM32——01-开发软件Keil5及STM32CubeMX的安装

1.1开发环境的安装 编程语言&#xff1a;C语言 需要安装的软件有两个&#xff1a;Keil5和STM32CubeMX 安装 安装包&#xff08;不需要太新&#xff0c;以 MDK324 为例&#xff0c;最新的 MDK327 有问题&#xff09; 安装过程一路下一步即可&#xff08;建议不要安装在 C …

2023-06-09:什么是Redis事务?原理是什么?

2023-06-09&#xff1a;什么是Redis事务&#xff1f;原理是什么&#xff1f; 答案2023-06-09&#xff1a; Redis中的事务是以一组命令的形式出现的&#xff0c;这些命令被认为是最小的执行单位。事务可以保证在一个单独独立的隔离操作中执行所有命令&#xff0c;而且所有命令…

深度研究微软的资产负债表和财务状况以及未来投资价值

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 微软股票的关键指标 猛兽财经认为&#xff0c;微软公布的2023财年第三季度财务业绩&#xff0c;有三个关键指标值得投资者关注。 第一个关键指标是利息收入。微软的利息收入目前已经同比增长了44%&#xff0c;从2022财年第…

从搭建hadoop开始学习大数据中分而治之的MapReduce(伪集群模式)

环境准备 首先需要将如下四个必要的文件下载到计算机&#xff08;已经附上了下载地址&#xff0c;点击即可下载&#xff09;。 Vmware Workstation 17.x 【官方的下载地址】 CentOS-7-x86_64-Minimal-2009【阿里云镜像站下载地址】 openjdk-8u41-b04-linux-x64-14_jan_2020【开…

踏上极速向未来之旅!——2023年量化科技嘉年华·专场回顾

2023年6月2日—3日&#xff0c;“2023量化科技嘉年华”在上海世博中心召开&#xff0c;这场为期两天的量化科技盛会&#xff0c;多方位呈现了量化科技创新成果&#xff0c;吸引了众多关注。 在嘉年华的第二天&#xff0c;多场主题论坛同步进行。 由华锐技术主办的“极速向未来…

ChatGPT 4 的 6 个最佳使用场景

作者&#xff1a;SYDNEY BUTLER 译者&#xff1a;明明如月 无论是在 ChatGPT 中还是通过 API&#xff0c;对 OpenAI 的 GPT-4 模型的访问比 GPT-3.5 限制更多。这意味着你需要慎重考虑在何种情况下使用 GPT-4&#xff0c;并选择性地将最适合的任务交给它&#xff0c;以便让其发…

短视频seo源代码部署步骤

一、 部署短视频SEO矩阵系统源代码&#xff0c;您需要遵循以下步骤&#xff1a; 准备服务器环境 首先&#xff0c;您需要准备一个服务器环境来托管源代码。您可以选择云服务器&#xff08;例如AWS&#xff0c;阿里云等&#xff09;或自己的私人服务器。 安装所需软件 在服务器…

Hbase

Hbase 思考环节&#xff1a; 1.什么是hbase 1.1简介 HBase 是一个面向列式存储的分布式数据库&#xff0c;其设计思想来源于 Google 的 BigTable 论文。 HBase 底层存储基于 HDFS 实现&#xff0c;集群的管理基于 ZooKeeper 实现。 HBase 良好的分布式架构设计为海量数据的…

图神经网络 GNN 入门

参考链接 A Gentle Introduction to Graph Neural Networks (distill.pub) 零基础多图详解图神经网络&#xff08;GNN/GCN&#xff09;【论文精读】_哔哩哔哩_bilibili 目录 图的基本构成 图的表示方法 图的示例 图网络的基本任务 图网络的处理 影响图网络效果的超参数 …

快速创建Django项目

环境搭建 安装Django之前需要先安装python环境和pycharm。 目前 Django 1.6.x 以上版本已经完全兼容 Python 3.x。 python安装教程&#xff1a;https://blog.csdn.net/David_house/article/details/100110542 项目创建 打开pycharm&#xff0c;选择文件–>新建项目 创建D…

HUAWEI悦盒ec6108v9c 如何刷成海纳思系统(家用低功耗服务器,使用Home Assistant服务)

环境&#xff1a; 1.HW悦盒ec6108v9c一套 2.16G U盘 3.格式化软件USB_format.exe 4.固件 mv100-mdmo1g-usb-flash.zip&#xff08;底层是Ubuntu 20.04系统&#xff09; 5.十字螺丝刀 6.翘片/薄铲子 7.有线网络环境 8.镊子/回形针 问题描述&#xff1a; 最近玩智能家居…

【Linux】基本指令,拥抱Linux的第一步

[Linux]常见指令 Linux基本指令指令的本质ls指令pwd指令cd指令touch指令mkdir指令(重要)rmdir&&rm指令(重要)man指令&#xff08;重要&#xff09;cp指令&#xff08;重要&#xff09;mv指令&#xff08;重要&#xff09;重定向cat指令more指令less指令&#xff08;重要…

Android Retrofit 给你的接口加上缓存

转载请注明出处&#xff1a;https://blog.csdn.net/kong_gu_you_lan/article/details/131200501?spm1001.2014.3001.5501 本文出自 容华谢后的博客 往期回顾&#xff1a; Android Retrofit RxJava使用详解 Android 探讨一下Retrofit封装的最佳姿势 Android 谈谈我所理解的…

export 和 export default 的区别

一、铺垫 ES6模块化主要包含以下3种用法&#xff1a; ① 默认导出和默认导入---export default ② 按需导出和按需导入---export ③ 直接导入并执行模块中的代码 二、默认导出 语法&#xff1a;export default 需要共享的成员 创建一个共享的数据 order.js let name…

详解Eureka服务注册和调用

目录 1.概述 2.环境 2.1.项目结构 2.2.项目架构 2.3.依赖 3.注册中心 3.1.配置使用 3.2.管理页 3.3.集群 4.服务注册 5.服务调用 5.2.Ribbon 5.3.Feign 5.4.OpenFeign 1.概述 我们把从外部进入到微服务集群里的流量称为“南北流量”、微服务集群节点间流转的流量…

从零开发短视频电商 Jmeter插件安装和常用插件

Jmeter插件安装和常用插件 插件安装方式 一种是手动安装各种插件&#xff0c;下载对应的jar包&#xff0c;放到lib\ext目录下就可以使用了。另一种是通过漂亮的 UI &#xff0c;jmeter 插件管理器Plugins Manager可以方便的管理其他插件的下载和更新。安装一次插件管理器&…

数据库SQL查询(一)

本文介绍SQL查询&#xff0c;如何在海量数据中筛选想要数据&#xff1b; 数据库管理系统选择&#xff1a;关系型数据库mysql 数据库管理工具选择&#xff1a;navicat 本文中查询语句和查询案例参考自&#xff1a;https://edu.csdn.net/course/detail/27673?ops_request_mis…