Skip to content

Commit fbd99b4

Browse files
committed
update
1 parent ee29c36 commit fbd99b4

2 files changed

Lines changed: 350 additions & 362 deletions

File tree

src-tauri/src/main.rs

Lines changed: 55 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,6 @@ struct PortState {
1111
serial_writer: Arc<Mutex<Option<Box<dyn serialport::SerialPort>>>>,
1212
}
1313

14-
// 💡 新增:包含设备名称的端口信息结构体
1514
#[derive(serde::Serialize)]
1615
struct PortInfo {
1716
name: String,
@@ -25,7 +24,6 @@ fn get_available_ports() -> Vec<PortInfo> {
2524
.into_iter()
2625
.map(|p| {
2726
let mut desc = p.port_name.clone();
28-
// 💡 尝试提取 USB 设备的产品名称或制造商(如 CH340, ST-Link)
2927
if let serialport::SerialPortType::UsbPort(usb_info) = p.port_type {
3028
if let Some(product) = usb_info.product {
3129
desc = format!("{} ({})", p.port_name, product);
@@ -38,22 +36,61 @@ fn get_available_ports() -> Vec<PortInfo> {
3836
.collect()
3937
}
4038

39+
// 辅助函数:转换数据位
40+
fn map_data_bits(bits: u8) -> serialport::DataBits {
41+
match bits {
42+
5 => serialport::DataBits::Five,
43+
6 => serialport::DataBits::Six,
44+
7 => serialport::DataBits::Seven,
45+
_ => serialport::DataBits::Eight,
46+
}
47+
}
48+
49+
// 辅助函数:转换校验位
50+
fn map_parity(parity: &str) -> serialport::Parity {
51+
match parity {
52+
"Odd" => serialport::Parity::Odd,
53+
"Even" => serialport::Parity::Even,
54+
_ => serialport::Parity::None,
55+
}
56+
}
57+
58+
// 辅助函数:转换停止位
59+
fn map_stop_bits(bits: u8) -> serialport::StopBits {
60+
match bits {
61+
2 => serialport::StopBits::Two,
62+
_ => serialport::StopBits::One,
63+
}
64+
}
65+
4166
#[tauri::command]
4267
fn connect_port(
4368
app_handle: tauri::AppHandle,
4469
state: State<'_, PortState>,
4570
port_name: String,
4671
baud_rate: u32,
72+
data_bits: u8,
73+
parity: String,
74+
stop_bits: u8,
75+
dtr: bool,
76+
rts: bool,
4777
) -> Result<(), String> {
4878
state.should_read.store(false, Ordering::Relaxed);
4979
thread::sleep(Duration::from_millis(50));
5080

5181
let port = serialport::new(&port_name, baud_rate)
82+
.data_bits(map_data_bits(data_bits))
83+
.parity(map_parity(&parity))
84+
.stop_bits(map_stop_bits(stop_bits))
5285
.timeout(Duration::from_millis(50))
5386
.open();
5487

5588
match port {
5689
Ok(mut serial) => {
90+
// 初始化 DTR 和 RTS 状态 (部分设备可能不支持,忽略错误)
91+
let _ = serial.write_data_terminal_ready(dtr);
92+
let _ = serial.write_request_to_send(rts);
93+
5794
let writer = serial.try_clone().map_err(|e| format!("克隆串口句柄失败: {}", e))?;
5895
let mut state_writer = state.serial_writer.lock().unwrap();
5996
*state_writer = Some(writer);
@@ -84,6 +121,19 @@ fn connect_port(
84121
}
85122
}
86123

124+
// 💡 新增:动态修改 DTR 和 RTS
125+
#[tauri::command]
126+
fn set_dtr_rts(state: State<'_, PortState>, dtr: bool, rts: bool) -> Result<(), String> {
127+
let mut writer_guard = state.serial_writer.lock().unwrap();
128+
if let Some(writer) = writer_guard.as_mut() {
129+
let _ = writer.write_data_terminal_ready(dtr);
130+
let _ = writer.write_request_to_send(rts);
131+
Ok(())
132+
} else {
133+
Err("串口未连接".to_string())
134+
}
135+
}
136+
87137
#[tauri::command]
88138
fn disconnect_port(state: State<'_, PortState>) {
89139
state.should_read.store(false, Ordering::Relaxed);
@@ -118,18 +168,16 @@ fn send_data(state: State<'_, PortState>, data: String, is_hex: bool) -> Result<
118168
}
119169
}
120170

121-
// ... 前面的代码保持不变 ...
122-
123171
fn main() {
124172
tauri::Builder::default()
125-
.plugin(tauri_plugin_dialog::init()) // 💡 新增:对话框插件
126-
.plugin(tauri_plugin_fs::init()) // 💡 新增:文件系统插件
173+
.plugin(tauri_plugin_dialog::init())
174+
.plugin(tauri_plugin_fs::init())
127175
.manage(PortState {
128176
should_read: Arc::new(AtomicBool::new(false)),
129177
serial_writer: Arc::new(Mutex::new(None)),
130178
})
131179
.invoke_handler(tauri::generate_handler![
132-
get_available_ports, connect_port, disconnect_port, send_data
180+
get_available_ports, connect_port, disconnect_port, send_data, set_dtr_rts // 💡 注册新命令
133181
])
134182
.run(tauri::generate_context!())
135183
.expect("error while running tauri application");

0 commit comments

Comments
 (0)