@@ -11,7 +11,6 @@ struct PortState {
1111 serial_writer : Arc < Mutex < Option < Box < dyn serialport:: SerialPort > > > > ,
1212}
1313
14- // 💡 新增:包含设备名称的端口信息结构体
1514#[ derive( serde:: Serialize ) ]
1615struct 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]
4267fn 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]
88138fn 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-
123171fn 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