当前位置: 首页 > news >正文

STM32F4XX之串口

一、标准串口(UART)介绍

1、通信协议相关概念

1.1同步通信和异步通信

(1)同步通信:两个器件之间共用一个时钟线,要发送的数据在时钟的作用下一位一位发送出去。

(2)异步通信:指两个器件之间没有时钟线连接,器件接受/发送数据时使用各自的时钟,以不同的时钟频率进行通信。

1.2串行与并行通信

(1)串行通信:只有一根数据线,各个数据位通过数据线按照顺序一位一位的传输。

优点:稳定性高、简单、成本低

缺点:速度慢

(2)并行通信:有多根数据线,各个数据位同时传输。

优点:速度快。

缺点:稳定性不高、设计复杂、成本高。(占用引脚资源多)

1.3单工、半双工、全双工通信

(1)单工:数据只能由设备A到设备B,不能从设备B到设备A,(任何时候只能是一个方向,如遥控器)。

(2)半双工:设备A发送数据给设备B或者设备B发送数据给设备A。(数据可以在两个方向上传输。同一时刻,数据只能在一个方向传输,传输方向可切换的单工通信;接收端和发送端,可以使用一个端口(扩展)。如对讲机)。

(3)全双工:设备A发送数据给设备B的同时,设备B也可以发送数据给设备A。(允许数据同时在两个方向上传输,发送接收互补影响,所以需要独立的接收端和发送端)。

2、标准串口(UART)概念及其作用

2.1概念:串口也称串行通信接口,是一种MCU与其他器件通信的通信协议。

2.2作用:主要用于芯片与芯片之间、模块与芯片之间、模块与模块之间按照这种通信协议进行数据交换。如:STM32F4XX 和 GSM ,WIFE.北斗.语音,5G模块等。

2.2.1标准UART的协议类型及拓扑接口(接口标准)

底层:接口规范

标准UART的协议类型:异步串行全双工。(没有时钟线,一条发送数据线,一条接收数据线)

RXD:数据接收管脚;R = receive接受

TXD:数据发送管脚;T = transmit发送

注意:地线在硬件上一定要接,否则数据不正常。

2.2.2标准UART的数据帧格式

数据帧格式:将要发送的真正的信息和其它通信必须的信号封装成一包数据,这一包数据包含以下几个内容。

标准UART中一帧数据:1位起始位+(5~8)数据位+1位校验位+(0.5~2)位停止位。

空闲电平:数据线不传输数据时的状态,该状态为高电平。

起始位:该状态为低电平,占用一个bit,代表通信开始。
数据位:真正传输的数据,占用5~8bit。
校验位:为了检测数据传输的正确与否。占用1bit。

(一般不用)奇偶校验位:奇校验:1000 1100  0  
偶校验:1110 0000  1
停止位:该状态为高电平,占用0.5~2bit,代表通信结束。

2.2.3标准串口速率控制
什么是波特率?波特率的作用是什么?
(1)波特率的作用和概念: 当接收和发送器件的时钟频率不一致时,为了让数据可以正确的收发,所以双方要规定好一个合适的频率进行通信,规定的这个频率称之为波特率,波特率又叫比特率。 
(2)波特率:单位时间内传输的二进制代码的有效位数,其常用单位为每秒比特数bit/s(bps== bit per second)。
(3)常用的波特率:115200、38400、9600,每秒能传输多少位数据。
总结:标准UART的四要素:波特率(通讯速率),数据位长度,校验位,停止位长度。

二、串口的概述

串口是模块是芯片内部的一个片内外设。

STM32F407单片机内部共有6个串口

1.USART介绍

名词解析:USART :Universal Synchronous/Asynchronous ReceiverTransmitters

U:通用的        S:同步        A:异步        R:接受        T:发送
通用同步异步收发器 (USART) 能够灵活地与外部设备进行全双工数据交换,满足外部设备对工业标准 NRZ 异步串行数据格式的要求。 

2.UART框图分析

2.1管脚部分

TX:发送数据管脚

RX:接收数据管脚

2.2数据发送/接收部分

 CPU定义一个8位或者9位的数据并写入到数据寄存器(DR)
1发送数据’A’: USART->DR= ’A’;

(cpu)读取接收数据寄存器(DR)里的值。(人为)
2接受数据:int a= USART->DR;

串口通讯流程

2.3波特率设置

USART 通过小数波特率发生器提供了多种波特率。

2.4控制部分及寄存器分析

三、UART相关寄存器介绍

状态寄存器 (USART_SR)

位 7 TXE:发送数据寄存器为空 (Transmit data register empty) 
当 TDR 寄存器的内容已传输到移位寄存器时,该位由硬件置 1。
如果 USART_CR1 寄存器 中 TXEIE 位 = 1,则会生成中断。通过对 USART_DR 寄存器执行写入操作将该位清零。
 0:数据未传输到移位寄存器 
 1:数据传输到移位寄存器 
位 6 TC:发送完成 (Transmission complete) 
如果已完成对包含数据的帧的发送并且 TXE 置 1,则该位由硬件置 1。如果 USART_CR1 寄存器中 TCIE = 1,则会生成中断。该位由软件序列清零(读取 USART_SR 寄存器,然后写入 USART_DR 寄存器)。TC 位也可以通过向该位写入‘0’来清零。建议仅在多缓冲区通信时使用此清零序列。 
 0:传送未完成
 1:传送已完成 
位 5 RXNE:读取数据寄存器不为空 (Read data register not empty) 
当 RDR 移位寄存器的内容已传输到 USART_DR 寄存器时,该位由硬件置 1。如果 USART_CR1 寄存器中 RXNEIE = 1,则会生成中断。通过对 USART_DR 寄存器执行读入操作将该位清零。RXNE 标志也可以通过向该位写入零来清零。建议仅在多缓冲区通信时使用此清零序列。
0:未接收到数据 
1:已准备好读取接收到的数据 
位 4 IDLE:检测到空闲线路 (IDLE line detected) 
检测到空闲线路时,该位由硬件置 1。如果 USART_CR1 寄存器中 IDLEIE = 1,则会生成中 断。该位由软件序列清零(读入 USART_SR 寄存器,然后读入 USART_DR 寄存器)。 
0:未检测到空闲线路
1:检测到空闲线路 
注意:直到 RXNE 位本身已置 1 时(即,当出现新的空闲线路时)IDLE 位才会被再次置 1。 

2.数据寄存器 (USART_DR)
位 8:0 DR[8:0]:数据值 
    包含接收到数据字符或已发送的数据字符,具体取决于所执行的操作是“读取”操作还是“写入”操作。
因为数据寄存器包含两个寄存器,一个用于发送 (TDR),一个用于接收 (RDR),因此它具有双重功能(读和写)。
3.波特率寄存器 (USART_BRR)

位 31:16 保留,必须保持复位值 
    位 15:4 DIV_Mantissa[11:0]:USARTDIV 的尾数 
        这 12 个位用于定义 USART 除数 (USARTDIV) 的尾数 
    位 3:0 DIV_Fraction[3:0]:USARTDIV 的小数 
    这 4 个位用于定义 USART 除数 (USARTDIV) 的小数。当 OVER8 = 1 时,不考虑 DIV_Fraction3 
位,且必须将该位保持清零。
注意: 如果 TE 或 RE 位分别被禁止,则波特计数器会停止计数。
4.控制寄存器 1 (USART_CR1)

位 15 OVER8:过采样模式 (Oversampling mode) 
0:16 倍过采样 
1:8 倍过采样
//过采样就是为得到一个信号真实情况,需要用一个比这个信号频率高的采样信号去检测,也就是将串口接收的速度提高了,16倍就是采样速度提高16倍,即会采样更多 的点来确定数据的正确性但为了得到越高频率采样信号越也困难,运算和功耗等等也会增加,所以一般选择合适就好。
位 13 UE:USART 使能 (USART enable) 
该位清零后,USART 预分频器和输出将停止,并会结束当前字节传输以降低功耗。此位由软件置 1 和清零。 
0:禁止 USART 预分频器和输出 
1:使能 USART
注意:串口全部配置好,最后打开此位
位 12 M:字长 (Word length)
该位决定了字长。该位由软件置 1 或清零。 
0:1 起始位,8 数据位,n 停止位 
1:1 起始位,9 数据位,n 停止位
位 3 TE:发送器使能 (Transmitter enable) 
该位使能发送器。该位由软件置 1 和清零。 
0:禁止发送器 
1:使能发送器
位 2 RE:接收器使能 (Receiver enable) 
该位使能接收器。该位由软件置 1 和清零。 
0:禁止接收器 
1:使能接收器并开始搜索起始位
5.控制寄存器 2 (USART_CR2)

位 13:12 STOP:停止位 (STOP bit) 
这些位用于编程停止位。 
00:1 个停止位 
01:0.5 个停止位 
10:2 个停止位 
11:1.5 个停止位

6.外设时钟使能寄存器
USART是学习STM32F407ZGT6的第一个外设,这个外设如果要正常工作需要开启相应的时钟(打开开关)。USART外设接在哪条总线上。《STM32F407ZGT6数据手册》第二章节芯片框架中有。开启RCC相关寄存器配置。
(1).RCC APB1 外设时钟使能寄存器 (RCC_APB1ENR)

位 20 UART5EN:UART5 时钟使能 (UART5 clock enable) 
 由软件置 1 和清零。 
 0:禁止 UART5 时钟 
 1:使能 UART5 时钟 
 位 19 UART4EN:UART4 时钟使能 (UART4 clock enable) 
 由软件置 1 和清零。 
 0:禁止 UART4 时钟 
 1:使能 UART4 时钟 
 位 18 USART3EN:USART3 时钟使能 (USART3 clock enable) 
 由软件置 1 和清零。 
 0:禁止 USART3 时钟 
 1:使能 USART3 时钟 
 位 17 USART2EN:USART2 时钟使能 (USART2 clock enable) 
 由软件置 1 和清零。 
 0:禁止 USART2 时钟 
 1:使能 USART2 时钟
 (2)RCC APB2 外设时钟使能寄存器 (RCC_APB2ENR)
位 5 USART6EN:USART6 时钟使能 (USART6 clock enable)
 由软件置 1 和清零。 
0:禁止 USART6 时钟 
1:使能 USART6 时钟位 
4 USART1EN:USART1 时钟使能 (USART1 clock enable)
 由软件置 1 和清零。 
0:禁止 USART1 时钟 
1:使能 USART1 时钟
四、硬件分析

五、软件分析

 配置GPIO口
1. 打开GPIOA的时钟
2. 配置PA9和PA10为复用模式
3. 推挽类型
4. 不需要上下拉
5. 速度2M
6. 复用到哪里?
配置USART
1. 打开USART1外设时钟
2. 配置CR1寄存器(16倍过采样,8位字长,接收器和发送器使能,无奇偶校验)
3. 配置停止位(CR2)
4. 配置波特率(BRR)
5. 使能USART1
6. 发送数据出去(DR)
 

#include "usart1.h"/************************************
函数功能:USART1初始化
函数形参:u32 baud -- 波特率
函数返回值:void
函数说明:PA9 -- 复用到USART1_TXPA10 -- 复用到USART1_RX
作者:
日期:
************************************/
void Usart1_Init(u32 baud)
{float USARTDIV = 0;u16 DIV_Man = 0;u16 DIV_Fra = 0;//	一.配置GPIO口//1.打开GPIOA的时钟RCC->AHB1ENR |= 0X1 << 0;//2.配置PA9和PA10为复用模式GPIOA->MODER &= ~(0XF << 9 *2);GPIOA->MODER |= 0XA << 9*2;//3.复用到哪里?往复用高位寄存器的9号和10号管脚写7GPIOA->AFR[1] &= ~(0XFF << 4);GPIOA->AFR[1] |= (0X77 << 4);//	二.配置USART//1.打开USART1外设时钟RCC->APB2ENR |= 0X1 << 4;//2.配置CR1寄存器USART1->CR1 = 0;/*16倍过采样1 起始位, 8 数据位, n 停止位无奇偶校验*/USART1->CR1 |= 0X3 << 2;//接收器和发送器都使能了//3.配置1个停止位(CR2)USART1->CR2 &= ~(0X3 << 12);//4.配置波特率(BRR)USARTDIV = FPCLK / baud / 16;DIV_Man = USARTDIV;DIV_Fra = (USARTDIV - DIV_Man) *16;USART1->BRR = DIV_Man << 4 | DIV_Fra;//5.使能USART1USART1->CR1 |= 0X1 << 13;}/************************************
函数功能:使用USART发送字符串
函数形参:u8 *str
函数返回值:void
函数说明:可以通过USART1的DR寄存器发送数据到电脑上
作者:
日期:
************************************/
void Send_String(u8 *str)
{while(*str != 0){if(USART1->SR & (0X1 << 7)){USART1->DR = *str;str++;//只有成功发出去才进行偏移}}
}RECEVICE rec_str = {0};
/************************************
函数功能:接受一个字符串
函数形参:void
函数返回值:void
函数说明:要有一个接收电脑传过来数据的数组当前数组的长度有一个接收完成的标志位利用一个特定的字符来判断什么时候接受完数据
作者:
日期:
************************************/
void Receive_String(void)
{if(USART1->SR & (0X1 << 5))//判断什么时候接受到数据{if(USART1->DR != '\n'){rec_str.rec_buff[rec_str.len++] = USART1->DR;}else{rec_str.rec_buff[rec_str.len++] = USART1->DR;rec_str.rec_buff[rec_str.len] = '\0';rec_str.len = 0;//让下一次存储的字符串又从0号元素下标开始rec_str.flag = 1;//接收完成标志位可以让别人知道接收完整个字符串}	}	
}//printf支持
#pragma import(__use_no_semihosting_swi) //取消半主机状态struct __FILE { int handle; /* Add whatever you need here */ };
FILE __stdout;int fputc(int ch, FILE *f) {while((USART1->SR &(0X01<<7))==0);USART1->DR=ch;return (ch);
}
int ferror(FILE *f) {/* Your implementation of ferror */return EOF;
}void _ttywrch(int ch) {while((USART1->SR &(0X01<<7))==0);USART1->DR=ch;
}void _sys_exit(int return_code) {
label:  goto label;  /* endless loop */
}
#ifndef __USART_H_
#define __USART_H_#include "stm32f4xx.h"
#include "io_bit.h"
#include "stdio.h"#define FPCLK 84000000
#define BUFFSIZE 256typedef struct{u8 rec_buff[BUFFSIZE];//定义一个接收数据的数组u8 len; //当前接收到的数据的长度u8 flag;//表示当前接收到的数据已经是一个字符串的形式了
}RECEVICE;
extern RECEVICE rec_str;void Usart1_Init(u32 baud);
void Send_String(u8 *str);
void Receive_String(void);
#endif

int main(void)
{Usart1_Init(9600);printf("111");while(1){Receive_String();//不断的接收数据if(rec_str.flag == 1){rec_str.flag = 0;//首先把标志位清零printf("接收到的字符串:%s\r\n",rec_str.rec_buff);memset(rec_str.rec_buff,0,sizeof(rec_str.rec_buff));}}
}

相关文章:

STM32F4XX之串口

一、标准串口&#xff08;UART&#xff09;介绍 1、通信协议相关概念 1.1同步通信和异步通信 (1)同步通信&#xff1a;两个器件之间共用一个时钟线&#xff0c;要发送的数据在时钟的作用下一位一位发送出去。 &#xff08;2&#xff09;异步通信&#xff1a;指两个器件之间没…...

【J-Long Group Limited】申请1500万美元纳斯达克IPO上市

来源&#xff1a;猛兽财经 作者&#xff1a;猛兽财经 猛兽财经获悉&#xff0c;总部位于中国香港的J-Long Group Limited&#xff08;简称&#xff1a;J-Long&#xff09;近期已向美国证券交易委员会&#xff08;SEC&#xff09;提交招股书&#xff0c;申请在纳斯达克IPO上市&…...

上传文件到google drive

参考&#xff1a;使用 Python 将文件上传到 Google 云端硬盘_迹忆客 第 1 步&#xff1a;Google API Playground 我们可以通过搜索 Google 找到更多关于 Google API Playground 的信息。 我们必须单击第一个链接才能继续前进。 选择第一个链接后&#xff0c;我们会自动进入下一…...

用VLOOKUP快速合并两个表格

一、前言 上周五微信收到运营提过来的需求&#xff0c;第一句话&#xff1a;帮我提取一下1号门店的库存数据&#xff0c;马上登录系统下载一份库存数据给到他然后专心读代码&#xff0c;过一会微信第二句话&#xff1a;帮我提取一下1号门店商品半年/一年的销量数据&#xff0c…...

Vue ref属性

Vue中的ref属性可以用来对HTML元素或者是对组件进行唯一标识。 一、设置ref属性 只需要在元素或者是组件后跟上如下语法即可&#xff1a; ref"标识名" 二、获取元素或对象 我们可以用如下方法获取我们设置ref的元素或组件&#xff1a; this.$refs.标识名 第一个输…...

【python入门】函数,类和对象

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍python入门的函数&#xff0c;高阶函数&#xff0c;python中的类和对象&#xff0c;模块的作用等。 后续会继续分享其他重要知识点总结&#xff0c;如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关…...

alibaba.fastjson的使用(二)-- jar包导入

目录 1. 在pom文件中引入依赖: 2.fastjsonv2的使用: 1. 在pom文件中引入依赖: <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>2.0.14</version> </dependency>2.fastjsonv2的使用…...

A_搜索(A Star)算法

A*搜索(A Star) 不同于盲目搜索&#xff0c;A算法是一种启发式算法(Heuristic Algorithm)。 上文提到&#xff0c;盲目搜索对于所有要搜索的状态结点都是一视同仁的&#xff0c;因此在每次搜索一个状态时&#xff0c;盲目搜索并不会考虑这个状态到底是有利于趋向目标的&#x…...

Tinywebserve学习之linux 用户态内核态

一.CPU指令集权限 指令集是实现CPU实现软件指挥硬件执行的媒介&#xff0c;具体来说每一条汇编语句都对应了一条CPU指令&#xff0c;而非常多的CPU指令再一起组成一个甚至多个集合&#xff0c;指令的集合叫CPU指令集&#xff1b; 因为CPU指令集可以操纵硬件&#xff0c;会造成…...

AI之浅谈

随着ChatGPT的爆火&#xff0c;AI的应用也随之遍地开花&#xff0c;国内国外的各种大模型也都陆续推出&#xff0c;AI的本质是进行数据的分析和整理&#xff0c;其背后的资源来自于互联网时代所积累的大数据基础&#xff0c;这也是深度学习的结果&#xff0c;AI具有不眠不休的特…...

20231024后端研发面经整理

1.如何在单链表O(1)删除节点&#xff1f; 狸猫换太子 2.redis中的key如何找到对应的内存位置&#xff1f; 哈希碰撞的话用链表存 3.线性探测哈希法的插入&#xff0c;查找和删除 插入&#xff1a;一个个挨着后面找&#xff0c;知道有空位 查找&#xff1a;一个个挨着后面找…...

【前段基础入门之】=>CSS3新增渐变颜色属性

导语&#xff1a; CSS3 新增了&#xff0c;渐变色 的解决方案&#xff0c;这使得我们可以绘制出更加生动的炫酷的的配色效果 线性渐变 多个颜色之间的渐变&#xff0c; 默认从上到下渐变 background-image: linear-gradient(red,yellow,green); /*默认从上到下渐变*/默认从上…...

深入浅出排序算法之归并排序

目录 1. 归并排序的原理 1.1 二路归并排序执行流程 2. 代码分析 2.1 代码设计 3. 性能分析 4. 非递归版本 1. 归并排序的原理 “归并”一词的中文含义就是合并、并入的意思&#xff0c;而在数据结构中的定义是将两个或者两个以上的有序表组合成一个新的有序表。 归并排序…...

opencv dnn模块 示例(19) 目标检测 object_detection 之 yolox

文章目录 0、前言1、网络介绍1.1、输入1.2、Backbone主干网络1.3、Neck1.4、Prediction预测输出1.4.1、Decoupled Head解耦头1.4.2、Anchor-Free1.4.3、标签分配1.4.4、Loss计算 1.5、Yolox-s、l、m、x系列1.6、轻量级网络研究1.6.1、轻量级网络1.6.2、数据增强的优缺点 1.7、Y…...

微信小程序阻止返回事件

需求场景 当在一个表单页面 填写了很多数据,或者编辑页面数据发生变动之后,这时候返回上一个页面需要提醒用户是否返回的弹框 实现方法一(ios会存在一定的问题) 在onLoad生命周期里 注册 wx.enableAlertBeforeUnload({message: "您内容已更新,还没保存,确定要退出吗?&…...

YOLOv7改进:新颖的上下文解耦头TSCODE,即插即用,各个数据集下实现暴力涨点

💡💡💡本文属于原创独家改进:上下文解耦头TSCODE,进行深、浅层的特征融合,最后再分别输入到头部进行相应的解码输出,实现暴力暴力涨点 上下文解耦头TSCODE| 亲测在多个数据集实现暴力涨点,对遮挡场景、小目标场景提升也明显; 收录: YOLOv7高阶自研专栏介绍: …...

Unity中Shader阴影的接收

文章目录 前言一、阴影接受的步骤1、在v2f中添加UNITY_SHADOW_COORDS(idx),unity会自动声明一个叫_ShadowCoord的float4变量&#xff0c;用作阴影的采样坐标.2、在顶点着色器中添加TRANSFER_SHADOW(o)&#xff0c;用于将上面定义的_ShadowCoord纹理采样坐标变换到相应的屏幕空间…...

✔ ★【备战实习(面经+项目+算法)】 10.22学习时间表(总计学习时间:4.5h)(算法刷题:7道)

✔ ★【备战实习&#xff08;面经项目算法&#xff09;】 坚持完成每天必做如何找到好工作1. 科学的学习方法&#xff08;专注&#xff01;效率&#xff01;记忆&#xff01;心流&#xff01;&#xff09;2. 每天认真完成必做项&#xff0c;踏实学习技术 认真完成每天必做&…...

Amazonlinux2023(AL2023)获取metadata

今年AWS发布了新的Amazonlinux2023版本&#xff0c;其中获取metadata元数据方式发生了一点改变。 早些时候&#xff0c;在 Amazon Linux 2 中&#xff0c;使用以下命令获取实例元数据 http://169.254.169.254/latest/meta-data/ 具体可以获取的元数据类别可以查阅如下aws官方…...

C++(Chapter 3)

C(三) 1.引用 1.引用的概念 引用的概念:引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。 引用的语法:类型& 引用变量名(对象名) 引用实体 ; 例如: #i…...

UE5 学习系列(三)创建和移动物体

这篇博客是该系列的第三篇&#xff0c;是在之前两篇博客的基础上展开&#xff0c;主要介绍如何在操作界面中创建和拖动物体&#xff0c;这篇博客跟随的视频链接如下&#xff1a; B 站视频&#xff1a;s03-创建和移动物体 如果你不打算开之前的博客并且对UE5 比较熟的话按照以…...

Java多线程实现之Callable接口深度解析

Java多线程实现之Callable接口深度解析 一、Callable接口概述1.1 接口定义1.2 与Runnable接口的对比1.3 Future接口与FutureTask类 二、Callable接口的基本使用方法2.1 传统方式实现Callable接口2.2 使用Lambda表达式简化Callable实现2.3 使用FutureTask类执行Callable任务 三、…...

在WSL2的Ubuntu镜像中安装Docker

Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包&#xff1a; for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...

Android Bitmap治理全解析:从加载优化到泄漏防控的全生命周期管理

引言 Bitmap&#xff08;位图&#xff09;是Android应用内存占用的“头号杀手”。一张1080P&#xff08;1920x1080&#xff09;的图片以ARGB_8888格式加载时&#xff0c;内存占用高达8MB&#xff08;192010804字节&#xff09;。据统计&#xff0c;超过60%的应用OOM崩溃与Bitm…...

算法:模拟

1.替换所有的问号 1576. 替换所有的问号 - 力扣&#xff08;LeetCode&#xff09; ​遍历字符串​&#xff1a;通过外层循环逐一检查每个字符。​遇到 ? 时处理​&#xff1a; 内层循环遍历小写字母&#xff08;a 到 z&#xff09;。对每个字母检查是否满足&#xff1a; ​与…...

使用LangGraph和LangSmith构建多智能体人工智能系统

现在&#xff0c;通过组合几个较小的子智能体来创建一个强大的人工智能智能体正成为一种趋势。但这也带来了一些挑战&#xff0c;比如减少幻觉、管理对话流程、在测试期间留意智能体的工作方式、允许人工介入以及评估其性能。你需要进行大量的反复试验。 在这篇博客〔原作者&a…...

08. C#入门系列【类的基本概念】:开启编程世界的奇妙冒险

C#入门系列【类的基本概念】&#xff1a;开启编程世界的奇妙冒险 嘿&#xff0c;各位编程小白探险家&#xff01;欢迎来到 C# 的奇幻大陆&#xff01;今天咱们要深入探索这片大陆上至关重要的 “建筑”—— 类&#xff01;别害怕&#xff0c;跟着我&#xff0c;保准让你轻松搞…...

Unity UGUI Button事件流程

场景结构 测试代码 public class TestBtn : MonoBehaviour {void Start(){var btn GetComponent<Button>();btn.onClick.AddListener(OnClick);}private void OnClick(){Debug.Log("666");}}当添加事件时 // 实例化一个ButtonClickedEvent的事件 [Formerl…...

关于easyexcel动态下拉选问题处理

前些日子突然碰到一个问题&#xff0c;说是客户的导入文件模版想支持部分导入内容的下拉选&#xff0c;于是我就找了easyexcel官网寻找解决方案&#xff0c;并没有找到合适的方案&#xff0c;没办法只能自己动手并分享出来&#xff0c;针对Java生成Excel下拉菜单时因选项过多导…...

comfyui 工作流中 图生视频 如何增加视频的长度到5秒

comfyUI 工作流怎么可以生成更长的视频。除了硬件显存要求之外还有别的方法吗&#xff1f; 在ComfyUI中实现图生视频并延长到5秒&#xff0c;需要结合多个扩展和技巧。以下是完整解决方案&#xff1a; 核心工作流配置&#xff08;24fps下5秒120帧&#xff09; #mermaid-svg-yP…...