1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
use std::time::{Duration,SystemTime};
use std::thread::sleep;
#[derive(Default)]
pub struct Atpack{
porthandle:Option<Box<dyn serialport::SerialPort>>
}
impl Atpack {
pub fn new()->Self{
Self{..Default::default()}
}
pub fn open(&mut self,compath:&str,boud:u32)->bool{
if let Ok(port) = serialport::new(compath, boud)
.timeout(std::time::Duration::from_millis(20)).open(){
self.porthandle = Some(port);
return true;
};
false
}
pub fn send(){
}
pub fn query(&mut self,msg:&str)->Option<String>{
if let Some(hand) =&mut self.porthandle{
if let Err(_) = hand.write(msg.as_bytes()){
return None;
};
let mut buff = [0;1024];
if let Ok(_) = hand.read(&mut buff){
if let Ok(data) = std::str::from_utf8(&buff[..]){
return Some(data.into());
}
};
};
None
}
pub fn send_and_recv_confirm_single_key(&mut self,at_send:&str,at_recv:&str)->Result<String,String>{
let mut tmpdata = String::new();
if let Some(getdata) = self.query(at_send){
if let Some(_) = getdata.find(at_recv){
return Ok(getdata);
}
tmpdata = getdata;
}
Err(tmpdata)
}
pub fn send_and_recv_confirm_single_key_split_while(&mut self,at_send:&str,at_recv:&str,time_s:u64)->Result<String,String>{
let marktime = SystemTime::now();
let mut errmsg = String::new();
loop{
if let Some(data) = self.query(at_send){
let cc:Vec<&str> = data.split(",").collect();
for idx in cc{
if let Some(_) = idx.find(at_recv){
return Ok(data);
}
}
errmsg = data;
}
if let Ok(tt) = marktime.elapsed(){
if tt>Duration::from_secs(time_s){
return Err(errmsg);
}
};
sleep(Duration::from_secs(1));
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn it_works() {
let mut aat = Atpack::new();
if aat.open("COM63", 115200){
if let Ok(dd) = aat.send_and_recv_confirm_single_key("AT\r\n", "OK"){
println!("{}",dd);
};
if let Ok(dd) = aat.send_and_recv_confirm_single_key_split_while("AT\r\n", "OK", 30){
println!("{}",dd);
}
}
}
}