STM32F4 STD标准库串口接收例程

STM32F4 STD标准库串口接收中断+空闲中断例程


  • 🔖工程基于STM32F446

✨用惯了STM32CubeMX傻瓜式配置,突然改用标准库写代码,初始化外设内容,总是丢三落四的。

本文将提供3种串口接收和发送模式:串口接收中断+空闲中断串口空闲中断+DMA接收串口DMA接收和发送数据+空闲中断
  • 📍DMA发送参考:https://blog.csdn.net/m0_64354650/article/details/125648186

📗串口接收中断+空闲中断模式例程

📑串口初始化配置
void uart_init(uint32_t bound)
{
    //GPIO端口设置
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;
    NVIC_InitTypeDef NVIC_InitStructure;

    RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE);	//使能USART1,GPIOA时钟
    /* Enable GPIO clock */
    RCC_AHB1PeriphClockCmd(RCC_AHB1Periph_GPIOA, ENABLE);
    /* Connect PXx to USARTx_Tx*/
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource9, GPIO_AF_USART1);

    /* Connect PXx to USARTx_Rx*/
    GPIO_PinAFConfig(GPIOA, GPIO_PinSource10, GPIO_AF_USART1);
    //USART1_TX   GPIOA.9
    /* Configure USART Tx as alternate function  */
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP;
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP;
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;

    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_9;
    GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
    GPIO_Init(GPIOA, &GPIO_InitStructure);

    /* Configure USART Rx as alternate function  */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF;
    GPIO_InitStructure.GPIO_Pin = GPIO_Pin_10;
    GPIO_Init(GPIOA, &GPIO_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 初始化设置
    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

}
📘串口中断函数
void USART1_IRQHandler(void)	//串口1中断服务程序
{
    if(USART_GetITStatus(USART1, USART_IT_RXNE) != RESET) {
        // USART_ClearITPendingBit(USART1, USART_IT_RXNE); //清标志位
//        USART_RX_BUF[length] = USART_ReceiveData(USART1);//读取接收到的数据
         USART_RX_BUF[length] = USART1->DR & 0x0FF;
        length++;
    } else if(USART_GetFlagStatus(USART1, USART_FLAG_IDLE) != RESET) { //空闲帧中断
            USART1->SR; //先读SR.再读DR
            USART1->DR; //清空寄存器
            length = 0;
            USART_RX_STA = 1; //数据接收 标志位
    }

}
📑接收数据所需的变量和宏定义
#define USART_REC_LEN   			64  	//定义最大接收字节数 64
#define EN_USART1_RX 			1		//使能(1)/禁止(0)串口1接收
uint8_t USART_RX_BUF[USART_REC_LEN]; //接收缓冲,最大USART_REC_LEN个字节.
//接收状态
uint8_t USART_RX_STA = 0; //接收状态标记
static __IO uint16_t length = 0;//接收数据时的下标
📒处理接收数据和释放空间
 if(USART_RX_STA) {
            USART_RX_STA = 0;//清标志位
            printf("Re:%s\n", USART_RX_BUF);
            memset(USART_RX_BUF, 0x00, sizeof(USART_RX_BUF));//清空接收数组
        }
  • 🔬测试效果:
    在这里插入图片描述
📚串口接收中断+空闲中断测试工程
链接:https://pan.baidu.com/s/13UxJawYkAkpIb8SzhSnpqg?pwd=8rc0 
提取码:8rc0

📘 串口DMA接收和发送数据+空闲中断 模式

  • 🌿DMA配置
static void USART_DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHB1PeriphClockCmd(USART_TX_DMA_CLK | USART_RX_DMA_CLK, ENABLE);//使能DMA2时钟

    /* 配置发送 */
    DMA_InitStructure.DMA_BufferSize = 0;//随便配置,因为在接收到数据后我们会重新给这值赋值
    DMA_InitStructure.DMA_Channel = USART_TX_DMA_CHANNEL;//串口发送通道
    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//DMA搬运方向:存储器到外设

    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)Rec;//存储器地址
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发模式选择:单次模式
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据宽度:字节
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//使能存储器地址自动递增功能
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA 传输模式选择:一次传输
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_BASE;//外设地址
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发模式选择:单次模式
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据宽度:字节
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//禁止外设地址自动递增功能
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//软件设置数据流的优先级:中等
    /* FIFO不用随便配置 */
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

    DMA_Init(USART_TX_DMA_STREAM, &DMA_InitStructure);
    DMA_Cmd(USART_TX_DMA_STREAM, DISABLE);//发送先失能

    /* 配置接收 */
    DMA_InitStructure.DMA_BufferSize = RX_MAX_LEN;//接收数据的长度
    DMA_InitStructure.DMA_Channel = USART_RX_DMA_CHANNEL;//串口发送通道
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//DMA搬运方向:外设到存储器
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA 传输模式选择:循环接收

    /* 其余配置与上面一样 */
    DMA_Init(USART_RX_DMA_STREAM, &DMA_InitStructure);
    DMA_Cmd(USART_RX_DMA_STREAM, ENABLE);//接收使能
}
  • 🌿串口配置
void USART_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    /* 使能时钟 */
    RCC_AHB1PeriphClockCmd(USART_TX_GPIO_CLK | USART_RX_GPIO_CLK, ENABLE);
    RCC_APB2PeriphClockCmd(USART_CLK, ENABLE);
    /* GPIO相关配置 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF ;//复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP ;//推挽输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//无上拉  无下拉
    GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed ;//高速

    GPIO_InitStructure.GPIO_Pin = USART_TX_PIN;//配置发送引脚
    GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = USART_RX_PIN;//配置接收引脚
    GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure);
    /* 将对应的IO口连接到外设,开始启动复用功能 */
    GPIO_PinAFConfig(USART_TX_GPIO_PORT, USART_TX_SOURCE, USART_TX_AF);
    GPIO_PinAFConfig(USART_RX_GPIO_PORT, USART_RX_SOURCE, USART_RX_AF);

    /* USART1的相关配置 */
    USART_InitStructure.USART_BaudRate = USART_BAUDRATE;//波特率115200
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用硬件流
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx ;//USART模式控制:同时使能接收和发送
    USART_InitStructure.USART_Parity = USART_Parity_No;//校验位选择:不使用校验
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位:1个停止位
    USART_InitStructure.USART_WordLength = USART_WordLength_8b ;//字长(数据位+校验位):8

    USART_Init(USART, &USART_InitStructure);

    USART_NVIC_Config();//中断配置

    USART_DMA_Config();//DMA配置

    USART_ITConfig(USART, USART_IT_IDLE, ENABLE); //开启空闲中断

    USART_DMACmd(USART, USART_DMAReq_Tx | USART_DMAReq_Rx, ENABLE);//使能DMA接收与发送

    USART_Cmd(USART, ENABLE); //使能串口
}
  • 🌿串口中断
//串口中断服务程序
void USART_IRQHandler(void)
{
    uint16_t temp;
    if(USART_GetFlagStatus(USART, USART_FLAG_IDLE) != RESET) {
        temp = USART1->SR;
        temp = USART1->DR;//清除IDLE中断

        temp = DMA_GetCurrDataCounter(USART_RX_DMA_STREAM);//获取剩余的接收数据的量

        DMA_Cmd(USART_RX_DMA_STREAM, DISABLE);

        DMA_SetCurrDataCounter(USART_RX_DMA_STREAM, RX_MAX_LEN);//设置需要接收的量

        DMA_Cmd(USART_RX_DMA_STREAM, ENABLE);


        DMA_Cmd(USART_TX_DMA_STREAM, DISABLE);

        DMA_SetCurrDataCounter(USART_TX_DMA_STREAM, RX_MAX_LEN - temp);//设置需要发送的量

        DMA_Cmd(USART_TX_DMA_STREAM, ENABLE);

        while(USART_GetFlagStatus(USART, USART_FLAG_TC) == RESET); //必须等待,否则最后一位数据错误

        DMA_ClearFlag(USART_TX_DMA_STREAM, DMA_FLAG_TCIF7); //清除DMA传输完成标志

        USART_ClearFlag(USART, USART_FLAG_TC); //清除传输完成标志
    }
}
📚串口DMA接收和发送数据+空闲中断 模式测试代码
链接:https://pan.baidu.com/s/1aAVqOlT7nBd-ZwNN4ZN09g?pwd=3ci8 
提取码:3ci8

📙串口空闲中断+DMA接收模式

  • 🌿DMA配置
static void USART_DMA_Config(void)
{
    DMA_InitTypeDef DMA_InitStructure;

    RCC_AHB1PeriphClockCmd(USART_RX_DMA_CLK, ENABLE);//使能DMA2时钟

    /* 配置发送 */
//    DMA_InitStructure.DMA_BufferSize = 0;//随便配置,因为在接收到数据后我们会重新给这值赋值
//    DMA_InitStructure.DMA_Channel = USART_TX_DMA_CHANNEL;//串口发送通道
//    DMA_InitStructure.DMA_DIR = DMA_DIR_MemoryToPeripheral;//DMA搬运方向:存储器到外设

    DMA_InitStructure.DMA_Memory0BaseAddr = (uint32_t)USART_RX_BUF;//存储器地址
    DMA_InitStructure.DMA_MemoryBurst = DMA_MemoryBurst_Single;//存储器突发模式选择:单次模式
    DMA_InitStructure.DMA_MemoryDataSize = DMA_MemoryDataSize_Byte;//存储器数据宽度:字节
    DMA_InitStructure.DMA_MemoryInc = DMA_MemoryInc_Enable ;//使能存储器地址自动递增功能
    DMA_InitStructure.DMA_Mode = DMA_Mode_Normal;//DMA 传输模式选择:一次传输
    DMA_InitStructure.DMA_PeripheralBaseAddr = USART_DR_BASE;//外设地址
    DMA_InitStructure.DMA_PeripheralBurst = DMA_PeripheralBurst_Single;//外设突发模式选择:单次模式
    DMA_InitStructure.DMA_PeripheralDataSize = DMA_PeripheralDataSize_Byte;//外设数据宽度:字节
    DMA_InitStructure.DMA_PeripheralInc = DMA_PeripheralInc_Disable;//禁止外设地址自动递增功能
    DMA_InitStructure.DMA_Priority = DMA_Priority_Medium;//软件设置数据流的优先级:中等
    /* FIFO不用随便配置 */
    DMA_InitStructure.DMA_FIFOMode = DMA_FIFOMode_Disable;
    DMA_InitStructure.DMA_FIFOThreshold = DMA_FIFOThreshold_HalfFull;

//    DMA_Init(USART_TX_DMA_STREAM, &DMA_InitStructure);
//    DMA_Cmd(USART_TX_DMA_STREAM, DISABLE);//发送先失能

    /* 配置接收 */
    DMA_InitStructure.DMA_BufferSize = RX_MAX_LEN;//接收数据的长度
    DMA_InitStructure.DMA_Channel = USART_RX_DMA_CHANNEL;//串口发送通道
    DMA_InitStructure.DMA_DIR = DMA_DIR_PeripheralToMemory;//DMA搬运方向:外设到存储器
    DMA_InitStructure.DMA_Mode = DMA_Mode_Circular;//DMA 传输模式选择:循环接收

    /* 其余配置与上面一样 */
    DMA_Init(USART_RX_DMA_STREAM, &DMA_InitStructure);
    DMA_Cmd(USART_RX_DMA_STREAM, ENABLE);//接收使能
}


  • 🌿串口配置
void USART_Config(void)
{
    GPIO_InitTypeDef GPIO_InitStructure;
    USART_InitTypeDef USART_InitStructure;

    /* 使能时钟 */
    RCC_AHB1PeriphClockCmd(USART_TX_GPIO_CLK | USART_RX_GPIO_CLK, ENABLE);
    RCC_APB2PeriphClockCmd(USART_CLK, ENABLE);
    /* GPIO相关配置 */
    GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF ;//复用功能
    GPIO_InitStructure.GPIO_OType = GPIO_OType_PP ;//推挽输出
    GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL ;//无上拉  无下拉
    GPIO_InitStructure.GPIO_Speed = GPIO_High_Speed ;//高速

    GPIO_InitStructure.GPIO_Pin = USART_TX_PIN;//配置发送引脚
    GPIO_Init(USART_TX_GPIO_PORT, &GPIO_InitStructure);

    GPIO_InitStructure.GPIO_Pin = USART_RX_PIN;//配置接收引脚
    GPIO_Init(USART_RX_GPIO_PORT, &GPIO_InitStructure);
    /* 将对应的IO口连接到外设,开始启动复用功能 */
    GPIO_PinAFConfig(USART_TX_GPIO_PORT, USART_TX_SOURCE, USART_TX_AF);
    GPIO_PinAFConfig(USART_RX_GPIO_PORT, USART_RX_SOURCE, USART_RX_AF);

    /* USART1的相关配置 */
    USART_InitStructure.USART_BaudRate = USART_BAUDRATE;//波特率115200
    USART_InitStructure.USART_HardwareFlowControl = USART_HardwareFlowControl_None;//不使用硬件流
    USART_InitStructure.USART_Mode = USART_Mode_Tx | USART_Mode_Rx ;//USART模式控制:同时使能接收和发送
    USART_InitStructure.USART_Parity = USART_Parity_No;//校验位选择:不使用校验
    USART_InitStructure.USART_StopBits = USART_StopBits_1;//停止位:1个停止位
    USART_InitStructure.USART_WordLength = USART_WordLength_8b ;//字长(数据位+校验位):8

    USART_Init(USART, &USART_InitStructure);

    USART_NVIC_Config();//中断配置

    USART_DMA_Config();//DMA配置

    USART_ITConfig(USART, USART_IT_IDLE, ENABLE); //开启空闲中断

    USART_DMACmd(USART, USART_DMAReq_Rx, ENABLE);//使能DMA接收

    USART_Cmd(USART, ENABLE); //使能串口
}




-🌿 中断配置

//串口中断服务程序
void USART_IRQHandler(void)
{
    uint16_t temp;
    if(USART_GetFlagStatus(USART, USART_FLAG_IDLE) != RESET) {
        temp = USART1->SR;
        temp = USART1->DR;//清除IDLE中断
			
				USART_RX_STA = 1; //数据接收 标志位
			
        temp = DMA_GetCurrDataCounter(USART_RX_DMA_STREAM);//获取剩余的接收数据的量

        DMA_Cmd(USART_RX_DMA_STREAM, DISABLE);

        DMA_SetCurrDataCounter(USART_RX_DMA_STREAM, RX_MAX_LEN);//设置需要接收的量

        DMA_Cmd(USART_RX_DMA_STREAM, ENABLE);

    }
}
📚串口空闲中断+DMA接收模式例程代码
链接:https://pan.baidu.com/s/1R8F0R4KzjVTCR8zd2V-lVA?pwd=j595 
提取码:j595

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

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

相关文章

Vue组件生命周期深度剖析:从创建到销毁的八大钩子实战指南

系列文章目录 Vue核心指令解析:探索MVVM与数据操作之美 文章目录 系列文章目录前言一、Vue生命周期是什么?二、钩子函数讲解1. beforeCreate( 创建前 )2. created ( 创建后 )3. beforeMount(挂载前)4. mounted&#xf…

深度学习之数据集 Dataset总结

数据集 Dataset MindSpore提供了基于Pipeline的数据引擎,通过Dataset和Transforms实现高效的数据预处理。它提供了内置的文本、图像、音频等数据集加载接口,并提供了自定义数据集加载接口。此外,MindSpore的领域开发库也提供了大量的预加载数…

[leetcode]the-skyline-problem 天际线问题

. - 力扣&#xff08;LeetCode&#xff09; class Solution { public:vector<vector<int>> getSkyline(vector<vector<int>>& buildings) {auto cmp [](const pair<int, int>& a, const pair<int, int>& b) -> bool { ret…

GPT-5:博士级智能的破晓,人工智能的新里程碑

随着科技的飞速发展&#xff0c;人工智能领域再次迎来了一场革命性的突破。备受瞩目的新一代大语言模型GPT-5即将在一年半之后发布&#xff0c;这一创新不仅将再次刷新人们对人工智能的认知&#xff0c;更有可能在多个领域展现出超越人类博士级智能的卓越能力。本文将对GPT-5的…

【技术解码】百数SRM:如何助力企业快速优化供应链管理?

SRM应用是企业优化供应链管理的重要工具&#xff0c;它帮助企业全面管理供应商关系&#xff0c;从评估、选择到协同合作和绩效监控&#xff0c;确保供应链的稳定性和效率。 对于企业来说&#xff0c;通过全面管理供应商关系&#xff0c;可以降低采购风险&#xff0c;提升产品质…

秋招突击——6/25——复习{单调队列优化——最大子序列和,单调队列优化——修剪草坪}——新作{搜索插入位置}

文章目录 引言复习单调队列优化——最大子序列和个人实现 单调队列优化——修建草坪个人实现参考实现 新作搜搜插入位置个人实现参考实现 总结 引言 明天要去上海了&#xff0c;今天要打印很多东西&#xff0c;准备很多材料&#xff0c;包括请假&#xff0c;所以上午没有时间刷…

领夹麦买哪个牌子的好用点?一文看懂领夹麦克风什么牌子的好

自媒体时代的兴起&#xff0c;给了普通人很多的机会&#xff0c;尤其短视频的兴起更是让无数热情&#xff0c;有创作之心的人跃跃欲试。于是乎越来越多的人纷纷拿起了手机到各个平台去展示自己的才华&#xff0c;或者通过vlog记录分享自己的简单生活。 不过在分享和创作的输出时…

电脑屏幕花屏怎么办?5个方法解决问题!

“我刚刚打开电脑就发现我的电脑屏幕出现了花屏的情况。这让我很困惑&#xff0c;我应该怎么解决这个问题呢&#xff1f;求帮助。” 在这个数字时代的浪潮中&#xff0c;电脑早已成为我们生活中不可或缺的一部分。然而&#xff0c;当你正沉浸在紧张的游戏对战中&#xff0c;或是…

第七届IAIC(成都)国际医美产业大会在蓉召开

四川省人民医院新丽美获“中国整形美容协会医疗救助与修复基金-成都市整形修复定点医院”“‘放心美 医无忧’全过程保障示范医院”两块授牌 2024年6月24日&#xff0c;第七届IAIC&#xff08;成都&#xff09;国际医美产业大会暨“医美之都”高峰会议省医院新丽美整形修复基地…

龙芯CPU架构上使用向日葵远程工具

原文链接&#xff1a;龙芯CPU架构上使用向日葵远程工具 Hello&#xff0c;大家好啊&#xff01;今天给大家带来一篇在龙芯CPU上使用向日葵远程控制软件的文章。向日葵是一款强大的远程控制软件&#xff0c;能够帮助用户轻松地实现远程桌面访问和控制。本文将详细介绍如何在龙芯…

Android 11 ,默认授予预置应用/APK 需要的权限,解决permission denied for window type 2003 问题。

写这篇文章的原因是解决了一个APP闪退的问题&#xff0c;闪退的原因是插拔U盘时&#xff0c;注册的广播接收者接收到广播需要弹出一个Dialog询问是否需要打开U盘&#xff0c;这个Dialog设置的是系统级别悬浮窗&#xff0c;没有这个权限&#xff0c;报错导致闪退&#xff0c;下面…

Java-拼接字符串数组(String.join()方法)

问题引入 刷算法题lc2288的时候遇见的一个小细节&#xff0c;记录一下&#xff0c;有兴趣的朋友可以做一下&#xff0c;练习一下哈哈~ 此题需要使用大家都比较熟悉的split方法将句子按照空格拆分为字符串数组。 然后再在数组中对每一个字符串操作&#xff0c;操作完成后要求…

气膜体育馆的使用年限有多少—轻空间

气膜体育馆作为一种新兴的建筑形式&#xff0c;因其独特的结构和功能而备受青睐。它不仅在建设速度、成本控制和环保方面具有显著优势&#xff0c;还在使用年限上展现出良好的性能。轻空间将探讨气膜体育馆的使用年限及其影响因素。 气膜体育馆的基本结构 气膜体育馆主要由膜材…

在数字化营销中如何提高用户参与度和留存率

在当今数字化时代&#xff0c;如何有效地提高用户参与度和留存率成为企业营销的关键课题。蚓链在此为您揭示可采取的一系列重要措施。 在提高用户参与度方面&#xff1a; 其一&#xff0c;通过深入的数据分析洞察用户偏好与行为模式&#xff0c;进而提供高度个性化的内容、精…

录制视频怎么操作?手把手教会你!

在这个互联网科技高速发展的时代&#xff0c;录制视频已经成为了人们生活中一个不可或缺的技能。无论是记录游戏精彩瞬间、制作教程、分享生活趣事&#xff0c;还是进行在线教学&#xff0c;录制视频都是一种非常直观有效的方式。可是录制视频怎么操作呢&#xff1f;本文将介绍…

运行ChatGLM大模型时,遇到的各种报错信息及解决方法

①IMPORTANT: You are using gradio version 3.49.0, however version 4.29.0 is available, please upgrade 原因分析&#xff1a; 因为使用的gradio版本过高&#xff0c;使用较低版本。 pip install gradio3.49.0 会有提示IMPORTANT: You are using gradio version 3.49.…

Javac编译器

Java语言的编译器是一段不确定的操作过程&#xff0c;可能是讲Java文件转变为class文件的过程&#xff0c;也可能是指虚拟机的后端编译&#xff0c;讲字节码转换为机器码的过程&#xff0c;还肯是静态提前编译器直接讲Java文件编译为本地机器代码的过程。 前端编译器&#xff…

DevExpress WPF中文教程:Grid - 如何排序、分组、过滤数据(设计时)?

DevExpress WPF拥有120个控件和库&#xff0c;将帮助您交付满足甚至超出企业需求的高性能业务应用程序。通过DevExpress WPF能创建有着强大互动功能的XAML基础应用程序&#xff0c;这些应用程序专注于当代客户的需求和构建未来新一代支持触摸的解决方案。 无论是Office办公软件…

php反序列化漏洞简介

目录 php序列化和反序列化简介 序列化 反序列化 类中定义的属性 序列化实例 反序列化实例 反序列化漏洞 序列化返回的字符串格式 魔术方法和反序列化利用 绕过wakeup 靶场实战 修复方法 php序列化和反序列化简介 序列化 将对象状态转换为可保持或可传输的格式的…

构建家庭NAS之三:在TrueNAS SCALE上安装qBittorrent

本系列文章索引&#xff1a; 构建家庭NAS之一&#xff1a;用途和软硬件选型 构建家庭NAS之二&#xff1a;TrueNAS Scale规划、安装与配置 构建家庭NAS之三&#xff1a;在TrueNAS SCALE上安装qBittorrent 大部分家庭NAS用户应该都会装一个下载工具。本篇以qBittorrent为例&…