Bye Bye Moore

PoCソルジャーな零細事業主が作業メモを残すブログ

シリアル越しにbase64でくる画像データを表示するRustスクリプト

実際のところ

cargo.toml

[dependencies]
base64 = "0.13"
image = "0.23"
serialport = "4.0"

logic.rs

use base64::decode;
use image::load_from_memory;
use serialport::prelude::*;
use std::io::BufReader;
use std::time::Duration;

fn main() -> Result<(), Box<dyn std::error::Error>> {
    // シリアルポートの設定
    let port_name = "/dev/ttyUSB0";
    let baud_rate = 115200;
    let settings = SerialPortSettings {
        baud_rate,
        ..Default::default()
    };

    // シリアルポートを開く
    let mut port = serialport::open_with_settings(port_name, &settings)?;

    // バッファを用意
    let mut buffer: Vec<u8> = vec![0; 1024];

    loop {
        // シリアルポートからデータを読み取る
        let n = port.read(&mut buffer)?;
        let base64_data = String::from_utf8_lossy(&buffer[..n]);

        // Base64デコード
        match decode(&base64_data) {
            Ok(decoded_data) => {
                // 画像として読み込む
                match load_from_memory(&decoded_data) {
                    Ok(img) => {
                        // 画像を表示
                        img.show().unwrap();
                    }
                    Err(e) => eprintln!("Failed to load image: {}", e),
                }
            }
            Err(e) => eprintln!("Failed to decode Base64: {}", e),
        }

        // 少し待つ
        std::thread::sleep(Duration::from_secs(5));
    }
}