首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在锈蚀的多线程中使用串口?

如何在锈蚀的多线程中使用串口?
EN

Stack Overflow用户
提问于 2018-11-23 03:27:32
回答 1查看 1.4K关注 0票数 2

我正试图在Linux上读写我的串口,以便与一个微控制器进行通信,而我正试图用Rust来实现这一点。

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

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

代码语言:javascript
复制
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中的可变资源,我如何模仿这个功能?我知道,由于这个特定的例子可以在一个线程中完成,但我认为最终会有一个更大的程序,最终会是多个线程。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-23 04:56:18

您可以将端口封装在ArcMutex中,然后编写如下内容:

代码语言:javascript
复制
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();
}

为了在测试机器上运行,我用存根类替换了串口,减少了睡眠,用有限循环替换了无限循环。

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53440321

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档