diff options
| author | Rasmus Melchior Jacobsen <[email protected]> | 2023-04-26 10:51:23 +0200 |
|---|---|---|
| committer | Dario Nieuwenhuis <[email protected]> | 2023-05-01 22:42:36 +0200 |
| commit | 49455792cb5406f3e2df0f3850c0d650965e6b2b (patch) | |
| tree | 6811a5ef17a7fa7809467e5aa6dc5552cabfe5c6 /tests/utils/src | |
| parent | 855c0d1423cb1aacd4f4f45e255b02b442afde34 (diff) | |
Ring-buffered uart rx with one-period overrun detection
Diffstat (limited to 'tests/utils/src')
| -rw-r--r-- | tests/utils/src/bin/saturate_serial.rs | 52 |
1 files changed, 52 insertions, 0 deletions
diff --git a/tests/utils/src/bin/saturate_serial.rs b/tests/utils/src/bin/saturate_serial.rs new file mode 100644 index 000000000..28480516d --- /dev/null +++ b/tests/utils/src/bin/saturate_serial.rs | |||
| @@ -0,0 +1,52 @@ | |||
| 1 | use std::path::Path; | ||
| 2 | use std::time::Duration; | ||
| 3 | use std::{env, io, thread}; | ||
| 4 | |||
| 5 | use rand::random; | ||
| 6 | use serial::SerialPort; | ||
| 7 | |||
| 8 | pub fn main() { | ||
| 9 | if let Some(port_name) = env::args().nth(1) { | ||
| 10 | let sleep = env::args().position(|x| x == "--sleep").is_some(); | ||
| 11 | |||
| 12 | println!("Saturating port {:?} with 115200 8N1", port_name); | ||
| 13 | println!("Sleep: {}", sleep); | ||
| 14 | let mut port = serial::open(&port_name).unwrap(); | ||
| 15 | if saturate(&mut port, sleep).is_err() { | ||
| 16 | eprintln!("Unable to saturate port"); | ||
| 17 | } | ||
| 18 | } else { | ||
| 19 | let path = env::args().next().unwrap(); | ||
| 20 | let basepath = Path::new(&path).with_extension(""); | ||
| 21 | let basename = basepath.file_name().unwrap(); | ||
| 22 | eprintln!("USAGE: {} <port-name>", basename.to_string_lossy()); | ||
| 23 | } | ||
| 24 | } | ||
| 25 | |||
| 26 | fn saturate<T: SerialPort>(port: &mut T, sleep: bool) -> io::Result<()> { | ||
| 27 | port.reconfigure(&|settings| { | ||
| 28 | settings.set_baud_rate(serial::Baud115200)?; | ||
| 29 | settings.set_char_size(serial::Bits8); | ||
| 30 | settings.set_parity(serial::ParityNone); | ||
| 31 | settings.set_stop_bits(serial::Stop1); | ||
| 32 | Ok(()) | ||
| 33 | })?; | ||
| 34 | |||
| 35 | let mut written = 0; | ||
| 36 | loop { | ||
| 37 | let len = random::<usize>() % 0x1000; | ||
| 38 | let buf: Vec<u8> = (written..written + len).map(|x| x as u8).collect(); | ||
| 39 | |||
| 40 | port.write_all(&buf)?; | ||
| 41 | |||
| 42 | if sleep { | ||
| 43 | let micros = (random::<usize>() % 1000) as u64; | ||
| 44 | println!("Sleeping {}us", micros); | ||
| 45 | port.flush().unwrap(); | ||
| 46 | thread::sleep(Duration::from_micros(micros)); | ||
| 47 | } | ||
| 48 | |||
| 49 | written += len; | ||
| 50 | println!("Written: {}", written); | ||
| 51 | } | ||
| 52 | } \ No newline at end of file | ||
