You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rust no_std环境下Arduino Nano传递serial至ufmt函数的参数声明

在Arduino Nano的Rust #![no_std]环境中定义接收串口的自定义函数

要解决这个问题,核心是利用ufmt库的uWrite trait约束函数参数,无需硬编码串口的具体类型(当然也可以用具体类型,但泛型+trait的方式更通用)。

方法1:泛型+trait约束(推荐)

这种写法兼容所有实现uWrite trait的输出设备,不仅限于串口,灵活性更高。

首先导入必要的trait:

use ufmt::uWrite;

然后定义函数:

// 返回Result让调用者处理错误,符合Rust错误处理习惯
fn print_string<W>(writer: &mut W) -> Result<(), W::Error>
where
    W: uWrite,
{
    ufmt::uwriteln!(writer, "Hello world\r")
}

如果希望在函数内部直接unwrap(不返回错误),需要给错误类型加上Debug约束:

fn print_string<W>(writer: &mut W)
where
    W: uWrite,
    W::Error: core::fmt::Debug,
{
    ufmt::uwriteln!(writer, "Hello world\r").unwrap();
}

在main中调用时直接传入&mut serial即可:

// 假设你已经完成串口初始化
print_string(&mut serial);

方法2:使用具体类型

如果你已经知道串口的具体类型(比如打印出来的是Serial<USART0, arduino_nano::serial::Baud9600>),可以直接把参数声明为该类型:

use arduino_nano::Serial;
use arduino_nano::serial::Baud9600;

fn print_string(writer: &mut Serial<USART0, Baud9600>) {
    ufmt::uwriteln!(writer, "Hello world\r").unwrap();
}

这种写法的缺点是灵活性差,更换波特率或串口后需要修改函数参数类型。

内容的提问来源于stack exchange,提问作者MadMike

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 23:51:01