如何在 Rust 中使用串行端口?

fmv*_*vin 4 serial-port rust

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

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

err*_*per 6

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


fmv*_*vin 5

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

对于 Windows 的东西 (mingw-w64),serial.rs 不是一个简单的解决方案,因为这个库基于 termios 调用,而这些调用不容易为 mingw 设置。原因在于 mingw 是针对 msvcrt 而不是针对 glibc 构建的(有关更多信息,请参见此处)。在 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)};
}
Run Code Online (Sandbox Code Playgroud)