我试图通过TTL-> RS-232转换器与串行设备通信。该转换器需要在DTR和RTS线路上发送电源。
// imports
extern crate serial; //see: https://dcuddeback.github.io/serial-rs/serial/index.html
use std::env;
use std::io;
use std::time::Duration;
use std::process::exit;
use std::io::prelude::*;
use serial::prelude::*;
use serial::{BaudRate, CharSize, Parity, StopBits, FlowControl, SystemPort, PortSettings, Error};
use std::mem;
#[inline]
fn display_error_message(err: &Error, msg: &str) -> ! {
println!("{}", msg);
println!("Error Code: {:?}", err.raw_os_error());
println!("Error: {:?}", err);
exit(0);
}
fn main() {
// open port
let mut port = match serial::open("COM3") {
Err(ref e) => display_error_message(e, "Error opening serial port"),
Ok(x) => x,
};
// push settings to stack
let settings = PortSettings {
baud_rate: BaudRate::Baud115200,
char_size: CharSize::Bits8,
parity: Parity::ParityNone,
stop_bits: StopBits::Stop1,
flow_control: FlowControl::FlowNone,
};
// configure port
match port.configure(&settings) {
Ok(_) => {}
Err(ref e) => display_error_message(e, "Error configuring serial port."),
};
// set rts
match port.set_rts(true) {
Ok(_) => {}
Err(ref e) => display_error_message(e, "Error setting RTS line"),
};
// set DTR
match port.set_dtr(true) {
Ok(_) => {}
Err(ref e) => display_error_message(e, "Error setting DTR line"),
};
// allocate readbuffer on stack
let mut rb: [u8; 1] = [0u8; 1];
// allocate buffer to hold output
let mut out: String = String::with_capacity(1024);
// loop while reading
loop {
match port.read(&mut rb) {
Ok(_) => {}
Err(ref e) => {
println!("Error reading serial port.");
println!("Error: {:?}", e);
exit(0);
}
};
match rb[0] {
// Linefeed
10 => {
println!("{}<LF>", &out);
out = String::with_capacity(1024);
}
// carriage return
13 => {
println!("{}<CR>", &out);
out = String::with_capacity(1024);
}
// normal chars
32...126 => {
let temp: u32 = rb[0].clone() as u32;
let ch: char = unsafe { mem::transmute(temp) };
out.push(ch);
}
// everything else
x => {
println!("Non standard character encountered");
println!("Value: {:?}", x);
exit(0);
}
};
}
}
源代码也位于Rust Playground和Github。
我正在使用serial-rs库和Rust 1.8(GNU ABI Windows 7 x64 Professional)。
我的错误发生在第46行:
match port.set_dtr( true ) {
Ok(_) => { },
Err(ref e) => display_error_message(e,"Error setting DTR line")
};
这将返回错误代码87(在Windows 7上)。标准serial-rs不会保存错误代码,因此我使用my own fork(等待PR)。
此错误来自格式错误的系统调用。潜入serial-rs之后,set_dtr(bool)
只会打电话给EscapeCommFunction(2) first call,second call,third call。参数代码显示为correct。
使用MSVC工具链进行编译会导致相同的错误,在RTS调用导致相同错误之前放置DTR调用。
同时提升DTR和RTS在py-serial中工作,但是这样做时我无法写入端口。 See other issue
答案 0 :(得分:1)
USB-gt; RS232转换器的串行端口仿真驱动程序不支持DTR线产生的错误。