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

