gpt4 book ai didi

rust - 如何在 Rust 中多线程中使用串口?

转载 作者:行者123 更新时间:2023-11-29 08:13:48 25 4
gpt4 key购买 nike

我正在尝试读取和写入 Linux 上的串行端口以与微 Controller 通信,并且我正在尝试在 Rust 中执行此操作。

在使用 C++ 或 Python 进行开发时,我的正常模式是有两个线程:一个线程定期通过串行发送请求,另一个线程从缓冲区读取字节并处理它们。

在 Rust 中,我在使用串行 crate 时遇到了借用检查器的麻烦。这对我来说很有意义,但我不确定异步通信接口(interface)的设计在 Rust 中会是什么样子。这是我的来源片段:

let mut port = serial::open(&device_path.as_os_str()).unwrap();
let request_temperature: Vec<u8> = vec![0xAA];

thread::spawn(|| {
let mut buffer: Vec<u8> = Vec::new();
loop {
let _bytes_read = port.read(&mut buffer);
// process data
thread::sleep(Duration::from_millis(100));
}
});

loop {
port.write(&request_temperature);
thread::sleep(Duration::from_millis(1000));
}

当我有两个线程持有 Rust 中的可变资源时,如何模拟此功能?我知道,由于这个特定的示例可以在单个线程中完成,但我认为对于最终更大的程序,这最终将是多个线程。

最佳答案

您可以将端口包装在 Arc 中和一个Mutex ,那么你可以这样写:

use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;

struct Port;
impl Port {
pub fn read(&mut self, _v: &mut Vec<u8>) {
println!("READING...");
}
pub fn write(&mut self, _v: &Vec<u8>) {
println!("WRITING...");
}
}

pub fn main() {
let mut port = Arc::new(Mutex::new(Port));
let p2 = port.clone();

let handle = thread::spawn(move || {
let mut buffer: Vec<u8> = Vec::new();
for j in 0..100 {
let _bytes_read = p2.lock().unwrap().read(&mut buffer);
thread::sleep(Duration::from_millis(10));
}
});

let request_temperature: Vec<u8> = vec![0xAA];
for i in 0..10 {
port.lock().unwrap().write(&request_temperature);
thread::sleep(Duration::from_millis(100));
}

handle.join();
}

为了让它在测试机器上运行,我用 stub 类替换了串行端口,减少了 sleep 时间,并用一些有限循环替换了无限循环。

虽然这有效,但您可能实际上希望在某个阶段线程之间进行正确的通信,此时您需要查看 std::sync::mpsc::channel

关于rust - 如何在 Rust 中多线程中使用串口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53440321/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com