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 相关的研究,感兴趣的同学可以点一波关注哦,感谢!

C#
作者:|慕设计5272072|,原文链接: http://www.imooc.com/article/334528

文章推荐

python mitmproxy抓包库

用rust 写一个jar包 class冲突检测工具

Java网络编程----通过实现简易聊天工具来聊聊BIO

第一章、计算机组成与体系结构

Nginx常用配置及和基本功能讲解

排序算法之详解冒泡排序

Elasticsearch搜索功能的实现(五)-- 实战

C 语言版线程池

Java线程池和Spring异步处理高级篇

Linux常用的20个命令(上)

记一次Tomcat卡死在 Deploying web application 步骤的问题

TornadoFx设置保存功能((config和preference使用))