硬件流控制位不适用于 ruby-serialport gem

Hardware flow control bits not working for ruby-serialport gem

我正在尝试将 USB 串口适配器的控制位用作通用 I/O。这个简单的示例应该先将 DTR 线切换为高电平,然后再切换为低电平。

require 'serialport'

DataBits = 8
StopBits = 1
Parity = SerialPort::NONE
Baud = 38400

port = '/dev/tty.usbserial-A100KXWU'

serial = SerialPort.new(port, 'baud' => Baud, 'data_bits' => DataBits, 'stop_bits' => StopBits, 'parity' => Parity)
serial.flow_control = SerialPort::HARD

loop do
    p serial.signals
    sleep(1)
    serial.dtr = (serial.dtr + 1) % 2
end

并且输出:

{"rts"=>1, "dtr"=>1, "cts"=>1, "dsr"=>0, "dcd"=>0, "ri"=>0}
{"rts"=>1, "dtr"=>0, "cts"=>1, "dsr"=>0, "dcd"=>0, "ri"=>0}
{"rts"=>1, "dtr"=>1, "cts"=>1, "dsr"=>0, "dcd"=>0, "ri"=>0}
{"rts"=>1, "dtr"=>0, "cts"=>1, "dsr"=>0, "dcd"=>0, "ri"=>0}

就Ruby而言,serial.dtr在变化,但DTR脚的输出电压没有变化。它是恒定的 +7V。

此外,serial 实例无法读取 应用于来自其他硬件设备的 CTS、DSR 或 DCD 的任何更改。

运行 拥有 sudo 权限,因此这不是权限问题。这是 OS X 10.10 Yosemite.

根据http://www.rubydoc.info/gems/serialport/SerialPort:flow_control=

Note: SerialPort::HARD uses RTS/CTS handshaking. DSR/DTR is not supported.

我在回答我自己的问题。事实证明,Apple 提供的 FTDI 驱动程序有问题。他们不提供对控制信号的任何访问权限。

我安装了 the official FTDI VCP drivers(撰写本文时为 2.3 版),重新启动,现在我可以完全控制了。