STM32F4 STD标准库串口接收例程

news2024/11/19 10:37:32

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

PostgreSQL 用户及授权管理 06:启用 SSL 及验证

PostgreSQL 用户及授权管理 06:启用 SSL 及验证 安全在外企中是非常受重视的,一般外企都会要求所有可以使用加密的地方都使用加密。本小节我们启用 PostgreSQL 的 SSL 加密连接并进行抓包验证。 SSL 连接加密 安全套接字层 (SSL) 允许 PostgreSQL 接受…

Vite响应Ajax请求

Vite响应Ajax请求 陈拓 2024/06/20-2024/06/24 1. 概述 http-server、live-server 等常用于本地测试和开发的http服务器不能很好的支持 ES 模块,在测试ES 模块时浏览器控制台经常显示错误: Failed to load module script: Expected a JavaScript modu…

element-ui侧边栏:default-openeds

element-ui侧边栏实现路由跳转后展开对应侧边栏:default-openeds 当菜单是在本地写死时,如果想展开第一块内容、里面就只写1 :default-openeds"[‘1’]" 当菜单是动态获取时,点击跳转之后如何展开对应的菜单,在watch中监…

three.js围绕中心点的旋转动画代码和案例

在 Three.js 中,可以通过设置对象的旋转中心点来实现围绕一个中心点旋转。具体的实现步骤如下: 首先,创建一个场景、相机和渲染器: // 创建一个场景 var scene new THREE.Scene();// 创建一个透视相机 var camera new THREE.P…

Vite打包速度为什么比webpack快,打包的优劣势在哪里?

大家都有被webpack打包速度搞崩溃的时候,修改一处地方,想预览效果,要等上半天。 Vite比Webpack快的原因 ESM(ES Module)原生支持: Vite基于ESM构建,利用浏览器原生支持的ESM模块加载方式&…

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

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

Open AI 前 Superalignment部门研究员Leopold Aschenbrenner的关于Superintelligence担忧的真挚长文

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

002_unsigned long数据比较的坑?

【背景】 unsigned long 类似数据的比较问题,先上一段代码,如下图所示: 就是图中框出的部分,眨眼一看,应该没啥问题,而且我也在本地的编译器vs2019上编译了,确实也没有报错,所以就修…

基于java+springboot+vue实现的宠物商城网站(文末源码+Lw)273

摘 要 传统信息的管理大部分依赖于管理人员的手工登记与管理,然而,随着近些年信息技术的迅猛发展,让许多比较老套的信息管理模式进行了更新迭代,商品信息因为其管理内容繁杂,管理数量繁多导致手工进行处理不能满足广…

java启动命令与参数配置

1. java启动命令 运行一个java应用程序的语法分两种,分别为: 执行类:java [-options] class [args…] 执行jar文件:java [-options] -jar jarfile [args…] 其中 [-options] 配置 JVM参数,[args…] 配置 Java 运行参…

11.xss之href输出

11.xss之href输出 后台配置文件中的代码 xss之href输出绕过:javascript:alert(1111) 直接代入a标签herf里面一样可以绕过htmlspecialchars 输入攻击代码 javascript:alert(1111)点击蓝色字体直接会弹窗,如图所示:

Javac编译器

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

HTML5五十六个民族网站模板源码

文章目录 1.设计来源高山族1.1 登录界面演示1.2 注册界面演示1.3 首页界面演示1.4 中国民族界面演示1.5 关于高山族界面演示1.6 联系我们界面演示 2.效果和源码2.1 动态效果2.2 源代码2.3 源码目录 源码下载 作者:xcLeigh 文章地址:https://blog.csdn.ne…

压箱底的15套无代码可视化数据大屏

学习视频smardaten致力于大数据、人工智能领域前沿技术研发,充分挖掘生产生活的海量数据,提供覆盖全行业的、超大规模的数据治理与智能分析服务,平台旨在用全方位、前沿化的大数据、人工智能等数据智能技术,突破行业数据管理难题&…

第1章 物联网模式简介---独特要求和体系结构原则

物联网用例的独特要求 物联网用例往往在功耗、带宽、分析等方面具有非常独特的要求。此外,物联网实施的固有复杂性(一端的现场设备在计算上受到挑战,另一端的云容量几乎无限)迫使架构师做出艰难的架构决策和实施选择。可用实现技…

分享一套基于SSM的美食推荐管理系统(源码+文档+部署)

大家好,今天给大家分享一套基于SSM的美食推荐管理系统 开发语言:Java 数据库:MySQL 技术:SpringSpringMvcMyBatis 工具:IDEA/Ecilpse、Navicat、Maven 博主介绍: 一名Java全栈工程师,专注于Jav…

高质量数据不够用,合成数据是打开 AGI 大门的金钥匙吗?

编者按: 人工智能技术的发展离不开高质量数据的支持。然而,现有可用的高质量数据资源已日渐接近枯竭边缘。如何解决训练数据短缺的问题,是当前人工智能领域亟待解决的一个较为棘手的问题。 本期文章探讨了一种经实践可行的解决方案 —— 合成…

EE trade:利弗莫尔三步建仓法

在股市投资领域,利弗莫尔这个名字代表着无数的智慧和经历。他的三步建仓法成为了投资者们趋之若鹜的学习对象。本文将详细解析利弗莫尔的著名买入法,通过分步进攻方式,有效掌控市场并实现盈利。 一、利弗莫尔的三步建仓法详解 利弗莫尔三步…

(9)农作物喷雾器

文章目录 前言 1 必要的硬件 2 启用喷雾器 3 配置水泵 4 参数说明 前言 Copter 包括对农作物喷雾器的支持。该功能允许自动驾驶仪连接到一个 PWM 操作的泵和(可选)旋转器,根据飞行器速度控制液体肥料的流动速度。 稍微过时的视频显示了…

MYSQL 将某个字段赋值当前时间

如 我们需要将use_time 赋值为当前时间: 准备三条数据 : 执行sql ,2种当前时间赋值函数,1种关键字赋值 : update test_info SET use_timeNOW() WHERE id 1; update test_info SET use_timeCURRENT_TIMESTAMP() …