stm32学习总结:4、Proteus8+STM32CubeMX+MDK仿真串口收发

stm32学习总结:4、Proteus8+STM32CubeMX+MDK仿真串口收发

文章目录

  • stm32学习总结:4、Proteus8+STM32CubeMX+MDK仿真串口收发
    • 一、前言
    • 二、资料收集
    • 三、STM32CubeMX配置串口
      • 1、配置开启USART1
      • 2、设置usart中断优先级
      • 3、配置外设独立生成.c和.h
    • 四、MDK串口收发代码(中断回调接收后发送接收到的内容)
      • 1、usart.h
      • 2、usart.c
      • 3、stm32f1xx_it.c
    • 五、创建虚拟串口并通过Proteus配置及仿真串口通信
      • 1、创建虚拟串口
      • 2、添加串口元器件及虚拟终端
      • 3、接线配置元器件并烧入hex
      • 4、进行仿真测试
      • 5、可能的问题
    • 六、最后

一、前言

前面我们已经实现点灯,下面就做一些数据交互的内容,先搞一下串口让数据可以用串口打印以及通过虚拟终端显示出来(就相当于有个显示屏可以显示数据了)。

二、资料收集

串口概念:https://zh.wikipedia.org/zh-cn/%E4%B8%B2%E8%A1%8C%E7%AB%AF%E5%8F%A3

STM32CubeMX配置串口:https://www.st.com/resource/zh/user_manual/um1718-stm32cubemx-for-stm32-configuration-and-initialization-c-code-generation-stmicroelectronics.pdf

https://blog.csdn.net/weixin_50303783/article/details/113813781

Proteus8配置串口元器件和虚拟终端:https://blog.csdn.net/acktomas/article/details/105175794

虚拟串口工具:VSPD(https://www.eltima.com/products/vspdxp/)或者HHD Software Virtual
Serial Port Tools(免费:https://freevirtualserialports.com/)
https://blog.csdn.net/weixin_39510813/article/details/135069554?spm=1001.2014.3001.5502

串口工具:SSCOM、XCOM、微软商店的串口调试工具等(推荐https://apps.microsoft.com/detail/9NBLGGH43HDM?rtc=1&hl=zh-cn&gl=CN)

三、STM32CubeMX配置串口

1、配置开启USART1

  • 开启USART1,配置为异步模式,并设置全局中断,就可以看到右侧的引脚PA9、PA10为TX和RX(设置底板的时候也可以通过这里来确认引脚位置,避免搞反了):

image.png
设置属性为9600比特率、8个数据位、一个停止位,无奇偶校验:
image.png

2、设置usart中断优先级

  • 设置优先级:

image.png

3、配置外设独立生成.c和.h

  • 配置外设生成独立的.c和.h(否则我们后面就找不到usart.c和usart.h了,都在main.c中了,这种结构太差了,所以建议这里都勾选一下):

image.png
参数设置我们使用默认的即可,所以这里最简单的串口配置就完成了(时钟我们这里也暂时不配置使用HSE)。
可以直接右上角 GENERATE CODE生成代码,然后打开MDK工程了。

四、MDK串口收发代码(中断回调接收后发送接收到的内容)

MDK中主要改三个地方,usart.c、usart.h、stm32f1xx_it.c:

1、usart.h

usart.h我们在用户可添加的位置增加相关宏和全局变量(这里设置了接收中断的缓存大小为1,一个字节一个字节接收处理):

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    usart.h
  * @brief   This file contains all the function prototypes for
  *          the usart.c file
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Define to prevent recursive inclusion -------------------------------------*/
#ifndef __USART_H__
#define __USART_H__

#ifdef __cplusplus
extern "C" {
#endif

/* Includes ------------------------------------------------------------------*/
#include "main.h"

/* USER CODE BEGIN Includes */

/* USER CODE END Includes */

extern UART_HandleTypeDef huart1;

/* USER CODE BEGIN Private defines */
#define USART_REC_LEN            200
#define EN_USART1_RX             1
          
extern uint8_t  USART_RX_BUF[USART_REC_LEN];
extern uint16_t USART_RX_STA;

#define RXBUFFERSIZE    (1)
extern uint8_t aRxBuffer[RXBUFFERSIZE];

/* USER CODE END Private defines */

void MX_USART1_UART_Init(void);

/* USER CODE BEGIN Prototypes */

/* USER CODE END Prototypes */

#ifdef __cplusplus
}
#endif

#endif /* __USART_H__ */


2、usart.c

usart.c增加中断处理以及中断回调,在回调中处理接收内容(HAL_UART_RxCpltCallback回调中我这里是根据报文头和报尾确定一包数据后进行业务处理调用,这里暂时收到什么就发送什么):

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    usart.c
  * @brief   This file provides code for the configuration
  *          of the USART instances.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "usart.h"

/* USER CODE BEGIN 0 */
#include <string.h>
/* USER CODE END 0 */

UART_HandleTypeDef huart1;

/* USART1 init function */

void MX_USART1_UART_Init(void)
{

  /* USER CODE BEGIN USART1_Init 0 */

  /* USER CODE END USART1_Init 0 */

  /* USER CODE BEGIN USART1_Init 1 */

  /* USER CODE END USART1_Init 1 */
  huart1.Instance = USART1;
  huart1.Init.BaudRate = 9600;
  huart1.Init.WordLength = UART_WORDLENGTH_8B;
  huart1.Init.StopBits = UART_STOPBITS_1;
  huart1.Init.Parity = UART_PARITY_NONE;
  huart1.Init.Mode = UART_MODE_TX_RX;
  huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;
  huart1.Init.OverSampling = UART_OVERSAMPLING_16;
  if (HAL_UART_Init(&huart1) != HAL_OK)
  {
    Error_Handler();
  }
  /* USER CODE BEGIN USART1_Init 2 */
    //弿启接收中断:标志位UART_IT_RXNE,并且设置接收缓冲以及接收缓冲接收最大数据量
    HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE);
  /* USER CODE END USART1_Init 2 */

}

void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{

  GPIO_InitTypeDef GPIO_InitStruct = {0};
  if(uartHandle->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspInit 0 */

  /* USER CODE END USART1_MspInit 0 */
    /* USART1 clock enable */
    __HAL_RCC_USART1_CLK_ENABLE();

    __HAL_RCC_GPIOA_CLK_ENABLE();
    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    GPIO_InitStruct.Pin = GPIO_PIN_9;
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    GPIO_InitStruct.Pin = GPIO_PIN_10;
    GPIO_InitStruct.Mode = GPIO_MODE_INPUT;
    GPIO_InitStruct.Pull = GPIO_NOPULL;
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);

    /* USART1 interrupt Init */
    HAL_NVIC_SetPriority(USART1_IRQn, 0, 0);
    HAL_NVIC_EnableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspInit 1 */

  /* USER CODE END USART1_MspInit 1 */
  }
}

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{

  if(uartHandle->Instance==USART1)
  {
  /* USER CODE BEGIN USART1_MspDeInit 0 */

  /* USER CODE END USART1_MspDeInit 0 */
    /* Peripheral clock disable */
    __HAL_RCC_USART1_CLK_DISABLE();

    /**USART1 GPIO Configuration
    PA9     ------> USART1_TX
    PA10     ------> USART1_RX
    */
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);

    /* USART1 interrupt Deinit */
    HAL_NVIC_DisableIRQ(USART1_IRQn);
  /* USER CODE BEGIN USART1_MspDeInit 1 */

  /* USER CODE END USART1_MspDeInit 1 */
  }
}

/* USER CODE BEGIN 1 */
void HAL_UART_RxCpltCallback(UART_HandleTypeDef *huart)
{
    if(huart->Instance == USART1)
    {
        //printf("uart recv now:%02x ", aRxBuffer[0]);
        //printf("\r\n");
        HAL_UART_Transmit(&huart1, aRxBuffer, 1, 1000);
        
        while(__HAL_UART_GET_FLAG(&huart1, UART_FLAG_TC) != SET);
    }
}
/* USER CODE END 1 */

3、stm32f1xx_it.c

stm32f1xx_it.c中根据全局中断的回调判断串口状态并调用接收中断:

/* USER CODE BEGIN Header */
/**
  ******************************************************************************
  * @file    stm32f1xx_it.c
  * @brief   Interrupt Service Routines.
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */

/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "stm32f1xx_it.h"
/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
#include "usart.h"
/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN TD */

/* USER CODE END TD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */

/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */

/* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
/* USER CODE BEGIN PV */

/* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
/* USER CODE BEGIN PFP */

/* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
uint8_t aRxBuffer[RXBUFFERSIZE];
/* USER CODE END 0 */

/* External variables --------------------------------------------------------*/
extern UART_HandleTypeDef huart1;
/* USER CODE BEGIN EV */

/* USER CODE END EV */

/******************************************************************************/
/*           Cortex-M3 Processor Interruption and Exception Handlers          */
/******************************************************************************/
/**
  * @brief This function handles Non maskable interrupt.
  */
void NMI_Handler(void)
{
  /* USER CODE BEGIN NonMaskableInt_IRQn 0 */

  /* USER CODE END NonMaskableInt_IRQn 0 */
  /* USER CODE BEGIN NonMaskableInt_IRQn 1 */
    while (1)
    {
    }

  /* USER CODE END NonMaskableInt_IRQn 1 */
}

/**
  * @brief This function handles Hard fault interrupt.
  */
void HardFault_Handler(void)
{
  /* USER CODE BEGIN HardFault_IRQn 0 */

  /* USER CODE END HardFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_HardFault_IRQn 0 */
    /* USER CODE END W1_HardFault_IRQn 0 */
  }
}

/**
  * @brief This function handles Memory management fault.
  */
void MemManage_Handler(void)
{
  /* USER CODE BEGIN MemoryManagement_IRQn 0 */

  /* USER CODE END MemoryManagement_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_MemoryManagement_IRQn 0 */
    /* USER CODE END W1_MemoryManagement_IRQn 0 */
  }
}

/**
  * @brief This function handles Prefetch fault, memory access fault.
  */
void BusFault_Handler(void)
{
  /* USER CODE BEGIN BusFault_IRQn 0 */

  /* USER CODE END BusFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_BusFault_IRQn 0 */
    /* USER CODE END W1_BusFault_IRQn 0 */
  }
}

/**
  * @brief This function handles Undefined instruction or illegal state.
  */
void UsageFault_Handler(void)
{
  /* USER CODE BEGIN UsageFault_IRQn 0 */

  /* USER CODE END UsageFault_IRQn 0 */
  while (1)
  {
    /* USER CODE BEGIN W1_UsageFault_IRQn 0 */
    /* USER CODE END W1_UsageFault_IRQn 0 */
  }
}

/**
  * @brief This function handles System service call via SWI instruction.
  */
void SVC_Handler(void)
{
  /* USER CODE BEGIN SVCall_IRQn 0 */

  /* USER CODE END SVCall_IRQn 0 */
  /* USER CODE BEGIN SVCall_IRQn 1 */

  /* USER CODE END SVCall_IRQn 1 */
}

/**
  * @brief This function handles Debug monitor.
  */
void DebugMon_Handler(void)
{
  /* USER CODE BEGIN DebugMonitor_IRQn 0 */

  /* USER CODE END DebugMonitor_IRQn 0 */
  /* USER CODE BEGIN DebugMonitor_IRQn 1 */

  /* USER CODE END DebugMonitor_IRQn 1 */
}

/**
  * @brief This function handles Pendable request for system service.
  */
void PendSV_Handler(void)
{
  /* USER CODE BEGIN PendSV_IRQn 0 */

  /* USER CODE END PendSV_IRQn 0 */
  /* USER CODE BEGIN PendSV_IRQn 1 */

  /* USER CODE END PendSV_IRQn 1 */
}

/**
  * @brief This function handles System tick timer.
  */
void SysTick_Handler(void)
{
  /* USER CODE BEGIN SysTick_IRQn 0 */

  /* USER CODE END SysTick_IRQn 0 */
  HAL_IncTick();
  /* USER CODE BEGIN SysTick_IRQn 1 */

  /* USER CODE END SysTick_IRQn 1 */
}

/******************************************************************************/
/* STM32F1xx Peripheral Interrupt Handlers                                    */
/* Add here the Interrupt Handlers for the used peripherals.                  */
/* For the available peripheral interrupt handler names,                      */
/* please refer to the startup file (startup_stm32f1xx.s).                    */
/******************************************************************************/

/**
  * @brief This function handles USART1 global interrupt.
  */
void USART1_IRQHandler(void)
{
  /* USER CODE BEGIN USART1_IRQn 0 */
    uint32_t timeout = 0;
    uint32_t maxDelay = 0x1FFFF;
  /* USER CODE END USART1_IRQn 0 */
  HAL_UART_IRQHandler(&huart1);
  /* USER CODE BEGIN USART1_IRQn 1 */
    timeout = 0;

    while (HAL_UART_GetState(&huart1) != HAL_UART_STATE_READY)//等待就绪
    {
        timeout++; //超时处理

        if(timeout > maxDelay) break;
    }

    timeout = 0;

    memset(aRxBuffer, '\0', sizeof(aRxBuffer));
    while(HAL_UART_Receive_IT(&huart1, (uint8_t *)aRxBuffer, RXBUFFERSIZE) != HAL_OK)//丿次处理完成之后,重新弿启中断并设置RxXferCount丿1
    {
        timeout++; //超时处理

        if(timeout > maxDelay) break;
    }

  /* USER CODE END USART1_IRQn 1 */
}

/* USER CODE BEGIN 1 */

/* USER CODE END 1 */

之后mdk进行编译生成hex即可,这个之前已经章节已经说过了,不再赘述。

五、创建虚拟串口并通过Proteus配置及仿真串口通信

1、创建虚拟串口

参考我这里推荐的串口工具创建一组虚拟串口:https://blog.csdn.net/weixin_39510813/article/details/135069554?spm=1001.2014.3001.5502
或者使用其它虚拟串口工具也可以,只要保证后续有串口可用即可。

2、添加串口元器件及虚拟终端

P后搜索COMPIM后添加:
image.png
添加虚拟终端,在仪器栏选择VIRTUAL TERMINAL即虚拟终端后添加:
image.png

3、接线配置元器件并烧入hex

上节的LED灯我们先可以不动,然后P9、P10对应的口接TXD、RXD,相当于将STM32的TX和RX映射到电脑的虚拟串口上,然后虚拟终端的RX链接串口的RX即可,这样我们通过虚拟串口工具虚拟两个串口,一个串口分配给STM32来映射,一个用来通过串口工具在电脑上进行收发模拟和STM32的串口进行收发。
image.png
对于串口原件还需要选择一下串口,设置一下波特率、停止位这些:
image.png
虚拟终端也需要配置一下:
image.png
之后在STM32元器件上配置一下hex和时钟频率:
image.png

4、进行仿真测试

开始仿真并运行,然后通过串口工具定时发送即可:
GIF.gif

5、可能的问题

  • 1、虚拟终端的串口有时候无法弹出,根据这里顺利解决了(调试-》恢复弹出窗口):

https://blog.csdn.net/qq_36047832/article/details/90609487

  • 2、此外,似乎STM32回显返回给串口的内容总是和发送给STM32的内容不一致,发送的时候是对的,但是返回的时候是乱码,最后发现接收中断的地方没有对接收空间进行memset导致了乱码(此外,还可能和时钟频率有关系,适当调高时钟频率):

image.png
image.png

六、最后

这样子基于串口通信的STM32应用开发基本就入门了,串口通信由于比较常见,所以这里先简要总结了一下,后续的内容就可以通过串口来打印日志了,STM32F103有两组串口,一组我们可以用来打印日志,一组用来和外部通信做交互。接下来我们接着去总结一下按键、蜂鸣器、定时器、看门狗等内容,再考虑继续往下总结I2C、ADC、SPI等接口来读取一些传感器信息以及读写flash等。

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

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

相关文章

VS ASP.Net Core项目还原Packages包到本地(解决服务器没有网无法重新生成的问题)

问题背景 ASP.Net Core MVC项目&#xff0c;无法重新生成。 现场服务器没有网,放上去的代码无法通过nuget还原包到服务器&#xff0c;导致无法编译无法运行。 解决办法 将Packages还原到本机&#xff08;有网&#xff09;&#xff0c;然后再将代码放到服务器运行。 在有网的…

内网渗透测试基础——分析域内网段划分情况及拓扑结构

内网渗透测试基础——分析域内网段划分情况及拓扑结构 ​ 掌握了内网的相关信息后&#xff0c; 渗透测试人员可以分析目标网络的结构和安全防御策略&#xff0c;获取网段信息、各部门的IP地址段&#xff0c;并尝试绘制内网的拓扑结构图。当然&#xff0c;渗透测试人员无法了解…

深入了解Java中的锁机制

目录 1. synchronized关键字 1.1 基本概念 1.2 内置锁 1.3 限制 2. ReentrantLock 2.1 概述 2.2 公平性与非公平性 2.3 条件变量 3. 读写锁&#xff08;ReadWriteLock&#xff09; 3.1 概念 3.2 适用场景 4. StampedLock 4.1 概述 4.2 乐观读与悲观读 4.3 适用场…

仓储1代电子标签接口文档

标签注册 仓储1代注册 侧面按钮连按三次&#xff0c; 注册成功&#xff1a;红灯变绿灯 查询电子标签信息接口 接口地址&#xff1a;192.168.1.200/wms/associate/getTagsMsg 请求类型&#xff1a;multipart/form-data 请求方式&#xff1a;get 接口备注&#xff1a;暂无描…

如何设计用户评论表

作者简介&#xff1a;大家好&#xff0c;我是smart哥&#xff0c;前中兴通讯、美团架构师&#xff0c;现某互联网公司CTO 联系qq&#xff1a;184480602&#xff0c;加我进群&#xff0c;大家一起学习&#xff0c;一起进步&#xff0c;一起对抗互联网寒冬 上一篇提到树形结构是非…

C++_动态二维数组的两种方法

介绍 本文主要介绍使用 动态二维数组的两种方法 (PS:仅作创建 动态二维数组参考,详细使用方法根据需求自行改变) 第一种&#xff1a;连续存储结构的 二维动态数组(需固定 列 大小&#xff0c;可通过下标访问) 缺点: 1.需要在设计二维数组前写死 列 的大小 2.空间利用率不高 优点…

netty源码:(29)ChannelInboundHandlerAdapter

它实现的方法都有一个ChannelHandlerContext参数&#xff0c;它的方法都是直接调用ChannelHandlerContext参数对应的方法&#xff0c;该方法会调用下一个handler对应的方法。 可以继承这个类&#xff0c;重写感兴趣的方法,比如channelRead. 这个类有个子类&#xff1a;SimpleC…

调度算法(一)-第二十一天

目录 各种调度算法的学习思路 先来先服务&#xff08;FCFS&#xff09; 短作业优先&#xff08;SJF&#xff09; 各种调度算法的学习思路 1、算法思想 2、算法规则 3、算法用于作业调度还是进程调度 5、抢占式还是非抢占式 6、优点和缺点 7、是否会导致饥饿&#xff08;进程…

【音视频 | AAC】AAC格式音频文件解析

&#x1f601;博客主页&#x1f601;&#xff1a;&#x1f680;https://blog.csdn.net/wkd_007&#x1f680; &#x1f911;博客内容&#x1f911;&#xff1a;&#x1f36d;嵌入式开发、Linux、C语言、C、数据结构、音视频&#x1f36d; &#x1f923;本文内容&#x1f923;&a…

C++刷题 -- KMP算法

C刷题 – KMP算法 文章目录 C刷题 -- KMP算法1.算法讲解2.算法实现 https://leetcode.cn/problems/find-the-index-of-the-first-occurrence-in-a-string/description/ 1.算法讲解 KMP算法是一种字符串匹配算法&#xff0c;当出现字符串不匹配时&#xff0c;可以记录一部分之…

PSP - 结构生物学中的机器学习 (NIPS MLSB Workshop 2023.12)

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/135120094 Machine Learning in Structural Biology (机器学习在结构生物学中) 网址&#xff1a;https://www.mlsb.io/ Workshop at the 37th Co…

计算机网络-进阶

目录 易混淆物理层数据链路层网络层nat如何实现私有ip通信IP数据报 格式解析tcp 连接tcp流量控制滑动窗口拥塞控制 报文捕获 wireshark路由模拟器 enspcdn代理服务器 VS cdn VS web cache 计算机有了物理地址&#xff0c;为什么还要有ip地址&#xff1f;单播 多播 广播 传输层会…

基于Java+SpringBoot+Mybaties-plus+Vue+ElementUI+Vant 电影院订票管理系统 的设计与实现

一.项目介绍 基于SpringBootVue 电影院订票管理系统 分为前端和后端。 前端&#xff08;用户&#xff09;&#xff1a; 登录后支持查看首页、电影、影院和我的信息 支持查看正在热映和即将上映的电影信息 支持购票&#xff08;需选择影院座位&#xff09;、看过&#xff08;评论…

力扣:203. 移除链表元素(Python3)

题目&#xff1a; 给你一个链表的头节点 head 和一个整数 val &#xff0c;请你删除链表中所有满足 Node.val val 的节点&#xff0c;并返回 新的头节点 。 来源&#xff1a;力扣&#xff08;LeetCode&#xff09; 链接&#xff1a;力扣&#xff08;LeetCode&#xff09;官网 …

基于springboot+mybatis+mysql+jsp房屋租赁管理系统

基于springbootmybatismysqljsp房屋租赁管理系统 一、系统介绍二、功能展示1.项目内容2.项目骨架3.数据库3.登录4.首页5.房源管理6.个人中心7.房屋详情 四、其它1.其他系统实现五.获取源码 一、系统介绍 项目名称&#xff1a;基于Spring boot的房屋租赁管理系统 项目架构&…

对77,539个基因组进行的遗传关联分析揭示了罕见疾病的病因

今天给同学们分享一篇实验文章“Genetic association analysis of 77,539 genomes reveals rare disease etiologies”&#xff0c;这篇文章发表在Nat Med期刊上&#xff0c;影响因子为82.9。 结果解读&#xff1a; 稀有水库 关系型数据库&#xff08;RDB&#xff09;提供了一…

vue关闭当前路由页面并跳转到其父页面

1.dom中添加关闭或取消按钮 <el-button type"primary" class"blueLinearbg cancelBtn" click"cancel" >取 消</el-button>2.cancel方法中 /*取消或关闭*/cancel(){this.$store.dispatch("tagsView/delView", this.$route)…

echarts 实现x轴文字倾斜显示

显示效果 关键代码 xAxis: {axisLabel: {show: true,rotate: 35,//35度角倾斜显示},}, 完全代码 var optSaleType {title: {text: ,textStyle: {color: #000,fontSize: 14}},tooltip: {},grid: {left: 0,right: 0,bottom: 0,containLabel: true,},xAxis: {axisLabel: {show:…

苹果cms论坛多播放源自动采集 /采集在线影视网站/苹果CMS影视站采集器

源码介绍&#xff1a; 苹果cms论坛多播放源自动采集、采集在线影视网站&#xff0c;作为苹果CMS影视站采集器&#xff0c;它能轻松获取在线影视网站资源。 苹果 cms 论坛这是一个基于Vue和Gin实现的在线观影网站。项目采用 vite vue 作为前端技术栈, 使用 ElementPlus 作为 …

基于mpvue的小程序项目搭建的步骤(附精选源码32套,涵盖商城团购等)

mpvue 是美团开源的一套语法与vue.js一致的、快速开发小程序的前端框架&#xff0c;按官网说可以达到小程序与H5界面使用一套代码。使用此框架&#xff0c;开发者将得到完整的 Vue.js 开发体验&#xff0c;同时为 H5 和小程序提供了代码复用的能力。如果想将 H5 项目改造为小程…