[记]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
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
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 } }
-------------====================分割线====================-------------