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

使用serialport-rs一次性发送多字节数组的实现疑问及文件写入乱码问题咨询

问题分析与解决方案

我来帮你梳理下这两个问题的解决思路:

1. serialport-rs 发送多字节数组的正确方式

你之前的代码里有个明显的数组越界问题:你的buffer是[0_u8; 64](64个元素,索引范围0~63),但你尝试取切片&buffer[0..65]——这个切片会尝试访问索引64的元素,这在Rust里会直接触发运行时panic,或者读取到内存中的无效数据,根本没法正确发送。

正确的写法很简单,直接传递数组本身即可(Rust会自动将数组 Deref 为切片),或者使用正确的切片范围:

// 不需要用&mut引用,直接声明数组并修改即可
let mut buffer = [0_u8; 64];
buffer[0] = 0xA6;
buffer[1] = 0x55;

// 直接传递数组,自动转为&[u8]切片
port.write(&buffer).expect("Write failed!");

// 或者用正确的切片范围(三种写法等价)
// port.write(&buffer[0..64]).expect("Write failed!");
// port.write(&buffer[..]).expect("Write failed!");

port.write()方法接收的是&[u8]类型的参数,任何能转为该类型的结构都可以直接传递,包括固定长度数组。

2. 文件写入"乱码"的原因与解决方法

你看到的"乱码"其实不是真正的错误,而是文本编辑器无法解析二进制数据导致的显示问题:

你写入的是原始二进制字节(比如0xA6、0x55以及大量0x00空字节),这些字节大多不属于可打印的ASCII/UTF-8字符范围,文本编辑器会把它们当作无效字符显示为乱码(比如�)。

解决方法分两种场景:

场景一:只是验证二进制数据是否正确写入

不需要修改代码,改用二进制查看工具查看文件内容即可,比如在终端中使用:

# 查看十六进制格式的内容
hexdump foo.txt
# 或者更易读的格式
xxd foo.txt

这样就能看到准确的字节值,确认0xA6、0x55和后续的0x00是否正确写入。

场景二:需要写入可读的文本格式

如果要让文件内容直接可读,可以把二进制字节转换为十六进制字符串再写入:

use std::io::prelude::*;
use std::fs::File;

fn main() -> std::io::Result<()> {
    let mut buffert = File::create("foo.txt")?;
    let mut buffer = [0_u8; 64];
    buffer[0] = 0xA6;
    buffer[1] = 0x55;

    // 将每个字节转为两位十六进制字符串,用空格分隔
    let hex_content: String = buffer
        .iter()
        .map(|byte| format!("{:02X} ", byte))
        .collect();

    buffert.write_all(hex_content.as_bytes())?;
    Ok(())
}

运行后,foo.txt里的内容会是类似A6 55 00 00 ...的可读字符串,不会显示乱码。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.30 10:38:15