首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >提高DTR线路时出现Windows错误87 (串行)

提高DTR线路时出现Windows错误87 (串行)
EN

Stack Overflow用户
提问于 2016-05-19 02:32:22
回答 1查看 269关注 0票数 1

我正在尝试通过TTL->RS-232转换器与串行设备通信。此转换器要求在DTR和RTS线路上提供电源。

代码语言:javascript
复制
// 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 PlaygroundGithub上。

我使用的是serial-rs库和Rust 1.8 (GNU ABI Windows7 x64专业版)。

我的错误发生在第46行:

代码语言:javascript
复制
 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 callsecond callthird call的调用。参数代码显示为correct

使用MSVC工具链进行编译会导致相同的错误,将DTR调用放在RTS调用之前会导致相同的错误。

同时提升DTR和RTS在py-serial中工作,但我不能在这样做的同时写入端口。See other issue

EN

回答 1

Stack Overflow用户

发布于 2016-05-19 20:46:01

USB->RS232转换器的串行端口仿真驱动程序不支持DTR线路导致的错误。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/37307559

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档