ruby serialport gem,谁负责检查奇偶校验错误?

kuk*_*krt 6 ruby serial-port ruby-1.9

宝石

serialport(1.0.4)
作者:Guillaume Pierronnet,Alan Stern,Daniel E. Shipton,Tobin
Richard,Hector Parra,Ryan C. Payne
主页:http://github.com/hparra/ruby-serialport/
使用RS-的图书馆232个串口.

我正在使用这个宝石,我的设备的规格如下.

  • 9600
  • 7位
  • 1站点
  • 甚至平价

当我收到如下数据时,解压缩的数据仍然带有奇偶校验位.

sp = SerialPort.new("/dev/serial-device", 9600, 7, 1, SerialPort::EVEN)
data = sp.gets
data.chars.each do |char|
  puts char.unpack("B*")
end
Run Code Online (Sandbox Code Playgroud)

恩.如果sp收到a,则解压缩的数据11100001代替01100001,因为它是偶然的奇偶校验.


要将字节转换回它应该是什么,我喜欢这样

data = sp.gets #gets 11100001 for 'a' (even parity)
data.bytes.to_a.each do |byte|
  puts (byte & 127).chr
end
Run Code Online (Sandbox Code Playgroud)

现在,对我而言,这是一种低级别的方式.我期待serialport gem进行这种奇偶校验,但据我读到它的文档,它没有说明奇偶校验.

我错过了一个已在gem中实现的方法,或者我上面的工作是不必要的,因为我的责任是检查奇偶校验并发现错误?

小智 3

SerialPort::ODD、SerialPort::MARK、SerialPort::SPACE(Posix 不支持 MARK 和 SPACE)

如果参数错误,则引发 argError。

不带块的 SerialPort::new 和 SerialPort::open 返回 SerialPort 的实例。带块的 SerialPort::open 将 SerialPort 传递给块,并在块退出时关闭它(如 File::open)。

** 实例方法 **

  • modem_params() -> aHash
  • modem_params=(aHash) -> aHash
  • get_modem_params() -> aHash
  • set_modem_params(aHash) -> aHash
  • set_modem_params(波特率[,数据位[,停止位[,奇偶校验]]])

获取和设置调制解调器参数。哈希键是“baud”、“data_bits”、“stop_bits”和“parity”(见上文)。

散列中不存在或设置为 nil 的参数保持不变。set_modem_params 方法的默认参数值为:databits = 8、stopbits = 1、parity = (databits == 8 ? SerialPort::NONE : SerialPort::EVEN)。

  • Baud() -> 一个整数
  • 波特=(一个整数) -> 一个整数
  • data_bits() -> 4、5、6、7 或 8
  • data_bits=(anInteger) -> anInteger
  • stop_bits() -> 1 或 2
  • stop_bits=(anInteger) -> anInteger
  • parity() -> anInteger:SerialPort::NONE、SerialPort::EVEN、SerialPort::ODD、SerialPort::MARK 或 SerialPort::SPACE
  • 奇偶校验=(一个整数) -> 一个整数

获取并设置相应的调制解调器参数。

  • flow_control() -> 一个整数
  • flow_control=(anInteger) -> anInteger

获取和设置流控制:SerialPort::NONE、SerialPort::HARD、SerialPort::SOFT 或 (SerialPort::HARD | SerialPort::SOFT)。

注意:并非所有平台都支持 SerialPort::HARD 模式。SerialPort::HARD 使用 RTS/CTS 握手;不支持 DSR/DTR。

  • read_timeout() -> 一个整数
  • read_timeout=(anInteger) -> anInteger
  • write_timeout() -> 一个整数
  • write_timeout=(anInteger) -> anInteger

获取和设置读取和写入的超时值(以毫秒为单位)。负读取超时将返回所有可用数据而无需等待,零读取超时将在至少有一个字节可用之前返回,正读取超时在请求的字节数可用或两个字节到达之间的间隔时返回字节数超过超时值。

注意:读取超时不能与多线程很好地混合。

注意:在 Posix 下,未实现写入超时。

  • 中断(时间)->零

在给定时间内发送休息时间。

time -> anInteger:中断的十分之一秒。注意:在 Posix 下,该值非常近似。

  • 信号() -> aHash

返回包含每个线路状态位的状态的散列。键为“rts”、“dtr”、“cts”、“dsr”、“dcd”和“ri”。

注意:在 Windows 下,不包括 rts 和 dtr 值。

  • rts()
  • dtr()
  • cts()
  • dsr()
  • dcd()
  • ri() -> 0 或 1

  • rts=(0或1)

  • dtr=(0 或 1) -> 0 或 1

获取和设置相应的线路状态位。

注意:在Windows下,rts()和dtr()未实现