Razor编程中@Helper的用法大全

news2025/7/26 20:36:22

在这里插入图片描述

文章目录

    • 第一章:@Helper基础概念
      • 1.1 @Helper的定义与作用
      • 1.2 @Helper的基本语法结构
      • 1.3 @Helper与HtmlHelper的区别
    • 第二章:基础@Helper用法
      • 2.1 无参数@Helper
      • 2.2 带简单参数的@Helper
      • 2.3 带默认值的参数
      • 2.4 使用模型作为参数
    • 第三章:高级@Helper用法
      • 3.1 嵌套@Helper
      • 3.2 递归@Helper
      • 3.3 条件属性渲染
      • 3.4 使用ViewBag/ViewData
    • 第四章:@Helper与HTML混合
      • 4.1 输出原始HTML
      • 4.2 动态CSS类
      • 4.3 动态生成JavaScript
    • 第五章:@Helper的组织与共享
      • 5.1 _AppHelpers.cshtml文件
      • 5.2 在多个视图中共享@Helper
      • 5.3 外部文件引用
    • 第六章:@Helper的最佳实践
      • 6.1 命名约定
      • 6.2 参数设计原则
      • 6.3 性能考虑
      • 6.4 可测试性
    • 第七章:@Helper的实际应用案例
      • 7.1 分页控件
      • 7.2 星级评分
      • 7.3 动态表单生成
    • 第八章:@Helper的局限性与替代方案
      • 8.1 @Helper的局限性
      • 8.2 替代方案:视图组件(ViewComponent)
      • 8.3 替代方案:标签助手(Tag Helpers)
      • 8.4 替代方案:局部视图(Partial Views)
    • 第九章:从@Helper迁移到ASP.NET Core
      • 9.1 迁移策略
      • 9.2 迁移示例
      • 9.3 迁移工具与技术
    • 第十章:@Helper的创造性用法
      • 10.1 动态CSS生成
      • 10.2 多语言支持
      • 10.3 条件编译
      • 10.4 动态路由生成
    • 结语

在这里插入图片描述

第一章:@Helper基础概念

1.1 @Helper的定义与作用

@Helper是Razor视图引擎中一种强大的代码复用机制,它允许开发者在视图中定义可重用的HTML模板片段。这些Helper可以封装复杂的渲染逻辑,简化视图代码,提高可维护性。

基本特点

  • 在视图中定义的可重用代码块
  • 可以接受参数
  • 返回HTML内容
  • 只在定义它的视图中可用(除非定义在特殊位置)
  • 编译为方法,具有良好性能

1.2 @Helper的基本语法结构

最基本的@Helper定义语法:

@helper HelperName(参数列表)
{
    // HTML和Razor代码
}

简单示例

@helper ShowMessage(string message, string type = "info")
{
    <div class="alert alert-@type">
        @message
    </div>
}

调用方式:

@ShowMessage("操作成功完成!", "success")
@ShowMessage("请检查输入数据", "warning")

1.3 @Helper与HtmlHelper的区别

特性@HelperHtmlHelper
定义位置视图中C#类中
作用范围通常限于当前视图全局可用
语法使用Razor语法使用C#语法
编译方式编译为视图的一部分编译为独立方法
复杂逻辑处理适合简单HTML片段适合复杂逻辑
参数传递直接参数列表通过lambda表达式或匿名对象

第二章:基础@Helper用法

2.1 无参数@Helper

最简单的@Helper不接受任何参数:

@helper CurrentDateTime()
{
    <p>当前时间:@DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")</p>
}

调用方式:

@CurrentDateTime()

2.2 带简单参数的@Helper

接受基本类型参数的@Helper:

@helper UserCard(string name, int age, string avatarUrl)
{
    <div class="user-card">
        <img src="@avatarUrl" alt="@name" class="avatar">
        <h3>@name</h3>
        <p>年龄:@age 岁</p>
    </div>
}

调用方式:

@UserCard("张三", 25, "/images/avatars/zhangsan.jpg")

2.3 带默认值的参数

可以为@Helper参数设置默认值:

@helper Button(string text, string type = "primary", string size = "md")
{
    <button class="btn btn-@type btn-@size">@text</button>
}

调用方式:

@Button("提交")
@Button("取消", "danger")
@Button("了解更多", "info", "lg")

2.4 使用模型作为参数

@Helper可以接受模型类作为参数:

@helper ProductItem(Product product)
{
    <div class="product-item">
        <h4>@product.Name</h4>
        <p class="price">@product.Price.ToString("C")</p>
        <p class="description">@product.Description</p>
        @if (product.IsFeatured)
        {
            <span class="badge bg-warning">推荐</span>
        }
    </div>
}

调用方式:

@foreach (var product in Model.Products)
{
    @ProductItem(product)
}

第三章:高级@Helper用法

3.1 嵌套@Helper

@Helper可以嵌套调用其他@Helper:

@helper UserProfile(User user)
{
    <div class="profile">
        @UserAvatar(user.AvatarUrl, user.Name)
        @UserInfo(user)
    </div>
}

@helper UserAvatar(string url, string alt)
{
    <img src="@url" alt="@alt" class="profile-avatar">
}

@helper UserInfo(User user)
{
    <div class="profile-info">
        <h3>@user.Name</h3>
        <p>@user.Email</p>
        <p>注册于:@user.JoinDate.ToString("yyyy-MM-dd")</p>
    </div>
}

3.2 递归@Helper

@Helper可以递归调用自身:

@helper RenderMenu(IEnumerable<MenuItem> items, int level = 0)
{
    <ul class="menu-level-@level">
        @foreach (var item in items)
        {
            <li>
                <a href="@item.Url">@item.Text</a>
                @if (item.Children.Any())
                {
                    @RenderMenu(item.Children, level + 1)
                }
            </li>
        }
    </ul>
}

3.3 条件属性渲染

在@Helper中实现条件属性:

@helper TextInput(string name, string value, bool isRequired = false, bool isDisabled = false)
{
    <input type="text" 
           name="@name" 
           value="@value" 
           @(isRequired ? "required" : "") 
           @(isDisabled ? "disabled" : "") />
}

3.4 使用ViewBag/ViewData

@Helper可以访问ViewBag和ViewData:

@helper ThemeStyles()
{
    var theme = ViewBag.Theme ?? "light";
    <link href="/css/@(theme)-theme.css" rel="stylesheet" />
}

第四章:@Helper与HTML混合

4.1 输出原始HTML

使用@Html.Raw输出原始HTML:

@helper RenderRichText(string content)
{
    <div class="rich-text">
        @Html.Raw(content)
    </div>
}

4.2 动态CSS类

生成动态CSS类:

@helper AlertBox(string message, string type)
{
    var iconClass = type == "error" ? "fa-exclamation-circle" 
                  : type == "success" ? "fa-check-circle" 
                  : "fa-info-circle";
    
    <div class="alert alert-@type">
        <i class="fas @iconClass"></i>
        @message
    </div>
}

4.3 动态生成JavaScript

@Helper可以生成JavaScript代码:

@helper InitializeChart(string chartId, object data)
{
    <script>
        $(function() {
            var chartData = @Html.Raw(Json.Encode(data));
            $('#@chartId').chart({ data: chartData });
        });
    </script>
}

第五章:@Helper的组织与共享

5.1 _AppHelpers.cshtml文件

创建App_Code/_AppHelpers.cshtml使@Helper全局可用:

@helper FormatCurrency(decimal amount)
{
    @amount.ToString("C")
}

@helper Truncate(string text, int length)
{
    @text.Length <= length ? text : text.Substring(0, length) + "..."
}

5.2 在多个视图中共享@Helper

通过视图继承共享@Helper:

BaseHelpers.cshtml:

@helper BaseMethod()
{
    <!-- 基础Helper -->
}

View.cshtml:

@{ 
    Layout = "BaseHelpers.cshtml";
}

@BaseMethod()

5.3 外部文件引用

使用@Include引用外部Helper文件:

@Include("~/Views/Shared/Helpers/ProductHelpers.cshtml")

@ProductHelper.RenderProductCard(Model.Product)

第六章:@Helper的最佳实践

6.1 命名约定

  • 使用PascalCase命名@Helper
  • 添加描述性前缀:
    • Render前缀:@RenderProductCard
    • Format前缀:@FormatCurrency
    • Show前缀:@ShowErrorMessage

6.2 参数设计原则

  • 限制参数数量(最好不超过5个)
  • 使用有意义的参数名
  • 为可选参数提供默认值
  • 考虑使用对象参数代替多个简单参数

6.3 性能考虑

  • 避免在@Helper中执行复杂逻辑
  • 考虑缓存频繁使用的@Helper输出
  • 对于性能敏感的场景,考虑使用HtmlHelper

6.4 可测试性

虽然@Helper难以直接单元测试,但可以:

  1. 保持@Helper简单
  2. 将复杂逻辑移到可测试的服务类中
  3. 使用集成测试验证@Helper输出

第七章:@Helper的实际应用案例

7.1 分页控件

@helper Pager(int currentPage, int totalPages, string urlFormat)
{
    <div class="pagination">
        @if (currentPage > 1)
        {
            <a href="@string.Format(urlFormat, currentPage - 1)">&laquo; 上一页</a>
        }
        
        @for (int i = 1; i <= totalPages; i++)
        {
            if (i == currentPage)
            {
                <span class="current">@i</span>
            }
            else
            {
                <a href="@string.Format(urlFormat, i)">@i</a>
            }
        }
        
        @if (currentPage < totalPages)
        {
            <a href="@string.Format(urlFormat, currentPage + 1)">下一页 &raquo;</a>
        }
    </div>
}

7.2 星级评分

@helper StarRating(double rating, int maxStars = 5)
{
    <div class="star-rating">
        @for (int i = 1; i <= maxStars; i++)
        {
            if (rating >= i)
            {
                <i class="fas fa-star"></i>
            }
            else if (rating > i - 0.5)
            {
                <i class="fas fa-star-half-alt"></i>
            }
            else
            {
                <i class="far fa-star"></i>
            }
        }
        <span class="rating-text">@rating.ToString("0.0")/@maxStars</span>
    </div>
}

7.3 动态表单生成

@helper DynamicFormField(string fieldType, string name, object value = null, string label = null, Dictionary<string, object> attributes = null)
{
    <div class="form-field">
        @if (!string.IsNullOrEmpty(label))
        {
            <label for="@name">@label</label>
        }
        
        @switch (fieldType.ToLower())
        {
            case "text":
                <input type="text" id="@name" name="@name" value="@(value ?? "")" 
                       @if (attributes != null) { foreach (var attr in attributes) { <text>@attr.Key="@attr.Value"</text> } } />
                break;
                
            case "textarea":
                <textarea id="@name" name="@name" 
                          @if (attributes != null) { foreach (var attr in attributes) { <text>@attr.Key="@attr.Value"</text> } }>
                    @(value ?? "")
                </textarea>
                break;
                
            case "select":
                var options = value as IEnumerable<SelectListItem>;
                <select id="@name" name="@name" 
                        @if (attributes != null) { foreach (var attr in attributes) { <text>@attr.Key="@attr.Value"</text> } }>
                    @foreach (var option in options ?? Enumerable.Empty<SelectListItem>())
                    {
                        <option value="@option.Value" selected="@option.Selected">@option.Text</option>
                    }
                </select>
                break;
                
            default:
                <span class="text-danger">未知字段类型: @fieldType</span>
                break;
        }
    </div>
}

第八章:@Helper的局限性与替代方案

8.1 @Helper的局限性

  1. 作用域限制:默认只能在定义视图或App_Code中使用
  2. 测试困难:难以进行单元测试
  3. 复杂逻辑处理不便:不适合包含复杂业务逻辑
  4. ASP.NET Core中的变化:ASP.NET Core Razor Pages不支持@Helper语法

8.2 替代方案:视图组件(ViewComponent)

ASP.NET Core中的视图组件替代方案:

public class StarRatingViewComponent : ViewComponent
{
    public IViewComponentResult Invoke(double rating, int maxStars = 5)
    {
        return View(new StarRatingViewModel 
        { 
            Rating = rating,
            MaxStars = maxStars
        });
    }
}

视图(Views/Shared/Components/StarRating/Default.cshtml):

@model StarRatingViewModel

<div class="star-rating">
    @for (int i = 1; i <= Model.MaxStars; i++)
    {
        <!-- 同@Helper实现 -->
    }
</div>

调用方式:

@await Component.InvokeAsync("StarRating", new { rating = Model.Rating })

8.3 替代方案:标签助手(Tag Helpers)

ASP.NET Core中的标签助手:

[HtmlTargetElement("star-rating")]
public class StarRatingTagHelper : TagHelper
{
    public double Rating { get; set; }
    public int MaxStars { get; set; } = 5;
    
    public override void Process(TagHelperContext context, TagHelperOutput output)
    {
        output.TagName = "div";
        output.Attributes.SetAttribute("class", "star-rating");
        
        var content = new StringBuilder();
        // 构建内容
        output.Content.SetHtmlContent(content.ToString());
    }
}

使用方式:

<star-rating rating="@Model.Rating" max-stars="5"></star-rating>

8.4 替代方案:局部视图(Partial Views)

将可重用HTML提取到局部视图中:

_ProductCard.cshtml:

@model Product

<div class="product-card">
    <!-- 产品卡片内容 -->
</div>

使用方式:

@foreach (var product in Model.Products)
{
    @Html.Partial("_ProductCard", product)
}

第九章:从@Helper迁移到ASP.NET Core

9.1 迁移策略

  1. 简单@Helper局部视图
  2. 带逻辑的@Helper视图组件
  3. 表单相关的@Helper标签助手
  4. 全局@Helper静态HTML助手类

9.2 迁移示例

原始@Helper:

@helper FormatDate(DateTime date, bool includeTime = false)
{
    @date.ToString(includeTime ? "yyyy-MM-dd HH:mm" : "yyyy-MM-dd")
}

ASP.NET Core替代方案:

  1. 创建静态助手类:
public static class FormatHelpers
{
    public static string FormatDate(DateTime date, bool includeTime = false)
    {
        return date.ToString(includeTime ? "yyyy-MM-dd HH:mm" : "yyyy-MM-dd");
    }
}
  1. 在视图中使用:
@FormatHelpers.FormatDate(Model.OrderDate, true)

9.3 迁移工具与技术

  1. Razor Generator:预编译Razor视图
  2. .NET Portability Analyzer:分析兼容性问题
  3. 手动重构:逐步替换@Helper

第十章:@Helper的创造性用法

10.1 动态CSS生成

@helper DynamicCSS(string selector, IDictionary<string, string> properties)
{
    <style>
        @selector {
            @foreach (var prop in properties)
            {
                @:@prop.Key: @prop.Value;
            }
        }
    </style>
}

使用方式:

@DynamicCSS(".primary-button", new Dictionary<string, string>
{
    { "background-color", "#007bff" },
    { "color", "#fff" },
    { "padding", "8px 16px" }
})

10.2 多语言支持

@helper LocalizedString(string key, string defaultText = null)
{
    var text = System.Web.HttpContext.GetGlobalResourceObject("Resources", key) ?? defaultText ?? key;
    @text
}

使用方式:

<h1>@LocalizedString("WelcomeMessage", "Welcome")</h1>

10.3 条件编译

@helper DebugInfo()
{
#if DEBUG
    <div class="debug-info">
        <p>Controller: @ViewContext.Controller.GetType().Name</p>
        <p>Action: @ViewContext.RouteData.Values["action"]</p>
        <p>Render Time: @DateTime.Now.ToString("HH:mm:ss.fff")</p>
    </div>
#endif
}

10.4 动态路由生成

@helper RouteLink(string text, string routeName, object routeValues = null, object htmlAttributes = null)
{
    var url = Url.RouteUrl(routeName, routeValues);
    <a href="@url" @if (htmlAttributes != null) { 
        foreach (var attr in HtmlHelper.AnonymousObjectToHtmlAttributes(htmlAttributes)) { 
            @:@attr.Key="@attr.Value" 
        } 
    }>@text</a>
}

结语

@Helper是Razor视图中一个强大而灵活的特性,它提供了在视图中创建可重用HTML片段的便捷方式。通过本指南,我们全面探讨了@Helper的各种用法,从基础到高级技巧,再到实际应用案例和迁移策略。

虽然ASP.NET Core中不再直接支持@Helper语法,但理解其概念和模式对于使用替代技术(如视图组件、标签助手和局部视图)仍然非常有价值。无论您是在维护传统ASP.NET MVC应用程序还是开发新的ASP.NET Core项目,这些知识都将帮助您构建更清晰、更可维护的视图层。
在这里插入图片描述

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

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

相关文章

鸿蒙APP测试实战:从HDC命令到专项测试

普通APP的测试与鸿蒙APP的测试有一些共同的特征&#xff0c;但是也有一些区别&#xff0c;其中共同特征是&#xff0c;它们都可以通过cmd的命令提示符工具来进行app的性能测试。 其中区别主要是&#xff0c;对于稳定性测试的命令的区别&#xff0c;性能指标获取方式的命令的区…

HarmonyOS-ArkUI 自定义弹窗

自定义弹窗 自定义弹窗是界面开发中最为常用的一种弹窗写法。在自定义弹窗中&#xff0c; 布局样式完全由您决定&#xff0c;非常灵活。通常会被封装成工具类&#xff0c;以使得APP中所有弹窗具备相同的设计风格。 自定义弹窗具备的能力有 打开弹窗自定义布局&#xff0c;以…

[electron]预脚本不显示内联script

script-src self 是 Content Security Policy (CSP) 中的一个指令&#xff0c;它的作用是限制加载和执行 JavaScript 脚本的来源。 具体来说&#xff1a; self 表示 当前源。也就是说&#xff0c;只有来自当前网站或者当前页面所在域名的 JavaScript 脚本才被允许执行。"…

开疆智能Ethernet/IP转Modbus网关连接斯巴拓压力传感器配置案例

本案例是将ModbusRTU协议的压力传感器数据上传到欧姆龙PLC&#xff0c;由于PLC采用的是Ethernet/IP通讯协议&#xff0c;两者无法直接进行数据采集。故使用开疆智能研发的Ethernet转Modbus网关进行数据转换。 配置过程 首先我们开始配置Ethernet/IP主站&#xff08;如罗克韦尔…

【Redis】Redis 的持久化策略

目录 一、RDB 定期备份 1.2 触发方式 1.2.1 手动触发 1.2.2.1 自动触发 RDB 持久化机制的场景 1.2.2.2 检查是否触发 1.2.2.3 线上运维配置 1.3 检索工具 1.4 RDB 备份实现原理 1.5 禁用 RDB 快照 1.6 RDB 优缺点分析 二、AOF 实时备份 2.1 配置文件解析 2.2 开启…

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决

20250607在荣品的PRO-RK3566开发板的Android13系统下实现长按开机之后出现插入适配器不会自动启动的问题的解决 2025/6/7 17:20 缘起&#xff1a; 1、根据RK809的DATASHEET&#xff0c;短按开机【100ms/500ms】/长按关机&#xff0c;长按关机。6s/8s/10s 我在网上找到的DATASHE…

浏览器工作原理01 [#]Chrome架构:仅仅打开了1个页面,为什么有4个进程

引用 浏览器工作原理与实践 Chrome打开一个页面需要启动多少进程&#xff1f;你可以点击Chrome浏览器右上角的“选项”菜单&#xff0c;选择“更多工具”子菜单&#xff0c;点击“任务管理器”&#xff0c;这将打开Chrome的任务管理器的窗口&#xff0c;如下图 和Windows任务管…

智能问数Text2SQL Vanna windows场景验证

架构 Vanna 是一个开源 Python RAG&#xff08;检索增强生成&#xff09;框架&#xff0c;用于 SQL 生成和相关功能。 机制 Vanna 的工作过程分为两个简单步骤 - 在您的数据上训练 RAG“模型”&#xff0c;然后提出问题&#xff0c;这些问题将返回 SQL 查询&#xff0c;这些查…

【VLAs篇】02:Impromptu VLA—用于驱动视觉-语言-动作模型的开放权重和开放数据

项目描述论文标题Impromptu VLA&#xff1a;用于驱动视觉-语言-动作模型的开放权重和开放数据 (Impromptu VLA: Open Weights and Open Data for Driving Vision-Language-Action Models)研究问题自动驾驶的视觉-语言-动作 (VLA) 模型在非结构化角落案例场景中表现不佳&#xf…

[学习笔记]使用git rebase做分支差异化同步

在一个.NET 项目中&#xff0c;使用了Volo.Abp库&#xff0c;但出于某种原因&#xff0c;需要源码调试&#xff0c;因此&#xff0c;使用源码方式集成的项目做了一个分支archive-abp-source 其中引用方式变更操作的提交为&#xff1a;7de53907 后续&#xff0c;在master分支中…

【Linux应用】Linux系统日志上报服务,以及thttpd的配置、发送函数

【Linux应用】Linux系统日志上报服务&#xff0c;以及thttpd的配置、发送函数 文章目录 thttpd服务安装thttpd配置thttpd服务thttpd函数日志效果和文件附录&#xff1a;开发板快速上手&#xff1a;镜像烧录、串口shell、外设挂载、WiFi配置、SSH连接、文件交互&#xff08;RADX…

Jmeter(四) - 如何在jmeter中创建网络测试计划

1.简介 如何创建基本的 测试计划来测试网站。您将创建五个用户&#xff0c;这些用户将请求发送到JMeter网站上的两个页面。另外&#xff0c;您将告诉用户两次运行测试。 因此&#xff0c;请求总数为&#xff08;5个用户&#xff09;x&#xff08;2个请求&#xff09;x&#xff…

2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题

2025年上海市“星光计划”第十一届职业院校技能大赛 网络安全赛项技能操作模块样题 &#xff08;二&#xff09;模块 A&#xff1a;安全事件响应、网络安全数据取证、应用安全、系统安全任务一&#xff1a;漏洞扫描与利用:任务二&#xff1a;Windows 操作系统渗透测试 :任务三&…

Modbus转ETHERNET IP网关:快速冷却系统的智能化升级密钥

现代工业自动化系统中&#xff0c;无锡耐特森Modbus转Ethernet IP网关MCN-EN3001扮演着至关重要的角色。通过这一技术&#xff0c;传统的串行通讯协议Modbus得以在更高速、更稳定的以太网环境中运行&#xff0c;为快速冷却系统等关键设施的自动化控制提供了强有力的支撑。快速冷…

Linux——TCP和UDP

一、TCP协议 1.特点 TCP提供的是面向连接、可靠的、字节流服务。 2.编程流程 &#xff08;1&#xff09;服务器端的编程流程 ①socket() 方法创建套接字 ②bind()方法指定套接字使用的IP地址和端口。 ③listen()方法用来创建监听队列。 ④accept()方法处理客户端的连接…

Android Settings 数据库生成、监听与默认值配置

一、Settings 数据库生成机制​ ​传统数据库生成&#xff08;Android 6.0 前&#xff09;​​ ​路径​&#xff1a;/data/data/com.android.providers.settings/databases/settings.db​创建流程​&#xff1a; ​SQL 脚本初始化​&#xff1a;通过 sqlite 工具创建数据库文件…

SeaweedFS S3 Spring Boot Starter

SeaweedFS S3 Spring Boot Starter 源码特性环境要求快速开始1. 添加依赖2. 配置文件3. 使用方式方式一&#xff1a;注入服务类方式二&#xff1a;使用工具类 API 文档SeaweedFsS3Service 主要方法SeaweedFsS3Util 工具类方法 配置参数运行测试构建项目注意事项集成应用更多项目…

智慧城市项目总体建设方案(Word700页+)

1 背景、现状和必要性 1.1 背景 1.1.1 立项背景情况 1.1.2 立项依据 1.2 现状 1.2.1 党建体系运行现状 1.2.2 政务体系运行现状 1.2.3 社会治理运行现状 1.2.4 安全监管体系现状 1.2.5 环保体系运行现状 1.2.6 城建体系运行现状 1.2.7 社区体系运行现状 1.2.8 园区…

详解ZYNQ中的 RC 和 EP

详解ZYNQ中的 RC 和 EP 一、ZYNQ FPGA 开发板基础&#xff08; ZC706 &#xff09; 1. 核心特点 双核大脑 灵活积木&#xff1a; ZC706 集成了 ARM Cortex-A9 双核处理器&#xff08;相当于电脑 CPU&#xff09;和 FPGA 可编程逻辑单元&#xff08;相当于可自定义的硬件积木…

STM32CubeMX-H7-19-ESP8266通信(中)--单片机控制ESP8266实现TCP地址通信

前言 上篇文章我们已经能够使用串口助手实现esp8266的几种通信&#xff0c;接下来我们使用单片机控制实现。这篇文章会附带教程&#xff0c;增加.c和,.h&#xff0c;把串口和定时器放到对应的编号&#xff0c;然后调用初始化就可以使用了。 先讲解&#xff0c;然后末尾再放源码…