diff --git a/README.md b/README.md index 59f7c07..463a8bb 100644 --- a/README.md +++ b/README.md @@ -2,87 +2,45 @@ This is a serial tool for Linux and windows. -## Motivation - -I am a embedded sorfware developer. Usart is a very common communication protocal which used for debug. -I was using `Moserial Terminal` and `cutecom`. But I found serveral problem when I was using these tools. -So I write this tool to help embedded software developer. This tool may not have all function you need, it only design for personal use. -It will contain all function I need. If you requst some function and I think it is useful I will add it to TODO list. +I am a embedded sorfware developer. USART is a very common communication protocal for communication and debug. I was using Moserial Terminal and Cutecom. But I found serveral problem in these tool. So I design this tool to help embedded software developer. This tool still work in progross. The function of this tool is limited for now. +The main thing in this tool is realiable. Tool will not crash, and get correct data from serial port. Display these data correctly and completance. ## Usage -1. Only 1 input window. All function are provide by input command. +This tool support following commands. `list`, `open`, `close`, `send`, `loop`, `loopend`, `clean`, `show`, `hide`, `set`. -Following command are support now. +1. `list`: List all avaliable port in log window +2. `open `: Open port. +3. `close`: Close port. +4. `send `: Send _data_ to port. +5. `loop `: Send _data_ periodic. The period show in the status bar. +6. `loopend`: Stop send _data_ periodic. +7. `clear`: Clear log and receive data windows. +8. `show `: Show log or hex window. The parameter, _window_, should be `log` or `hex`. +9. `hide `" Inverse operation of `show` -### set commnad +10. `set `: Change port parameter. -Command `set` used for setup port configuration +### Set command -``` -set baudrate 115200 -set databit 8 -set parity 0 // None -set stopbit 1 -``` - -### open command - -Command `open` used for open serialport - -For Linux system, the port looks like `/dev/ttyUSB0`. We don't need type `/dev/tty` - -Example for Linux System - -``` -open USB0 -``` - -Example for Windows System - -``` -open COM0 -``` - -### close command - -command `close` used for close an opened serial port. - -### list command - -Command `list` used for list all avaliable port - -### send command - -Command `send` used for send message to port -``` -send hello world // "hello world" will send to port -``` - -### clean command - -Command `clean` used for clean ReceiveView and LogView - -``` -clean log -clean rec -``` +Supportted settings: `baudrate`, `databit`, `parity`, `stopbit`, `flowcontrol`, `period`. +1. `baudrate`: Change baudrate. Support any value. +2. `databit`: Change databit. Support value: 5, 6, 7, 8. +3. `parity`: Change parity. Support value: 0: None, 1: Odd, 2: Even. +4. `stopbit`" Change stopit. Support value: 1, 2. +5. `flowcontrol`: Change flowcontrol. Support value: hard, soft, none. +6. `period`: Change loop send periodic. This will work after port is open. Minimum value: 10ms for Linux, 15 ms for Windows. Because operation system can not run programming in real time, this value is not accurate. -## feature list - -port function +## Feature list - [x] open port - [x] close port - [x] send ascii to port +- [x] view recived data as hex +- [x] change port settings +- [x] send data periodic +- [ ] record output to file - [ ] send hex to port -- [ ] save output to port -- [ ] view recived data as hex - - -ui function - -- [ ] show recived data as hex -- [ ] clean command \ No newline at end of file +- [ ] send hex periodic \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index a306c8d..20298b8 100644 --- a/src/main.rs +++ b/src/main.rs @@ -15,9 +15,8 @@ use crate::port::*; use gtk::prelude::TextViewExt; use gtk::prelude::LabelExt; -use std::str; +use std::{str, env}; use std::time::Duration; -use std::num::ParseIntError; fn main() { let application = gtk::Application::new( @@ -126,8 +125,8 @@ fn build_ui(application: >k::Application) { let tmp = ui_hex_scroll.vadjustment(); tmp.set_value(tmp.upper()); } - Message::UiCleanReceiveMsg => ui_receive_view.buffer().unwrap().set_text(""), - Message::UiCleanLog => ui_log_view.buffer().unwrap().set_text(""), + Message::UiClearReceiveMsg => ui_receive_view.buffer().unwrap().set_text(""), + Message::UiClearLog => ui_log_view.buffer().unwrap().set_text(""), Message::UiShowLog => ui_log_window.show(), Message::UiHideLog => ui_log_window.hide(), Message::UiShowHex => ui_hex_window.show(), @@ -204,9 +203,9 @@ fn process_cmd(command: String, to_ui: glib::Sender, gui2main_tx: Sende "loopend" => { gui2main_tx.send(Message::MainCmdStopPeriod).unwrap(); } - "clean" => { - to_ui.send(Message::UiCleanReceiveMsg).unwrap(); - to_ui.send(Message::UiCleanLog).unwrap(); + "clear" => { + to_ui.send(Message::UiClearReceiveMsg).unwrap(); + to_ui.send(Message::UiClearLog).unwrap(); } "show" => { if command_split.len() == 1 { @@ -251,7 +250,7 @@ fn main_proc(to_main_tx: Sender, rx: Receiver, ui_upd: glib::S loop { if let Ok(msg) = rx.try_recv() { match msg { - Message::UiCleanReceiveMsg => {} + Message::UiClearReceiveMsg => {} Message::MainCmdOpen(arg) => { if port_status_open { ui_upd.send(Message::UiUpdateLog("Port Already Open\n".to_string())).unwrap(); @@ -260,9 +259,22 @@ fn main_proc(to_main_tx: Sender, rx: Receiver, ui_upd: glib::S let (tmp_to_port, main2port_rx) = channel::(); main2port_tx = tmp_to_port; - let port_name = if arg.is_empty() { default_com_port.clone() } else { arg }; + let port_name = if arg.is_empty() { default_com_port.clone() } else { + let mut tmp = arg.clone(); + if env::consts::OS == "linux" { + let prelude = "/dev/tty"; + if !arg.contains("/dev/tty"){ + tmp = prelude.to_owned() + &arg; + } + } + tmp + }; default_com_port = port_name.clone(); ui_upd.send(Message::UiUpdateStatusBarCom(default_com_port.clone())).unwrap(); + + + + match port_open(port_name, port_default_config) { Ok(port) => { port_status_open = true; diff --git a/src/port.rs b/src/port.rs index 2b0fec8..10b0d29 100644 --- a/src/port.rs +++ b/src/port.rs @@ -1,5 +1,4 @@ use std::sync::mpsc::{Sender, Receiver}; -use std::env; use serialport::{SerialPort, DataBits, Parity, FlowControl, StopBits}; use std::time::Duration; @@ -7,8 +6,8 @@ use std::time::Duration; pub enum Message { UiUpdateLog(String), UiUpdateReceiveMsg(Vec), - UiCleanReceiveMsg, - UiCleanLog, + UiClearReceiveMsg, + UiClearLog, UiShowLog, UiHideLog, UiShowHex, @@ -55,9 +54,8 @@ pub struct PortConfig { } pub fn port_open(port: String, config: PortConfig) -> Result, Error> { - let mut prelude = ""; - if env::consts::OS == "linux" { prelude = "/dev/tty"; } else if env::consts::OS == "windows" { prelude = "" } - let port_builder = serialport::new(prelude.to_owned() + &port, config.baud_rate) + + let port_builder = serialport::new(port, config.baud_rate) .data_bits(config.data_bits) .parity(config.parity) .flow_control(config.flow_control) @@ -78,7 +76,7 @@ pub fn port_proc(mut port: Box, to_main: Sender, from_m let mut period_timeout = std::time::Duration::from_millis(100); let mut period_send_msg = String::new(); let mut last_send = std::time::Instant::now(); - to_main.send(Message::PortPeriodDuration(100)); + to_main.send(Message::PortPeriodDuration(100)).unwrap(); loop { if let Ok(msg) = from_main.try_recv() { match msg { @@ -98,7 +96,7 @@ pub fn port_proc(mut port: Box, to_main: Sender, from_m period_send = true; period_send_msg = msg; } - Message::PortPeriodStop=> { + Message::PortPeriodStop => { period_send = false; } Message::PortPeriodDuration(value) => { @@ -116,7 +114,7 @@ pub fn port_proc(mut port: Box, to_main: Sender, from_m } } } - if period_send && (last_send.elapsed() > period_timeout){ + if period_send && (last_send.elapsed() > period_timeout) { last_send = std::time::Instant::now(); match port.write(period_send_msg.as_bytes()) { Err(e) => to_main.send(Message::PortError(format!("{}", e).to_string())).unwrap(),