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
相关产品推荐
相关产品推荐

