STM32G474单片机_串口中断接收和发送

server/2024/9/20 2:33:12/ 标签: 单片机, stm32, 嵌入式硬件, 经验分享, KEIL, MDK-ARM, USART

在使用STM32G474单片机串口时,若将UART_HandleTypeDef定义的变量,用作全局变量时,确实很浪费内存,若不定义为全局变量,就无法使用HAL库自带的串口函数。若采用自定义的宏来实现标准库的部分功能,就可将UART_HandleTypeDef型变量定义为局部变量

1、自己定义的“串口宏定义”

#define _HAL_UART_SendByte(Instance, __DATA__) Instance->TDR = ( (__DATA__) & (uint16_t)0x01FF );
//将(__DATA__)写入串口发送缓冲区

#define _HAL_UART_ReceiveByte( Instance ) ( (uint16_t)( Instance->RDR & (uint16_t)0x01FF) )
//读串口接收缓冲区

/** @brief  Enable the specified UART interrupt.
  * @param  Instance specifies the UARTx.
  * @param  __INTERRUPT__ specifies the UART interrupt source to enable.
  *          This parameter can be one of the following values:
  *            @arg @ref UART_IT_RXFF  RXFIFO Full interrupt
  *            @arg @ref UART_IT_TXFE  TXFIFO Empty interrupt
  *            @arg @ref UART_IT_RXFT  RXFIFO threshold interrupt
  *            @arg @ref UART_IT_TXFT  TXFIFO threshold interrupt
  *            @arg @ref UART_IT_WUF   Wakeup from stop mode interrupt
  *            @arg @ref UART_IT_CM    Character match interrupt
  *            @arg @ref UART_IT_CTS   CTS change interrupt
  *            @arg @ref UART_IT_LBD   LIN Break detection interrupt
  *            @arg @ref UART_IT_TXE   Transmit Data Register empty interrupt
  *            @arg @ref UART_IT_TXFNF TX FIFO not full interrupt
  *            @arg @ref UART_IT_TC    Transmission complete interrupt
  *            @arg @ref UART_IT_RXNE  Receive Data register not empty interrupt
  *            @arg @ref UART_IT_RXFNE RXFIFO not empty interrupt
  *            @arg @ref UART_IT_IDLE  Idle line detection interrupt
  *            @arg @ref UART_IT_PE    Parity Error interrupt
  *            @arg @ref UART_IT_ERR   Error interrupt (frame error, noise error, overrun error)
  * @retval None
  */

#define _HAL_UART_ENABLE_IT(Instance, __INTERRUPT__)   (((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U)? (Instance->CR1 |= (1U << ((__INTERRUPT__) & UART_IT_MASK))): \
                                                           ((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U)? (Instance->CR2 |= (1U << ((__INTERRUPT__) & UART_IT_MASK))): \
                                                           (Instance->CR3 |= (1U << ((__INTERRUPT__) & UART_IT_MASK))))

/** @brief  Disable the specified UART interrupt.
  * @param  Instance specifies the UARTx.
  * @param  __INTERRUPT__ specifies the UART interrupt source to disable.
  *          This parameter can be one of the following values:
  *            @arg @ref UART_IT_RXFF  RXFIFO Full interrupt
  *            @arg @ref UART_IT_TXFE  TXFIFO Empty interrupt
  *            @arg @ref UART_IT_RXFT  RXFIFO threshold interrupt
  *            @arg @ref UART_IT_TXFT  TXFIFO threshold interrupt
  *            @arg @ref UART_IT_WUF   Wakeup from stop mode interrupt
  *            @arg @ref UART_IT_CM    Character match interrupt
  *            @arg @ref UART_IT_CTS   CTS change interrupt
  *            @arg @ref UART_IT_LBD   LIN Break detection interrupt
  *            @arg @ref UART_IT_TXE   Transmit Data Register empty interrupt
  *            @arg @ref UART_IT_TXFNF TX FIFO not full interrupt
  *            @arg @ref UART_IT_TC    Transmission complete interrupt
  *            @arg @ref UART_IT_RXNE  Receive Data register not empty interrupt
  *            @arg @ref UART_IT_RXFNE RXFIFO not empty interrupt
  *            @arg @ref UART_IT_IDLE  Idle line detection interrupt
  *            @arg @ref UART_IT_PE    Parity Error interrupt
  *            @arg @ref UART_IT_ERR   Error interrupt (Frame error, noise error, overrun error)
  * @retval None
  */

#define _HAL_UART_DISABLE_IT(Instance, __INTERRUPT__)  (((((uint8_t)(__INTERRUPT__)) >> 5U) == 1U)? (Instance->CR1 &= ~ (1U << ((__INTERRUPT__) & UART_IT_MASK))): \
                                                           ((((uint8_t)(__INTERRUPT__)) >> 5U) == 2U)? (Instance->CR2 &= ~ (1U << ((__INTERRUPT__) & UART_IT_MASK))): \
                                                           (Instance->CR3 &= ~ (1U << ((__INTERRUPT__) & UART_IT_MASK))))


/** @brief  Check whether the specified UART flag is set or not.
  * @param  Instance specifies the UART Handle.
  * @param  __FLAG__ specifies the flag to check.
  *        This parameter can be one of the following values:
  *            @arg @ref UART_FLAG_TXFT  TXFIFO threshold flag
  *            @arg @ref UART_FLAG_RXFT  RXFIFO threshold flag
  *            @arg @ref UART_FLAG_RXFF  RXFIFO Full flag
  *            @arg @ref UART_FLAG_TXFE  TXFIFO Empty flag
  *            @arg @ref UART_FLAG_REACK Receive enable acknowledge flag
  *            @arg @ref UART_FLAG_TEACK Transmit enable acknowledge flag
  *            @arg @ref UART_FLAG_WUF   Wake up from stop mode flag
  *            @arg @ref UART_FLAG_RWU   Receiver wake up flag (if the UART in mute mode)
  *            @arg @ref UART_FLAG_SBKF  Send Break flag
  *            @arg @ref UART_FLAG_CMF   Character match flag
  *            @arg @ref UART_FLAG_BUSY  Busy flag
  *            @arg @ref UART_FLAG_ABRF  Auto Baud rate detection flag
  *            @arg @ref UART_FLAG_ABRE  Auto Baud rate detection error flag
  *            @arg @ref UART_FLAG_CTS   CTS Change flag
  *            @arg @ref UART_FLAG_LBDF  LIN Break detection flag
  *            @arg @ref UART_FLAG_TXE   Transmit data register empty flag
  *            @arg @ref UART_FLAG_TXFNF UART TXFIFO not full flag
  *            @arg @ref UART_FLAG_TC    Transmission Complete flag
  *            @arg @ref UART_FLAG_RXNE  Receive data register not empty flag
  *            @arg @ref UART_FLAG_RXFNE UART RXFIFO not empty flag
  *            @arg @ref UART_FLAG_IDLE  Idle Line detection flag
  *            @arg @ref UART_FLAG_ORE   Overrun Error flag
  *            @arg @ref UART_FLAG_NE    Noise Error flag
  *            @arg @ref UART_FLAG_FE    Framing Error flag
  *            @arg @ref UART_FLAG_PE    Parity Error flag
  * @retval The new state of __FLAG__ (TRUE or FALSE).
  */

#define _HAL_UART_GET_FLAG(Instance, __FLAG__) ((Instance->ISR & (__FLAG__)) == (__FLAG__))

/** @brief  Clear the specified UART pending flag.
  * @param  Instance specifies the UART Handle.
  * @param  __FLAG__ specifies the flag to check.
  *          This parameter can be any combination of the following values:
  *            @arg @ref UART_CLEAR_PEF      Parity Error Clear Flag
  *            @arg @ref UART_CLEAR_FEF      Framing Error Clear Flag
  *            @arg @ref UART_CLEAR_NEF      Noise detected Clear Flag
  *            @arg @ref UART_CLEAR_OREF     Overrun Error Clear Flag
  *            @arg @ref UART_CLEAR_IDLEF    IDLE line detected Clear Flag
  *            @arg @ref UART_CLEAR_TXFECF   TXFIFO empty clear Flag
  *            @arg @ref UART_CLEAR_TCF      Transmission Complete Clear Flag
  *            @arg @ref UART_CLEAR_LBDF     LIN Break Detection Clear Flag
  *            @arg @ref UART_CLEAR_CTSF     CTS Interrupt Clear Flag
  *            @arg @ref UART_CLEAR_CMF      Character Match Clear Flag
  *            @arg @ref UART_CLEAR_WUF      Wake Up from stop mode Clear Flag
  * @retval None
  */

#define _HAL_UART_CLEAR_FLAG(Instance, __FLAG__) (Instance->ICR = (__FLAG__))

2、串口初始化

//将PA9复用为USART1_TX
//将PA10复用为USART1_RX
//本程序适合在中断程序中处理接收和在中断程序中处理发送

uint8_t USART1_RX_Buffer[USART1_RX_Buffer_Size]; //USART1接收缓冲区数组
uint8_t USART1_RX_Buffer_Load_Index;          //USART1_RX_Buffer[]的装载索引值

uint8_t USART1_TX_Buffer[USART1_TX_Buffer_Size]; //USART1发送缓冲区数组
uint8_t USART1_TX_Buffer_Load_Index;          //USART1_TX_Buffer[]的装载索引值
uint8_t USART1_TX_Buffer_Send_Index;          //发送下标值

void USART1_Init(uint32_t baudrate);
void USART1_Load_Send_Data(void);
void Start_USART1_Send_Data(void);

void USART1_Init(uint32_t baudrate)
{
    UART_HandleTypeDef HardwareUSART1;

    HardwareUSART1.Instance = USART1;
    HAL_UART_DeInit(&HardwareUSART1);
  //目的是令HardwareUSART1.gState = HAL_UART_STATE_RESET;
    //允许HAL_UART_Init()执行时,会先调用HAL_UART_MspInit()

  HardwareUSART1.Init.BaudRate = baudrate;              //波特率
  HardwareUSART1.Init.WordLength = UART_WORDLENGTH_8B;  //字长为8位数据格式
  HardwareUSART1.Init.StopBits = UART_STOPBITS_1;       //一个停止位
  HardwareUSART1.Init.Parity = UART_PARITY_NONE;        //无奇偶校验位
  HardwareUSART1.Init.Mode = UART_MODE_TX_RX;           //收发模式
  HardwareUSART1.Init.HwFlowCtl = UART_HWCONTROL_NONE;  //无硬件流控
  HardwareUSART1.Init.OverSampling = UART_OVERSAMPLING_16; //过采样率
  HardwareUSART1.Init.OneBitSampling = UART_ONE_BIT_SAMPLE_DISABLE;
    HardwareUSART1.AdvancedInit.AdvFeatureInit = UART_ADVFEATURE_NO_INIT;
  HardwareUSART1.AdvancedInit.AutoBaudRateEnable = UART_ADVFEATURE_AUTOBAUDRATE_DISABLE;
  HardwareUSART1.AdvancedInit.AutoBaudRateMode = UART_ADVFEATURE_AUTOBAUDRATE_ONSTARTBIT;
  HardwareUSART1.Init.ClockPrescaler = UART_PRESCALER_DIV1;
    HardwareUSART1.FifoMode=UART_FIFOMODE_DISABLE;
  if (HAL_UART_Init(&HardwareUSART1) != HAL_OK)
  {
    Error_Handler();
  }

使用“中断发送和接收”配置开始/

    __HAL_UART_CLEAR_FLAG(&HardwareUSART1, UART_CLEAR_TCF);
    //Transmission Complete Clear Flag

    __HAL_UART_ENABLE_IT(&HardwareUSART1, UART_IT_RXNE);
    开启串口接收中断
    //串口接收数据时,使能"接收数据寄存器不为空"则产生中断(位RXNE=1)
    //Enable the UART Data Register not empty Interrupt

    __HAL_UART_DISABLE_IT(&HardwareUSART1, UART_IT_TXE);
    //串口发送数据时,不使能"串口发送数据寄存器为空"产生中断(位TXE=0)
    //Disable the UART Transmit Complete Interrupt

    __HAL_UART_DISABLE_IT(&HardwareUSART1,UART_IT_TC);
    //串口发送数据时,不使能"串口发送完成"产生中断(位TC=1)

    HAL_NVIC_EnableIRQ(USART1_IRQn);
    HAL_NVIC_SetPriority(USART1_IRQn,8,0);
    //设置NVIC中断分组4:4位抢占优先级,0位响应优先级
    //选择中断优先级组4,即抢占优先级为4位,取值为0~15,响应优先级组为0位,取值为0
使用“中断发送和接收”配置结束/

    USART1_RX_Buffer_Load_Index = 0;
    memset(USART1_RX_Buffer,0,USART1_RX_Buffer_Size);
}

//HAL_UART_Init()执行时,会先调用HAL_UART_MspInit()
void HAL_UART_MspInit(UART_HandleTypeDef* uartHandle)
{
  GPIO_InitTypeDef GPIO_InitStruct = {0};
  RCC_PeriphCLKInitTypeDef PeriphClkInit = {0};
  if(uartHandle->Instance==USART1)
  {
    PeriphClkInit.PeriphClockSelection = RCC_PERIPHCLK_USART1;
    PeriphClkInit.Usart1ClockSelection = RCC_USART1CLKSOURCE_PCLK2;
    if (HAL_RCCEx_PeriphCLKConfig(&PeriphClkInit) != HAL_OK)
    { //HAL_RCCEx_PeriphCLKConfig()初始化USART1外设时钟
            //Initializes the peripherals clocks

      Error_Handler();
    }

    __HAL_RCC_USART1_CLK_ENABLE(); //使能USART1外设时钟

    __HAL_RCC_GPIOA_CLK_ENABLE();  //使能GPIOA外设时钟
    GPIO_InitStruct.Pin = GPIO_PIN_9|GPIO_PIN_10;//选择引脚编号9和10
    GPIO_InitStruct.Mode = GPIO_MODE_AF_PP;      //复用功能推挽模式
    GPIO_InitStruct.Pull = GPIO_NOPULL;          //不用上拉
    GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW; //引脚速度为低速
    GPIO_InitStruct.Alternate = GPIO_AF7_USART1; //将引脚复用为USART1
    HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
  }
}

//HAL_UART_DeInit()执行时,会先调用HAL_UART_MspDeInit()
//其实这个程序没什么用

void HAL_UART_MspDeInit(UART_HandleTypeDef* uartHandle)
{
  if(uartHandle->Instance==USART1)
  {
    __HAL_RCC_USART1_CLK_DISABLE();//不使能USART1外设时钟
    HAL_GPIO_DeInit(GPIOA, GPIO_PIN_9|GPIO_PIN_10);
  }
}

3、启动发送

void Start_USART1_Send_Data(void)
{
    char i;

    for(i=0;i<USART1_RX_Buffer_Size;i++)//串口接送测试
    {
        if(USART1_RX_Buffer[i-1]=='\r'&&USART1_RX_Buffer[i]=='\n')//收到结束符号
        {
            USART1_RX_Buffer_Load_Index = 0;
            memset(USART1_TX_Buffer,0,USART1_TX_Buffer_Size);
            strcpy((char*)USART1_TX_Buffer,(char*)USART1_RX_Buffer);
            memset(USART1_RX_Buffer,0,USART1_RX_Buffer_Size);
            USART1_Load_Send_Data();
        }
  }
}

//函数功能:启动串口1发送
void USART1_Load_Send_Data(void)
{
    uint16_t k;

    k=strlen((char*)USART1_TX_Buffer);
    USART1_TX_Buffer_Load_Index = k;
    
启动发送/
    _HAL_UART_SendByte(USART1,USART1_TX_Buffer[0]);
    //发送一个字节
  //启动发送

    USART1_TX_Buffer_Send_Index=1;
    _HAL_UART_ENABLE_IT(USART1,UART_IT_TXE);//启动发送///
    //将"串口控制寄存器1(USART_CR1)中的TXEIE位"设置为1
    //串口发送数据时,使能"串口发送数据寄存器为空"产生中断(位TXEIE=1)
    //Enable the UART Transmit Complete Interrupt

}

4、串口中断程序

void USART1_IRQHandler(void)
{
    uint8_t RX_temp;

    (void)RX_temp;//防止RX_temp不使用而产生警告

    if( _HAL_UART_GET_FLAG(USART1,UART_FLAG_RXNE) )
    {//在串口状态寄存器中,发现RXNE=1
        RX_temp =_HAL_UART_ReceiveByte(USART1);//读串口数据

        USART1_RX_Buffer[USART1_RX_Buffer_Load_Index] = RX_temp;//保存接收到的新数据
        USART1_RX_Buffer_Load_Index++;
        if(USART1_RX_Buffer_Load_Index>=USART1_RX_Buffer_Size-2)
        {
            USART1_RX_Buffer[USART1_RX_Buffer_Size-2]='\0';
            USART1_RX_Buffer_Load_Index = 0;//防止USART1_RX_Buffer[]溢出
        }
        if(USART1_RX_Buffer[USART1_RX_Buffer_Load_Index-2]=='\r'&&USART1_RX_Buffer[USART1_RX_Buffer_Load_Index-1]=='\n')
        {//收到"\r\n"结束符号
            USART1_RX_Buffer[USART1_RX_Buffer_Load_Index]='\0';
            USART1_RX_Buffer_Load_Index++;
        }
        //软件先读"串口状态寄存器(USART_ISR)",然后再读"串口数据寄存器USART_RDR",就可以将ORE位(Overrun错误标志)清零;
        //软件先读"串口状态寄存器(USART_ISR)",然后再读"串口数据寄存器USART_RDR",就可以将NE位(噪声错误标志)清零;
        //软件先读"串口状态寄存器(USART_ISR)",然后再读"串口数据寄存器USART_RDR",就可以将FE位(帧错误标志)清零;
        //软件先读"串口状态寄存器(USART_ISR)",然后再读"串口数据寄存器USART_RDR",就可以将PE位(奇偶校验值错误)清零;
        //软件读"串口数据寄存器USART_RDR",就可以将RXNE位清零

    }

  if( _HAL_UART_GET_FLAG(USART1,USART_ISR_TXE) )
    {
        _HAL_UART_CLEAR_FLAG(USART1,UART_CLEAR_TCF);//清除TXE标志位
        if(USART1_TX_Buffer_Send_Index < USART1_TX_Buffer_Load_Index) //未发送完全部数据
        {
        _HAL_UART_SendByte(USART1,USART1_TX_Buffer[USART1_TX_Buffer_Send_Index]);
        //将USART1_TX_Buffer[USART1_TX_Buffer_Send_Index]的值写入串口发送"串口发送数据寄存器"
            USART1_TX_Buffer_Send_Index++;
        }
        else
        {
        _HAL_UART_DISABLE_IT(USART1,UART_IT_TXE);
        //串口发送数据时,不使能"串口发送数据寄存器为空"产生中断(位TXE=0)
        //Disabless Transmit Data Register empty interrupt

          _HAL_UART_ENABLE_IT(USART1,UART_IT_TC);
            //将"串口控制寄存器1(USART_CR1)中的TCIE位"设置为1
            //串口发送数据时,使能"串口发送完成"产生中断(位TCIE=1)
            //Enables Transmission complete interrupt  
 
        }
    }
    if( _HAL_UART_GET_FLAG(USART1,USART_ISR_TC) )
    {
        _HAL_UART_CLEAR_FLAG(USART1,UART_CLEAR_TCF);

        _HAL_UART_DISABLE_IT(USART1,UART_IT_TC);
        //将"串口控制寄存器1(USART_CR1)中的TCIE位"设置为0
        //串口发送数据时,不使能"串口发送完成"产生中断(位TCIE=0)
        //Disable the UART Transmit Complete Interrupt

        USART1_TX_Buffer_Send_Index = 0;//清除USART1_TX_Buffer[]的发送索引值
        USART1_TX_Buffer_Load_Index = 0;//清除USART1_TX_Buffer[]的装载索引值
    }
}


http://www.ppmy.cn/server/102283.html

相关文章

electron 中的ipcMain.handle和ipcMain.on 的区别

在Electron中,ipcMain.handle和ipcMain.on是主进程(main process)用于处理来自渲染进程(renderer process)消息的两个主要方法,它们之间存在明显的区别,主要体现在消息处理的同步性、响应方式和应用场景上。 ipcMain.on 同步性:ipcMain.on是异步的。当渲染进程通过ipc…

怎么利用住宅代理实现高效数据抓取

在大数据时代&#xff0c;数据抓取已成为企业和研究人员不可或缺的工具。在当今社会不论是市场分析、竞争情报收集&#xff0c;还是社交媒体数据挖掘&#xff0c;都需要首先获取到大量的公开数据&#xff0c;通过分析数据进行下一步的策划。然而&#xff0c;随着网站对数据抓取…

python提取b站视频的音频(提供源码

如果我想开一家咖啡厅&#xff0c;那么咖啡厅的音乐可得精挑细选&#xff01;又假设我非常喜欢o叔&#xff0c;而o叔只在b站弹钢琴&#xff0c;那这时候我就得想方设法把b站的视频转为音频咯&#xff01; 一、首先打开网页版bilibili&#xff0c;按F12&#xff1a; 二、刷新页面…

ABBYY FineReader PDF v16.0 中文绿色便携免安装版本 下载 PDF转Word 截图文字提取 文档差异对比 泰比专业OCR文字识别工具

下载地址(资源制作整理不易&#xff0c;下载使用需付费&#xff0c;且文件较大&#xff0c;不能接受请勿浪费时间下载): 链接&#xff1a;https://pan.baidu.com/s/1sY9ZoDe-QC6NISmkxj1_VQ?pwdlpqq 提取码&#xff1a;lpqq

【OpenCV_python】噪点消除(滤波) 边缘检测Canny算法 轮廓绘制

图片降噪 均值滤波blur 中心点的像素值等于核值区域的平均值 import cv2 img_gs cv2.imread(./media/lvbo2.png) # 高斯噪声 img_jy cv2.imread(./media/lvbo3.png) # 椒盐噪声def buler():img_jz1 cv2.blur(img_gs,(3,3))img_jz2 cv2.blur(img_jy,(3,3))cv2.imshow(img_jz1…

SQL 调优最佳实践笔记

定义与重要性 SQL 调优&#xff1a;提高SQL性能&#xff0c;减少查询时间和资源消耗。目标&#xff1a;减少查询时间和扫描的数据行数。 基本原则 减少扫描行数&#xff1a;只扫描所需数据。使用合适索引&#xff1a;确保WHERE条件命中最优索引。合适的Join类型&#xff1a;…

javaweb_09:Mybatis基础操作

javaweb_09&#xff1a;Mybatis基础操作 一、环境准备二、删除三、插入四、更新&#xff08;修改&#xff09;五、查询六、实践 一、环境准备 1、准备数据库表emp -- 部门管理 create table dept(id int unsigned primary key auto_increment comment 主键ID,name varchar(10…

TreeSet的排序方式

一.TreeSet的特点&#xff1a; 二.TreeSet对象排序练习题&#xff1a; 需求&#xff1a;利用TreeSet存储整数并进行排序 package com.itheima.a06mySet; ​ import java.util.TreeSet; ​ public class A05_TreeSetDemo1 {public static void main(String[] args) {//1.创建T…

Eureka原理与实践:构建高效的微服务架构

Eureka原理与实践&#xff1a;构建高效的微服务架构 Eureka的核心原理Eureka Server&#xff1a;服务注册中心Eureka Client&#xff1a;服务提供者与服务消费者 Eureka的实践应用集成Eureka到Spring Cloud项目中创建Eureka Server创建Eureka Client&#xff08;服务提供者&…

LabVIEW滚动轴承故障诊断系统

滚动轴承是多种机械设备中的关键组件&#xff0c;其性能直接影响整个机械系统的稳定性和安全性。由于轴承在运行过程中可能会遇到多种复杂的工作条件和环境因素影响&#xff0c;这就需要一种高效、准确的故障诊断方法来确保机械系统的可靠运行。利用LabVIEW开发的故障诊断系统&…

React使用useRef ts 报错

最近在写自己的React项目&#xff0c;我在使用useRef钩子函数的时候发现 TS2322: Type MutableRefObject<HTMLDivElement | undefined> is not assignable to type LegacyRef<HTMLDivElement> | undefined Type MutableRefObject<HTMLDivElement | undefined&g…

SDL库自适应窗口大小及遇到的坑

一、窗口尺寸改变大小时&#xff0c;视频卡住不动 网上介绍的方法有&#xff1a; 1&#xff1a;修改源码中的代码&#xff01; SDL_OnWindowResized中的SDL_WINDOWEVENT_SIZE_CHANGED更改为SDL_WINDOWEVENT_RESIZED 2&#xff1a;SDL_EventState(SDL_WINDOWEVENT, SDL_IGNORE…

Golang | Leetcode Golang题解之第343题整数拆分

题目&#xff1a; 题解&#xff1a; func integerBreak(n int) int {if n < 3 {return n - 1}quotient : n / 3remainder : n % 3if remainder 0 {return int(math.Pow(3, float64(quotient)))} else if remainder 1 {return int(math.Pow(3, float64(quotient - 1))) * …

C#多态_接口

接口是行为的抽象表现 关键字 interface 接口申明的规范 1.不包含成员变量 2.只包含&#xff0c;方法&#xff0c;属性&#xff0c;索引器&#xff0c;事件 3.成员不能被实现 4.成员可以不用写访问修饰符&#xff0c;不能是私有的&#xff08;不写默认是public也可以写pro…

c语言编程有什么难点

C语言编程面临的难点主要有1、指针的理解和使用、2、内存管理、3、复杂的数据结构实现、4、并发和多线程编程以及5、跨平台编程。指针是C语言中最具特色也最令人头疼的部分。它直接操作内存地址&#xff0c;能够提供强大但复杂的数据管理方式。正确而高效地使用指针&#xff0c…

记处理微前端的一些问题

主子应用样式 因为子应用是是后加载的 所以如果柱应用和子应用有重的 会以子应用为准、 需要我们将主应用的样式权重提高或尽量避免重复 我这里还遇到一个问题就是主应用使用rem定义的样式加载子应用会失效 解决办法就是没定义默认字体html{ font-size: 16px; } 主应用重新加载…

掌握ChatGPT写作艺术:从入门到精通的四个层次

这些周末我仔细研究了如何通过优化提示词提升ChatGPT输出内容的质量。 关于如何使用ChatGPT辅助我们的写作&#xff0c;我归纳了以下规律&#xff0c;希望能为你带来启发。 一、写作步骤 撰写一篇文章&#xff0c;思路上必须是从抽象到具体逐步深入。 首先我们需要明确写什么…

leetcode 31-40(2024.08.18)

立个flag&#xff0c;1-100题每天分配10题&#xff0c;不会就先空着&#xff08;2&#xff0c;8&#xff09;。 昨天周六&#xff0c;摆烂一天。 1. 31&#xff1a;下一个排列 class Solution:def nextPermutation(self, nums: List[int]) -> None:"""Do …

SMS流媒体服务器-MPEG-PS流的深度解析

1.简介 ps流的解析&#xff0c;只要按照标准文档对照16进制的流数据&#xff0c;基本都能看的明白。但是实际项目中会碰到各种各样的问题。本文将对如何高效的解析出音视频数据发表一下个人的看法。 介绍一下本人的开源流媒体&#xff0c;点个star&#xff0c;有兴趣一起开发的…

深入探索Golang的hash包:哈希算法的高效实现

标题&#xff1a;深入探索Golang的hash包&#xff1a;哈希算法的高效实现 引言 Go语言&#xff0c;以其简洁的语法和高效的并发处理能力而广受开发者喜爱。在Go语言的标凈库中&#xff0c;hash包提供了一套强大的哈希算法实现&#xff0c;包括MD5、SHA1、SHA256等。本文将详细…