快速入门 .NET nanoFramework 开发 ESP32-Pico 应用

简介: 本文是一篇适合初学者的 .NET nanoFramework 保姆级入门教程,并提供了基本的入门程序并介绍了微雪的 ESP32-S2-Pico 使用 .NET nanoFramework 开发过程的基础知识。

1. 背景

1.1 .NET IOT 与 .NET nanoFramework

.NET 支持物联网(IoT) 应用的开发,其提供的.NET IoT 库可以让我们在运行 Windwos 和 Linux 系统的 IoT 设备上运行应用,并利用 GPIO、SPI、I2C、PWM 和串行端口等接口使用数百个传感器、显示器、输入设备。但是这并不适用于受约束的嵌入式设备,比如 ESP32、M5Stack、STM32 等。对于这些受约束的嵌入式设备,.NET nanoFramework 提供了一个很好的方案,适用于这些微控制器,能够为受限嵌入式设备编写托管代码。开发者可以利用熟悉的 IDE Visual Studio 和 .NET(C#) 知识快速编写应用程序,而无需担心微控制器的低层硬件复杂性。更方便的是,使用 Visual Studio 可以直接在真实硬件上编写、部署、调试代码。

1.2 微控制器

使用微控制器的好处显而易见,毕竟20 ~ 50 元左右的价格,对于许多应用来说是非常实惠的,尤其是对于那些需要大量生产的应用。另外,兼具小巧体积的同时,微控制器具有较强的可编程性和可扩展性,可以通过编程来定义其功能。这使得微控制器能够应用于许多不同的领域,并且在需要更改功能时也非常方便。

Pico & ESP32

注:上图左三为 Raspberry Pi Pico 系列,最右边为 ESP32-S2-Pico,蓝色板子均为微雪产品。

1.3 实验板介绍

.NET nanoFramework 对于 Raspberry Pi Pico 系列的支持正在计划中,虽然已经有一些爱好者的非官方的尝试,但是其项目似乎已经不再更新,还是等待官方的正式支持吧,我也会一直关注。不过 .NET nanoFramework 对于 ESP32 是支持的,所以近期又买了 ESP32 的板子来做一些尝试。

ESP32-S2-Pico 体积小巧,外设接口丰富,集成了低功耗 Wi-Fi 系统级芯片(SoC)和大容量存储器,支持 Raspberry Pi Pico 扩展板生态的开发板。具有硬件加密加速器、RNG、HMAC 和数字签名 (Digital Signature) 模块,满足物联网的安全要求。另外还有多种低功耗工作状态满足在物联网 (IoT)、移动设备、可穿戴电子设备、智能家居等应用场景的功耗需求。

2. 搭建 .NET nanoFramework 开发环境

.NET nanoFramework 开发环境搭建首先需要安装好 Visual Studio 2022(也支持VS 2019),然后安装扩展和工具。另外,SDK 需要必须安装 .NET 6.0 运行时(或 .NET 6.0 SDK)

2.1 安装扩展

打开 Visual Studio ,随便打开/新建一个任意的项目或直接选择“继续但无需代码”进入主界面,通过选择菜单“扩展”>“管理扩展”来打开“管理扩展”对话框。选择左侧的“联机”类别,然后在搜索框中输入“nano”。

安装扩展

选择“.NET nanoFramework Extension” 下载安装,系统将提示重新启动 Visual Studio 以完成扩展的安装,此时关闭 Visual Studio 来进行继续的操作即可。

确认安装

2.2 安装工具库

接下来我们需要安装 .NET nanoFramework firmware 工具库,这个工具后面会使用到,这是一个 .NET Core Tool 工具,可以刷写固件(nanoBooter和nanoCLR) 到NET nanoFramework 目标,也可以进行应用程序部署(运行 .NET 应用程序所需的所有程序集)和恢复以前保存的部署映像。关于这个工具箱的更多的介绍可以前往官方仓库阅读:https://github.com/nanoframework/nanoFirmwareFlasher/blob/main/README.zh-cn.md

打开控制台,使用以下.NET Core CLI 命令即可安装 .NET nanoFramework Firmware flash 工具:

dotnet tool install -g nanoff

成功安装后,将显示调用说明和安装的工具版本。

nanoff

3. 固件安装

在这一部分,我们需要向电路板刷入 .NET nanoFramework 的固件。

3.1 设备连接

首先我们要进入 ESP32 的下载模式,不同的板子有不同的方式,这里我们可以查阅购买产品的说明书。针对这款 ESP32-S2-Pico 下载更新程序需要先按住 BOOT 按键不放再按下 RESET 按键后释放或断开 USB 按住 BOOT 键上电,此时 ESP32-S2 的 UART0(GPIO43,GPIO44)、USB 均可烧录程序。

接入设备

这里我采用按住 BOOT 按键然后与电脑的 USB 口连接上电,此时我们就可以在设备管理器看到新插入的 USB 串行设备。

COM

如果电脑存在多个已有的 COM 设备,记得注意接入设备后的变化,需要记好 COM 口的编号,后面会用到。

当然你也可以使用之前安装的 nanoff,使用下面命令列出可用的串行端口:

nanoff --listports

nanoff listports

这里我们可以看到,新接入的 ESP32-S2-Pico 的串行端口为 COM5。

3.2 刷写固件

在刷写固件时,我们需要提供正确的目标名称来执行固件刷写,否则板子可能无法工作。除了从平台来看,.NET nanoFramework 支持 esp32, stm32, cc13x2, gg11,在固件刷写时需要指定外。不同的板子虽然都是用 ESP32 但是其在设计时也会或多或少存在一些差异,ESP32 板子的构建列表 Target 可以查看这里:https://github.com/nanoframework/nf-interpreter#esp32-modules-and-boards

针对这块板子,如果我们使用官方的入门教程,你会发现这样的错误:

For ESP32-S2 series nanoff isn't able to make an educated guess on the best target to use.
Please provide a valid target name using this option '--target MY_ESP32_S2_TARGET' instead of '--platform esp32'.

Error E9000: Invalid or missing arguments.

Error E9000

出错也不奇怪,毕竟这块板子不在官方的列表当中,猜不出来是正常的。虽然根据其设计是属于 Pico 系列的,但是使用 ESP32_PICO 是无效的,刷写后设备无法启动。我们可以直接使用下面的命令,刷写同为 ESP32-S2 系列的 FEATHER_S2 ,将连接到 COM5 的 ESP32 板子的固件更新到最新的可用版本:

nanoff --target FEATHER_S2 --serialport COM5 --update

等待 30 秒左右即可刷写成功。

刷写成功

对了,上面刷写前,打印了板子的基本信息,如果你想直接查看板子信息,可以使用下面的命令:

nanoff --platform esp32 --serialport COM5 --devicedetails

devicedetails

3.3 设备固件检查

固件刷写完成后,设备是仍处于固件刷新状态,我们需要按 RESET 键使设备恢复正常状态或直接重新插拔 USB,此时如果电脑没有任何响应则需要检查是否刷写失败。

刷新成功后,我们是可以在 Visual Studio 的设备管理器中看到该设备的。设备管理器 Device Explore 可以通过 “视图”>“其他窗口”>“Device Explore” 来打开。

device explore

3.4 刷写指定版本

有时可能最新固件存在适配或某些问题,我们需要安装其他的稳定版本,使用下面的命令我们可以列出所有稳定版本的情况:

nanoff --listboards --platform esp32

如果想刷写指定的版本如 FEATHER_S2 1.8.0.741,可以使用下面的命令:

nanoff --target FEATHER_S2 --fwversion 1.8.0.741 --serialport COM5 --update

3.5 程序集的版本对齐

为什么介绍指定版本的安装,是因为不同版本之间引用的 Nuget 包需要和刷写的固定保持一致。若不一致,则会出现下面的报错:

Couldn't find a valid assembly required by mscorlib...

此时我们需要调整安装的 Nuget 包的版本和所刷写固定的需求改为一致即可。在设备管理器中点击“Device Capabilities”即可查看程序集版本和校验信息:

Device Capabilities

如下图已经标出了一个红色的不一致的包信息,根据组件包的介绍说明,改为一致即可:

包信息

4. 编写程序

前面我们已经做好了必要的准备,下面就可以开始愉快的编码时间。需要注意的一点是:创建 .NET nanoFramework 项目时,不要进行任何下拉框的筛选限制,你可以搜索 “nano” 即可看到项目模板。首次创建项目时若出现报错可忽略,关闭窗口前往文件夹打开生成的 sln 即可。

创建项目

4.1 编写 “Hello World” 应用

首次创建 .NET nanoFramework 项目,其模板因为是新增的,所以会排在第一位,直接选择 “Blank Application” 模板创建项目即可。

创建项目

该模板即是一个简单的 Hello World 应用,如果项目出现报错,则可能需要你手动安装缺失的 Nuget 包,可以通过包管理器搜索 “nano” 安装核心包 “nanoFramework.CoreLibrary” 并安装。

安装 Nuget 包

安装缺失的 Nuget 包即可点击运行,记得在“Device Explore” 中选择你要运行的设备,以下便是成功运行后的信息:

运行情况

当前的代码只是在调试的信息中打印了 Hello World ,但这似乎并没有板子什么事情,接下来我们使用其串口来输出 Hello World 信息。

4.2 串口输出 “Hello World”

使用串口我们只需要稍微改造一下代码即可,这里需要通过 Nuget 安装 nanoFramework.System.IO.Ports 包:

static SerialPort _serialDevice;

public static void Main()
{
    Debug.WriteLine("Hello from nanoFramework!");

    // 获取可用串口
    var ports = SerialPort.GetPortNames();

    Debug.WriteLine("Available ports: ");

    foreach (string port in ports)
    {
        Debug.WriteLine($" {port}");
    }

    _serialDevice = new SerialPort("COM1");

    // 设置参数
    _serialDevice.BaudRate = 9600;
    _serialDevice.Parity = Parity.None;
    _serialDevice.StopBits = StopBits.One;
    _serialDevice.Handshake = Handshake.None;
    _serialDevice.DataBits = 8;

    // 设置缓冲区大小
    _serialDevice.ReadBufferSize = 2048;

    // 使用以上设置打开串口
    _serialDevice.Open();

    _serialDevice.WriteTimeout = 500;

    for (; ; )
    {
        _serialDevice.WriteLine(DateTime.UtcNow + " hello from nanoFramework!");
        Thread.Sleep(2000);
    }
}

编译并部署上面的代码到 ESP32 板子,点击 RESET 按钮程序就会启动。此时我们连接串口即可看到打印的 Hello World 信息。

串口输出

4.3 串口连接

这一节主要介绍如何连接 ESP32 设备的串口,上一节我们在串口输出信息前打印了设备的串口情况,根据打印信息,我们可以看到 SerialPort.GetPortNames() 设备有2个串口可用:COM1 和 COM2 这里使用了 COM1,在硬件接口上通过下图可查得 UART0 的 TX 和 RX 分别为 GP43 和 GP44。

ESP32-S2-Pico 硬件接口

这里使用 USB 转 TTL 设备进行接线,TX 接 GP44,RX 接 GP43,GND 随便接一个ESP32 的 GND 口,比如 3 号物理针脚,USB 转 TTL 短接帽的电压记得选到 3V3。

USB 转 TTL

接好这三根线将串口连接电脑,即可使用串口工具(比如:MobaXterm)打开该串口查看 ESP32 打印的信息了。

注意:串口波特率 9600 ,其他均为默认,可查看下图:

MobaXterm

5. 最后

总体来说 .NET nanoFramework 的开发体验对 .NET 熟悉的同学还是非常友好的。它提供了一个熟悉的开发环境,可以让你使用 Visual Studio 和 C# 语言进行开发。此外,.NET nanoFramework 还支持与 .NET Framework 相同的语言特性和 API,因此你可以很容易地将代码迁移到 .NET nanoFramework 上。

后续我会继续进行 .NET nanoFramework 相关的研究,感兴趣的同学可以点一波关注哦,感谢!

相关文章
|
29天前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
60 10
|
9天前
|
存储 开发工具 Android开发
使用.NET MAUI开发第一个安卓APP
【9月更文挑战第24天】使用.NET MAUI开发首个安卓APP需完成以下步骤:首先,安装Visual Studio 2022并勾选“.NET Multi-platform App UI development”工作负载;接着,安装Android SDK。然后,创建新项目时选择“.NET Multi-platform App (MAUI)”模板,并仅针对Android平台进行配置。了解项目结构,包括`.csproj`配置文件、`Properties`配置文件夹、平台特定代码及共享代码等。
|
11天前
|
开发框架 .NET C#
VSCode开发.net项目时调试无效
【9月更文挑战第22天】在使用 VSCode 开发 .NET 项目时遇到调试问题,可从项目配置、调试配置、调试器安装、运行环境、日志和错误信息等方面排查。确认项目类型及文件配置,检查 `launch.json` 文件及配置项,确保调试器扩展已安装并启用,验证 .NET 运行时版本和环境变量,查看 VSCode 输出窗口和项目日志文件,检查权限及代码错误。若问题仍未解决,可查阅官方文档或社区论坛。
|
18天前
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
53 6
|
16天前
|
人工智能 前端开发 开发工具
解读.NET 技术的开发潜力
本文全面介绍了.NET技术在软件开发领域的核心优势、创新应用及面临的挑战。.NET以其统一的开发平台、强大的工具和跨平台能力,成为企业级应用、Web应用乃至游戏开发的理想选择。然而,在性能优化、容器化及AI集成等方面仍需不断突破。通过积极拥抱开源和社区驱动模式,.NET将持续推动软件开发的进步。
35 1
|
28天前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
28天前
|
SQL 关系型数据库 数据库
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
七天.NET 8操作SQLite入门到实战详细教程(选型、开发、发布、部署)
|
28天前
|
消息中间件 开发框架 前端开发
YuebonCore:基于.NET8开源、免费的权限管理及快速开发框架
YuebonCore:基于.NET8开源、免费的权限管理及快速开发框架
|
1月前
|
开发框架 JavaScript 前端开发
|
2月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
41 0