【问题标题】:How to work with a serial port in Rust?如何在 Rust 中使用串行端口?
【发布时间】:2014-08-31 05:46:57
【问题描述】:

我需要在我的程序中通过串口执行一个简单的交换。我找不到任何与串行端口相关的工作示例或文档。我需要打开一个串口,配置一个端口(设置速度、奇偶校验、停止位等),写入/读取二进制数据,然后关闭。

我尝试使用https://github.com/japaric/serial.rs,但是这个库已经过时了(它甚至不能在 Rust 1.0 上编译)。即使这样,这个库也只是提供了如何配置串口的功能,而不是使用它。

【问题讨论】:

  • 您将不得不直接通过 FFI 使用 C 函数,或者使用其他人编写的库,因为这不在标准库中。该库的问题仅在于它不再编译吗?如果是这样,您可能会更新它以使用您的 Rust 版本进行编译。 (注意,该库的 a public field 包含一个(a 的选项)FileDesc,可用于通过该页面上提到的特征进行读/写。)

标签: rust serial-port


【解决方案1】:

根据构建代码的操作系统,有 2 种解决方案。 对于 *nix OS serial.rs 库,对于 rust 0.11.0 构建应该可以正常工作,但对于支持 rust-0.12.0,问题已打开但尚未关闭。

对于 Windows 的东西 (mingw-w64),serial.rs 不是一个简单的解决方案,因为这个库是基于不易为 mingw 设置的 termios 调用。它来自于 mingw 是针对 msvcrt 而不是针对 glibc 构建的(有关更多信息,请参阅here)。 在 Windows 上,一个简单的解决方案是使用 rust FFI 为 teuniz 编写 rs232 之类的库的包装器。

  1. 使用 mingw gcc 构建库 rs232;

  2. 在 rust 中创建一个包装器;

Windows 的简短示例如下所示:

extern crate libc;
use libc::{c_int,c_uchar,c_uint};
use std::os;
//
#[link(name = "rs232")]
extern {    
    fn RS232_OpenComport(comport_number:c_int, baudrate:c_int) ->c_int; 
    fn RS232_SendByte(comport_number:c_int, byte:c_uchar)->c_int;
    fn RS232_CloseComport(comport_number:c_int);
}
static  COM10:c_int=9;    
fn main() {
    let y=unsafe{RS232_OpenComport(COM10, 115200)};    
    unsafe{
        RS232_SendByte(COM10,101);  
        RS232_SendByte(COM10,100);
    }    
    let cl=unsafe{RS232_CloseComport(COM10)};
}

【讨论】:

    【解决方案2】:

    在 UNIX 上,串行端口由字符设备表示,可以通过用于文件 I/O 的普通系统调用来访问该设备。关于串行端口,您唯一需要关心的是ioctl,您将使用它来设置波特率和其他参数。

    【讨论】:

      【解决方案3】:

      serial 包工作正常。

      【讨论】:

        【解决方案4】:

        如果您需要列出串行设备的能力(不仅仅是连接到它们),那么您需要serialport,它基于serial

        如果你想使用串行,你应该知道它被分成小箱子,你应该使用一个或另一个,这取决于你是开发一个库还是一个可执行文件。更多信息请查看the readme and documentation

        这两个 crate 都是多平台的,并且有最近的更新,因此需要决定哪个 API 更适合您。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多