ESP32开发之LED闪烁和呼吸的实现

news2025/6/8 17:55:17
  • 硬件电路介绍
  • GPIO输出模式
  • GPIO配置过程
  • 闪烁灯的源码
  • LED PWM的控制器(LEDC)概述
  • LEDC配置过程及现象
  • 整体流程

硬件电路介绍

电路图如下:

在这里插入图片描述

只要有硬件基础的应该都知道上图中,当GPIO4的输出电平为高时,LED灯亮,反之则熄灭。如果每间隔一段时间进行一次电平的反转,则将使LED产生闪烁的效果。

GPIO模式

在进行GPIO控制之前,需要熟悉一下ESP32的GPIO几种模式:

GPIO模式模式宏定义说明
输入模式GPIO_MODE_INPUT可以通过配置项pull_up_en或pull_down_en配置上拉或者下拉
推挽输出模式GPIO_MODE_OUTPUT高低电平输出
开漏输出模式GPIO_MODE_OUTPUT_OD通常用于I2C
中断可通过intr_type配置项配置触发方式:上升沿/下降沿/双沿/电平触发等
禁用GPIO_MODE_DISABLE禁用GPIO,不作为输入也不作为输出
输入输出模式GPIO_MODE_INPUT_OUTPUT
输入及开漏输出GPIO_MODE_INPUT_OUTPUT_OD

注意:

  • 使用中断时,将GPIO模式设置为输入模式
  • 如果GPIO用于I2C的SDA,设置模式为GPIO_MODE_INPUT_OUTPUT_OD,且需要配置上拉,也可在芯片相关引脚增加上拉电路

GPIO配置过程

  • 配置GPIO

    使用结构体gpio_config_t对GPIO相关参数进行配置

  • 注册GPIO

​ 通过函数gpio_config函数将以上配置注册进系统

  • 通过GPIO相关API函数对GPIO进行控制

​ 比如此次实验是控制LED闪烁,那么则是使用gpio_set_level函数进行输出电平控制

闪烁灯的源码

/**
 * Copyright (C) 2024-2034 HalfMoon2.
 * All rights reserved.
 * 
 * @file 	 Filename without the absolute path
 * @brief 	 Brief description
 * @author 	 HalfMoon2
 * @date 	 2025-05-20
 * @version	 v0.1
 * 
 * @revision history:
 * 	 2025-05-20 - Initial version.
 */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"

#define LED_GPIO GPIO_NUM_4 //根据实际的连接方式更改

void ledCtlTask(void *pvParam)
{
	while(1){
		  gpio_set_level(LED_GPIO, 1);  // 设置为高电平(点亮 LED)
       		 vTaskDelay(pdMS_TO_TICKS(500));  // 延时 0.5 秒

       		 gpio_set_level(LED_GPIO, 0);  // 设置为低电平(熄灭 LED)
        	  vTaskDelay(pdMS_TO_TICKS(500));  // 延时 0.5 秒
	}
}

void app_main(void)
{
	// 配置 GPIO
    gpio_config_t io_conf = {
        .pin_bit_mask = (1ULL << LED_GPIO),    // 选择 GPIO
        .mode = GPIO_MODE_OUTPUT,              // 设置为输出模式
        .pull_up_en = GPIO_PULLUP_DISABLE,     // 不启用上拉
        .pull_down_en = GPIO_PULLDOWN_DISABLE, // 不启用下拉
        .intr_type = GPIO_INTR_DISABLE         // 不启用中断
    };
    gpio_config(&io_conf);

    xTaskCreatePinnedToCore(ledCtlTask,"ledCtlTask",2048,NULL,3,NULL,1);
}

LED PWM的控制器(LEDC)概述

从以上案例可以看出,对于通用GPIO的控制要么是高电平,要么是低电平。所以只能控制LED的闪烁现象。而对于ESP32-S3却有专用控制LED的控制器,称之LED PWM。它有8路低速通道。专用于控制LED。当然也可以产生PWM控制电机等。ESP32有两组LED PWM控制器,一组为8路高速通道,另一组为8路低速通道。

LED PWM 控制器可在无需 CPU 干预的情况下自动改变占空比,实现亮度渐变,如果是RGB LED,还能实现颜色的渐变。

LEDC的配置过程及现象

  1. 定时器的配置过程
  • 创建定时器配置结构体

    typedef struct {
        ledc_mode_t speed_mode;                /* LEDC速度模式, high-speed mode (only exists on esp32) or low-speed mode */
        ledc_timer_bit_t duty_resolution;      /* LEDC占空比分辨率 */
        ledc_timer_t  timer_num;                  /* The timer source of channel (0 - LEDC_TIMER_MAX-1) */
        uint32_t freq_hz;                               /* LEDC 的时钟频率 */
        ledc_clk_cfg_t clk_cfg;                       /*配置LEDC的时钟源. */
        bool deconfigure;                             /*是否取消此配置之前的配置,取消之前先要关闭定时器 */
    } ledc_timer_config_t
    
  • 使用相关函数将结构体完成配置

esp_err_t ledc_timer_config(const ledc_timer_config_t *timer_conf);//参数为以上定义的结构体
/*返回值:
* ESP_OK  成功
* ESP_ERR_INVALID_ARG 参数错误
* ESP_FAIL   无法根据给定频率和当前占空比分辨率找到合适的预分频器编号
*ESP_ERR_INVALID_STATE  定时器未配置或未暂停
*/
  1. 配置通道以及指定GPIO
  • 创建配置通道结构体
typedef struct {
    int gpio_num;                   /* LEDC的输出GPIO*/
    ledc_mode_t speed_mode;         /* LEDC 速度模式,ESP32S3只能配置为低速 */
    ledc_channel_t channel;         /*LED PWM的控制器(LEDC) LEDC的通道 */
    ledc_intr_type_t intr_type;     /*是否开启渐变中断 */
    ledc_timer_t timer_sel;         /*选择定时器l (0 - LEDC_TIMER_MAX-1) */
    uint32_t duty;                  /*!< LEDC 通道占空比*/
    int hpoint;                     /*!< LEDC channel hpoint value, the range is [0, (2**duty_resolution)-1] */
    struct {
        unsigned int output_invert: 1;/*!< Enable (1) or disable (0) gpio output invert */
    } flags;                        /*!< LEDC 标志 */

} ledc_channel_config_t;
  • 使用函数完成配置
esp_err_t ledc_channel_config(const ledc_channel_config_t *ledc_conf);
  1. 配置占空比改变PWM信号
  • 使能硬件PWM
//参数intr_alloc_flags为分配的中断优先级
esp_err_t ledc_fade_func_install(int intr_alloc_flags)
  • 配置渐变参数
/*
参数:
 speed_mode:LEDC的速度模式,只有ESP32有高速模式
 channel:通道,0-7
  target_duty:占空比,取值范围 [0, (2**duty_resolution)]
  max_fade_time_ms:最大的渐变时间
*/
esp_err_t ledc_set_fade_with_time(ledc_mode_t speed_mode, ledc_channel_t channel, uint32_t target_duty, int max_fade_time_ms)
  • 开启渐变
/*
参数:
 speed_mode:LEDC的速度模式
 channel:通道,0-7
fade_mode:是否阻塞直到渐变完成,如果设置成LEDC_FADE_WAIT_DONE模式,则不渐变到预定值则不返回
*/
esp_err_t ledc_fade_start(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_fade_mode_t fade_mode)
  1. 第一阶段实例:实现LED缓慢亮灯
/**
 * Copyright (C) 2024-2034 HalfMoon2.
 * All rights reserved.
 * 
 * @file 	 Filename without the absolute path
 * @brief 	 Brief description
 * @author 	 HalfMoon2
 * @date 	 2025-05-27
 * @version	 v0.1
 * 
 * @revision history:
 * 	 2025-05-27 - Initial version.
 */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include <driver/ledc.h>

#define LEDC_MODE 		LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES 	LEDC_TIMER_13_BIT
#define LEDC_TIMER_NUM 	LEDC_TIMER_0
#define LEDC_FREQ 		5000
#define LEDC_CHANNEL 	LEDC_CHANNEL_0
#define LEDC_GPIO		GPIO_NUM_4
#define LEDC_DUTY		4095    //2^13-1


void ledc_init(void)
{
	 ledc_timer_config_t timer_config={
		.speed_mode= LEDC_MODE,
		.duty_resolution= LEDC_DUTY_RES,
		.timer_num= LEDC_TIMER_NUM,
		.clk_cfg=LEDC_AUTO_CLK,
		.freq_hz=LEDC_FREQ
	 };
	ledc_timer_config(&timer_config);

	 ledc_channel_config_t ledc_channel={
		.speed_mode = 	LEDC_MODE,
		.channel 	=	LEDC_CHANNEL,
		.gpio_num	=	LEDC_GPIO,
		.intr_type	= 	LEDC_INTR_DISABLE,
		.duty		=	0,
		.hpoint		=	0
	 };
	 ledc_channel_config(&ledc_channel);
}

void app_main(void)
{
	ledc_init();
	ledc_fade_func_install(0);
	ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,4095,10000);
	ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);
}

在这里插入图片描述

波形说明:可以明显的看到PWM的占空比的变化,LED也缓慢的亮起。

那么接下来就是实现从亮起再缓慢的熄灭,以此循环则实现了LED呼吸的效果。

  1. 渐变回调函数

LEDC控制器在使能渐变后,每个通道都可以有一个回调函数,通过ledc_cb_register()进行注册

esp_err_t ledc_cb_register(ledc_mode_t speed_mode, ledc_channel_t channel, ledc_cbs_t *cbs, void *user_arg)
    /*参数:
    speed_mode:速度模式,只有ESP32有高速模式
    channel: LEDC通道,低速模式有8个通道
    cbs:回调函数原型定义在 ledc_cbs_t 结构体中
    user_arg:用户注册时的数据,用于给回调函数传参 
    */
  1. 通过事件组的方式将此时LED的状态发送出去,即设置事件值

在中断中避免处理复杂的内容,所以在渐变回调函数中只使用事件组方式发送相关事件。不了解这块的知识可以参考我之前的文章

《ESP32开发之freeRTOS的事件组》

bool IRAM_ATTR ledc_fade_cb(const ledc_cb_param_t *param, void *user_arg)
{
	BaseType_t  pxHigherPriorityTaskWoken;
	//如果当前LEDC占空比最大,说明此时LED为开灯状态,反之为关灯状态
	if(param->duty){
		xEventGroupSetBitsFromISR(s_ledc_ev,LED_ON_EV,&pxHigherPriorityTaskWoken);
	}else{
		xEventGroupSetBitsFromISR(s_ledc_ev,LED_OFF_EV,&pxHigherPriorityTaskWoken);
	}
	return pxHigherPriorityTaskWoken;
}
  1. 创建一个任务来接收事件并做渐变过程的改变
void ledc_fade_task(void* param)
{
	EventBits_t ev;
	while(1){
		ev=xEventGroupWaitBits(s_ledc_ev,LED_OFF_EV|LED_ON_EV,pdTRUE,pdFALSE,portMAX_DELAY);
		if(ev){
			if(ev&LED_OFF_EV){
				ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,LEDC_DUTY,1000);
				ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);
			}
			if(ev&LED_ON_EV){
				ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,0,1000);
				ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);
			}
		}
		//处理完成需要再次注册回调函数,产生循环
		ledc_cbs_t cbs={.fade_cb=ledc_fade_cb};
	    ledc_cb_register(LEDC_MODE,LEDC_CHANNEL,&cbs,NULL);
	}
}
  1. 第二阶段实例:完整实现渐变的循环
/**
 * Copyright (C) 2024-2034 HalfMoon2.
 * All rights reserved.
 * 
 * @file 	 Filename without the absolute path
 * @brief 	 Brief description
 * @author 	 HalfMoon2
 * @date 	 2025-05-27
 * @version	 v0.1
 * 
 * @revision history:
 * 	 2025-05-27 - Initial version.
 */
#include <stdio.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "driver/gpio.h"
#include "esp_log.h"
#include <driver/ledc.h>

#define LEDC_MODE 		LEDC_LOW_SPEED_MODE
#define LEDC_DUTY_RES 	LEDC_TIMER_13_BIT
#define LEDC_TIMER_NUM 	LEDC_TIMER_0
#define LEDC_FREQ 		5000
#define LEDC_CHANNEL 	LEDC_CHANNEL_0
#define LEDC_GPIO		GPIO_NUM_4
#define LEDC_DUTY		4095    //2^13-1

//通知渐变完成
static EventGroupHandle_t   s_ledc_ev = NULL;

//此时为关灯状态
#define LED_OFF_EV (1<<0)//事件组bit0设置为关灯事件

//此时为开灯状态
#define LED_ON_EV (1<<1)//事件组bit1设置为开灯事件

/**
 * @brief 	 渐变结束回调函数
 * @param 	 *param:LEDC callback parameter
 * @param 	 *user_arg:User registered data
 * @return 	 返回是否唤醒高优先级任务
 * @note	 此函数为中断服务函数,所以不应处理过多的操作,那么在此函数中通过发送事件的方式,由渐变任务函数处理事件
 */
bool IRAM_ATTR ledc_fade_cb(const ledc_cb_param_t *param, void *user_arg)
{
	BaseType_t  pxHigherPriorityTaskWoken;
	//如果当前LEDC占空比最大,说明此时LED为开灯状态,反之为关灯状态
	if(param->duty){
		xEventGroupSetBitsFromISR(s_ledc_ev,LED_ON_EV,&pxHigherPriorityTaskWoken);
	}else{
		xEventGroupSetBitsFromISR(s_ledc_ev,LED_OFF_EV,&pxHigherPriorityTaskWoken);
	}
	return pxHigherPriorityTaskWoken;
}

/**
 * @brief 	 led渐变任务
 * @param 	 任务参数
 * @note	 接收事件并做LED操作
 */
void ledc_fade_task(void* param)
{
	EventBits_t ev;
	while(1){
		ev=xEventGroupWaitBits(s_ledc_ev,LED_OFF_EV|LED_ON_EV,pdTRUE,pdFALSE,portMAX_DELAY);
		if(ev){
			if(ev&LED_OFF_EV){
				ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,LEDC_DUTY,1000);
				ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);
			}
			if(ev&LED_ON_EV){
				ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,0,1000);
				ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);
			}
		}
		//处理完成需要再次注册回调函数,产生循环
		ledc_cbs_t cbs={.fade_cb=ledc_fade_cb};
	    ledc_cb_register(LEDC_MODE,LEDC_CHANNEL,&cbs,NULL);
	}
}

void ledc_init(void)
{
	 ledc_timer_config_t timer_config={
		.speed_mode= LEDC_MODE,
		.duty_resolution= LEDC_DUTY_RES,
		.timer_num= LEDC_TIMER_NUM,
		.clk_cfg=LEDC_AUTO_CLK,
		.freq_hz=LEDC_FREQ
	 };
	ledc_timer_config(&timer_config);

	 ledc_channel_config_t ledc_channel={
		.speed_mode = 	LEDC_MODE,
		.channel 	=	LEDC_CHANNEL,
		.gpio_num	=	LEDC_GPIO,
		.intr_type	= 	LEDC_INTR_DISABLE,
		.duty		=	0,
		.hpoint		=	0
	 };
	 ledc_channel_config(&ledc_channel);

	//创建事件组,用于接收和发送渐变事件
	s_ledc_ev = xEventGroupCreate();

	//开启硬件PWM
	ledc_fade_func_install(0);

	//设置渐变参数
	ledc_set_fade_with_time(LEDC_MODE,LEDC_CHANNEL,LEDC_DUTY,1000);

	//启动渐变
	ledc_fade_start(LEDC_MODE,LEDC_CHANNEL,LEDC_FADE_NO_WAIT);
	
	//注册渐变回调函数
	ledc_cbs_t cbs={.fade_cb=ledc_fade_cb,};
	ledc_cb_register(LEDC_MODE,LEDC_CHANNEL,&cbs,NULL);
	xTaskCreatePinnedToCore(ledc_fade_task,"ledc_fade_task",2048,NULL,3,NULL,1);
}

void app_main(void)
{
	ledc_init();
}

在这里插入图片描述

整体流程

在这里插入图片描述

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

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

相关文章

【产品业务设计】支付业务设计规范细节记录,含订单记录、支付业务记录、支付流水记录、退款业务记录

【产品业务设计】支付业务设计规范细节记录&#xff0c;含订单记录、支付业务记录、支付流水记录 前言 我为什么要写这个篇文章 总结设计经验生成设计模板方便后期快速搭建 一个几张表 一共5张表&#xff1b; 分别是&#xff1a; 订单主表&#xff1a;jjy_orderMain订单产…

2025软件供应链安全最佳实践︱证券DevSecOps下供应链与开源治理实践

项目背景&#xff1a;近年来&#xff0c;云计算、AI人工智能、大数据等信息技术的不断发展、各行各业的信息电子化的步伐不断加快、信息化的水平不断提高&#xff0c;网络安全的风险不断累积&#xff0c;金融证券行业面临着越来越多的威胁挑战。特别是近年以来&#xff0c;开源…

WebRTC通话原理与入门难度实战指南

波煮的实习公司主要是音视频业务&#xff0c;所以最近在补习WebRTC的相关内容&#xff0c;会不定期给大家分享学习心得和笔记。 文章目录 WebRTC通话原理进行媒体协商&#xff1a;彼此要了解对方支持的媒体格式网络协商&#xff1a;彼此要了解对方的网络情况&#xff0c;这样才…

N元语言模型 —— 一文讲懂!!!

目录 引言 一. 基本知识 二.参数估计 三.数据平滑 一.加1法 二.减值法/折扣法 ​编辑 1.Good-Turing 估计 ​编辑 2.Back-off (后备/后退)方法 3.绝对减值法 ​编辑4.线性减值法 5.比较 三.删除插值法(Deleted interpolation) 四.模型自适应 引言 本章节讲的…

.NET 9中的异常处理性能提升分析:为什么过去慢,未来快

一、为什么要关注.NET异常处理的性能 随着现代云原生、高并发、分布式场景的大量普及&#xff0c;异常处理&#xff08;Exception Handling&#xff09;早已不再只是一个冷僻的代码路径。在高复杂度的微服务、网络服务、异步编程环境下&#xff0c;服务依赖的外部资源往往不可…

Mac 安装git心路历程(心累版)

省流版&#xff1a;直接安装Xcode命令行工具即可&#xff0c;不用安Xcode。 git下载官网 第一部分 上网初步了解后&#xff0c;打算直接安装Binary installer&#xff0c;下载完安装时&#xff0c;苹果还阻止安装&#xff0c;只好在“设置–安全性与隐私”最下面的提示进行安…

计算机网络第2章(下):物理层传输介质与核心设备全面解析

目录 一、传输介质1.1 传输介质的分类1.2 导向型传输介质1.2.1 双绞线&#xff08;Twisted Pair&#xff09;1.2.2 同轴电缆&#xff08;Coaxial Cable&#xff09;1.2.3 光纤&#xff08;Optical Fiber&#xff09;1.2.4 以太网对有线传输介质的命名规则 1.3 非导向型传输介质…

C# 类和继承(扩展方法)

扩展方法 在迄今为止的内容中&#xff0c;你看到的每个方法都和声明它的类关联。扩展方法特性扩展了这个边 界&#xff0c;允许编写的方法和声明它的类之外的类关联。 想知道如何使用这个特性&#xff0c;请看下面的代码。它包含类MyData&#xff0c;该类存储3个double类型 的…

MySQL复杂SQL(多表联查/子查询)详细讲解

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 MySQL复杂SQL&#xff08;多表联查/子查询&a…

STM32使用土壤湿度传感器

1.1 介绍&#xff1a; 土壤湿度传感器是一种传感装置&#xff0c;主要用于检测土壤湿度的大小&#xff0c;并广泛应用于汽车自动刮水系统、智能灯光系统和智能天窗系统等。传感器采用优质FR-04双料&#xff0c;大面积5.0 * 4.0厘米&#xff0c;镀镍处理面。 它具有抗氧化&…

Windows平台RTSP/RTMP播放器C#接入详解

大牛直播SDK在Windows平台下的RTSP、RTMP播放器模块&#xff0c;基于自研高性能内核&#xff0c;具备极高的稳定性与行业领先的超低延迟表现。相比传统基于FFmpeg或VLC的播放器实现&#xff0c;SmartPlayer不仅支持RTSP TCP/UDP自动切换、401鉴权、断网重连等网络复杂场景自适应…

从 JDK 8 到 JDK 17:Swagger 升级迁移指南

点击上方“程序猿技术大咖”&#xff0c;关注并选择“设为星标” 回复“加群”获取入群讨论资格&#xff01; 随着 Java 生态向 JDK 17 及 Jakarta EE 的演进&#xff0c;许多项目面临从 JDK 8 升级的挑战&#xff0c;其中 Swagger&#xff08;API 文档工具&#xff09;的兼容性…

使用 Coze 工作流一键生成抖音书单视频:全流程拆解与技术实现

使用 Coze 工作流一键生成抖音书单视频&#xff1a;全流程拆解与技术实现&#xff08;提供工作流&#xff09; 摘要&#xff1a;本文基于一段关于使用 Coze 平台构建抖音爆火书单视频的详细讲解&#xff0c;总结出一套完整的 AI 视频自动化制作流程。内容涵盖从思路拆解、节点配…

【发布实录】云原生+AI,助力企业全球化业务创新

5 月 22 日&#xff0c;在最新一期阿里云「飞天发布时刻」&#xff0c;阿里云云原生应用平台产品负责人李国强重磅揭晓面向 AI 场景的云原生产品体系升级&#xff0c;通过弹性智能的一体化架构、开箱即用的云原生 AI 能力&#xff0c;为中国企业出海提供新一代技术引擎。 发布会…

LabVIEW主轴故障诊断案例

LabVIEW 开发主轴机械状态识别与故障诊断系统&#xff0c;适配工业场景主轴振动监测需求。通过整合品牌硬件与软件算法&#xff0c;实现从信号采集到故障定位的全流程自动化&#xff0c;为设备维护提供数据支撑&#xff0c;提升数控机床运行可靠性。 ​ 面向精密制造企业数控机…

计算机组成与体系结构:补码数制二(Complementary Number Systems)

目录 4位二进制的减法 补码系统 &#x1f9e0;减基补码 名字解释&#xff1a; 减基补码有什么用&#xff1f; 计算方法 ❓为什么这样就能计算减基补码 &#x1f4a1; 原理揭示&#xff1a;按位减法&#xff0c;模拟总减法&#xff01; 那对于二进制呢&#xff1f;&…

C#使用MindFusion.Diagramming框架绘制流程图(2):流程图示例

上一节我们初步介绍MindFusion.Diagramming框架 C#使用MindFusion.Diagramming框架绘制流程图(1):基础类型-CSDN博客 这里演示示例程序: 新建Windows窗体应用程序FlowDiagramDemo,将默认的Form1重命名为FormFlowDiagram. 右键FlowDiagramDemo管理NuGet程序包 输入MindFusio…

【物联网-ModBus-RTU

物联网-ModBus-RTU ■ 优秀博主链接■ ModBus-RTU介绍■&#xff08;1&#xff09;帧结构■&#xff08;2&#xff09;查询功能码 0x03■&#xff08;3&#xff09;修改单个寄存器功能码 0x06■&#xff08;4&#xff09;Modbus RTU 串口收发数据分析 ■ 优秀博主链接 Modbus …

Java应用10(客户端与服务器通信)

Java客户端与服务器通信 Java提供了多种方式来实现客户端与服务器之间的通信&#xff0c;下面我将介绍几种常见的方法&#xff1a; 1. 基于Socket的基本通信 服务器端代码 import java.io.*; import java.net.*;public class SimpleServer {public static void main(String…

Python_day47

作业&#xff1a;对比不同卷积层热图可视化的结果 一、不同卷积层的特征特性 卷积层类型特征类型特征抽象程度对输入的依赖程度低层卷积层&#xff08;如第 1 - 3 层&#xff09;边缘、纹理、颜色、简单形状等基础特征低高&#xff0c;直接与输入像素关联中层卷积层&#xff08…