#module #mp3 #player #serial #protocols #command #uart

无std dfr0299

Rust对DFR0299 MP3播放器模块串行协议的实现

2个版本

0.1.1 2022年7月17日
0.1.0 2022年7月17日

#895 in 嵌入式开发

MPL-2.0 许可证

30KB
480 代码行

dfr0299

Crates.io docs.rs

Rust对DFR0299 MP3播放器模块的串行协议实现

此crate提供了对DFR02999 MP3播放器模块支持的命令的零分配、无std兼容的序列化和反序列化。

模块通信通过9600-8-N-1的UART进行。

示例

提供了两个示例:一个使用mio_serial,另一个用于RP2040

cargo run --package serial_port
cargo run --release --package pico --target thumbv6m-none-eabi

将命令序列化到缓冲区

use dfr0299::{Command};
let mut buf = [0u8; 10];
Command::Reset.serialise(&mut buf)?;
// do something with the buffer, e.g. write to a uart peripheral
Command::Track(1).serialise(&mut buf)?;
// send the buffer, e.g.
// uart.write_full_blocking(&buf)?;

解析响应消息

use dfr0299::{Parser, ParseResult};
fn process<R: std::io::Read>(mut uart: R) ->
    Result<(), Box<dyn std::error::Error>> {
    let mut parser = Parser::new();
    let mut buf = [0u8; 1];
    loop {
        uart.read_exact(&mut buf)?;
        match parser.process_byte(buf[0]) {
            Ok(ParseResult::Incomplete) => {}
            Ok(ParseResult::Complete(msg)) => {
                println!("Message received: {msg:?}");
            }
            Err(e) => {
                println!("Parse error: {e}");
            }
        }
    }
}

注意,数据表中序列化的示例消息校验和错误。校验和算法在数据表中没有描述,但在官方Arduino库代码中有

许可证

此crate根据Mozilla Public License Version 2.0的条款进行分发。

依赖项

~1.5MB
~36K SLoC