戳人痛处

导航

[记]Rust在多线程里使用串口

1.

toml

[dependencies]
serial = "0.4.0"
encoding = "0.2.33"

--

use std::io::{Read, Write};
use std::sync::{Arc, Mutex};
use std::thread;
use std::time::Duration;
use serial;
use encoding::{DecoderTrap,EncoderTrap, Encoding};
use encoding::all::GBK;
// extern crate serial;

// use std::time::Duration;
// use std::thread;
use serial::prelude::*;
use std::io::prelude::*;
//     pub fn write(&mut self, _v: &Vec<u8>) {
//         self.write(v)
//     }
// }

pub fn main() {
    const SETTINGS: serial::PortSettings = serial::PortSettings {
        baud_rate: serial::Baud9600,
        char_size: serial::Bits8,
        parity: serial::ParityNone,
        stop_bits: serial::Stop1,
        flow_control: serial::FlowNone,
    };

    let mut pport = serial::open("COM41").unwrap();
    pport.configure(&SETTINGS).unwrap();
    pport.set_timeout(Duration::from_millis(10)).unwrap();

    let port = Arc::new(Mutex::new(pport));
    let p2 = Arc::clone(&port);
    // let p2 = port.clone();

    let handle = thread::spawn(move || {
        let mut buf: Vec<u8> = (0..255).collect();

        for j in 0..100 {
            let mut _bytes_read = p2.lock().unwrap();
            if let Ok(zs) = _bytes_read.read(&mut buf[..]) {
                let data = GBK.decode(&buf[0..zs], DecoderTrap::Ignore).unwrap();
                println!("{}",data);
            }else{
                println!("none");
                thread::sleep(Duration::from_millis(300));
            }
         
            
        }
    });

    // let request_temperature: Vec<u8> = vec![0xAA];
    for i in 0..10 {
        {
            let mut ssend=port.lock().unwrap();
            ssend.write(&GBK.encode("at\r\n", EncoderTrap::Ignore).unwrap()).unwrap();
        // Mutex::unlock(ssend);
        }
        thread::sleep(Duration::from_millis(300));
    }

    handle.join();
}

输出

OK

none
none

OK


OK

none
none
none

OK


OK

none
none
none

OK

none
none

OK


OK

none
none
none

OK

none
none

OK

none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
none
View Code

 2. 

toml

serialport = "4.2.0"
use std::time;

fn main() {
    if let Ok(mut port) = serialport::new("COM3", 115200)
    .timeout(time::Duration::from_millis(20)).open(){
        if let Ok(mut portcopy) = port.try_clone(){
            std::thread::spawn(move||{
                let mut buffer = [0; 32];
                loop{
                    if let Ok(ssize) = portcopy.read(&mut buffer){
                        println!("recv-size:{}",ssize);
                        println!("get:{:?}",buffer);
                    };
                }
            });
        }
        for _ in 0..1000{
            if let Ok(ssize)=port.write(b"at\r\n"){
                println!("send-size:{}",ssize);
            };
            // port.s
            std::thread::sleep(std::time::Duration::from_millis(10));
        }
    }
}

输出

recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
send-size:4
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
send-size:4
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
send-size:4
recv-size:9
get:[97, 116, 13, 13, 10, 79, 75, 13, 10, 0
View Code

 3.

toml:

serial-rs = "0.2.1"
esleep = "1.1.0"

 

static mut Ppport:Option<serial_rs::windows::COMPort> = None;
use std::io::{Write,Read};
fn main() {
    if let Ok(cd) = serial_rs::windows::COMPort::new("COM112".to_string(), Some(serial_rs::SerialPortSettings::default().baud(115200))){
        unsafe{
            Ppport = Some(cd);
        }
    };
    
    std::thread::spawn(|| loop {
        unsafe {
            if let Some(dd) = &mut Ppport{
                dd.write(b"1\n");
            }
        }
        esleep::us(1);//延时1us
    });
    std::thread::spawn(|| {
        let mut cdd = [0;1024];
        loop {
        unsafe {
           if let Some(dd) = &mut Ppport{
            if let Ok(_) = dd.read(&mut cdd){//blocking
                // println!("r:{}",dcd);
                let cddc = String::from_utf8_lossy(&cdd);
                println!("r:{}",cddc.to_string());
                // cdd = [0;1024];
            };
           }
        }
        }
        }
    );
    loop {
        
        
        esleep::ms(200);//延时200ms
    }
}

 

posted on 2022-08-18 13:29  戳人痛处  阅读(696)  评论(0编辑  收藏  举报