从 ruby 读取 USB 输入流。
Reading USB input stream from ruby.
只是一些背景知识,我正在 Linux Mint(32 位)中处理原始数据流。它来自我的库 ruby-buzz,它从数据流文件中读取 24 位块。
我刚刚用 Linux Mint,32 位重新安装了我的笔记本电脑,突然我看到错误 Errno::EINVAL: Invalid argument @ io_fread
。
ajfaraday@squishy ~ $ sudo chmod 777 /dev/input/by-id/*
ajfaraday@squishy ~ $ irb
2.2.1 :001 > path = '/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00'
=> "/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00"
2.2.1 :002 > f = File.open(path)
=> #<File:/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00>
2.2.1 :003 > f.read(24)
Errno::EINVAL: Invalid argument @ io_fread - /dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00
from (irb):3:in `read'
from (irb):3
from /home/ajfaraday/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
2.2.1 :004 > f.read(32)
=> "\xAB>xW\x0E\xDC\x00\x00\x01\x00\xC0\x02\x01\x00\x00\x00\xAB>xW\x0E\xDC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
在同一系统上,使用相同的输入设备,我在
中看到了问题
我不知道为什么我以前可以使用 tail -f
从终端观看原始数据流,以及为什么我以前能够使用 file.read(24)
从 ruby 中获取 24 位块。包括安装 Mint。但是现在我两个都做不到。
我并不完全理解我找到的解决方案,但它可能会对遇到同样问题的任何人有所帮助,所以这里是。
这似乎是 Linux Mint 的 32 位架构的结果,它不允许 file.read
方法使用不是 2 的幂的参数(例如 8 , 16, 32).我不知道这是为什么。
但是,使用 64 位版本的 Mint 重新安装后,效果与我之前在 KDE 安装中看到的一样(回想起来,它可能是 64 位架构)。
只是一些背景知识,我正在 Linux Mint(32 位)中处理原始数据流。它来自我的库 ruby-buzz,它从数据流文件中读取 24 位块。
我刚刚用 Linux Mint,32 位重新安装了我的笔记本电脑,突然我看到错误 Errno::EINVAL: Invalid argument @ io_fread
。
ajfaraday@squishy ~ $ sudo chmod 777 /dev/input/by-id/*
ajfaraday@squishy ~ $ irb
2.2.1 :001 > path = '/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00'
=> "/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00"
2.2.1 :002 > f = File.open(path)
=> #<File:/dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00>
2.2.1 :003 > f.read(24)
Errno::EINVAL: Invalid argument @ io_fread - /dev/input/by-id/usb-Logitech_Logitech_Buzz_tm__Controller_V1-event-if00
from (irb):3:in `read'
from (irb):3
from /home/ajfaraday/.rvm/rubies/ruby-2.2.1/bin/irb:11:in `<main>'
2.2.1 :004 > f.read(32)
=> "\xAB>xW\x0E\xDC\x00\x00\x01\x00\xC0\x02\x01\x00\x00\x00\xAB>xW\x0E\xDC\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
在同一系统上,使用相同的输入设备,我在
我不知道为什么我以前可以使用 tail -f
从终端观看原始数据流,以及为什么我以前能够使用 file.read(24)
从 ruby 中获取 24 位块。包括安装 Mint。但是现在我两个都做不到。
我并不完全理解我找到的解决方案,但它可能会对遇到同样问题的任何人有所帮助,所以这里是。
这似乎是 Linux Mint 的 32 位架构的结果,它不允许 file.read
方法使用不是 2 的幂的参数(例如 8 , 16, 32).我不知道这是为什么。
但是,使用 64 位版本的 Mint 重新安装后,效果与我之前在 KDE 安装中看到的一样(回想起来,它可能是 64 位架构)。