在ruby中创建数据包

时间:2011-08-12 18:29:55

标签: ruby hex serial-port

我正在尝试创建一个使用ruby-serialport通过串口发送的数据包。这似乎应该很简单,当我写一个字符串时它就可以工作:

packet = "\xFF\x03\x10\x01\x01\xFE"
sp.write(packet)
=>hardware does what it's supposed to, opens the door represented by the 4th hex value

但我显然需要以编程方式进行,我无法找到正确的方法。以下是我尝试过的一些事情:

door = 1    
packet = "\xFF\x03\x10" + door.to_s(16) + "\x01\xFE"
sp.write(packet)
=> can't convert fixnum into string

door = 1
packet = "\xFF\x03\x10" + door.to_a.pack('H*') + "\x01\xFE"
sp.write(packet)
=> to_a will be obsolete
can't convert fixnum into string

door = 1
sp.write("\xFF\x03\x10")
sp.write(door)
sp.write("\x01\xFE")
=>no response from hardware

任何人都可以帮我解决如何正确地将数字转换为串行端口的正确十六进制表示法并加入其他十六进制字符串?提前谢谢!

2 个答案:

答案 0 :(得分:4)

如果您坚持使用字符串来表示其他二进制数据,那么您真的会遇到麻烦。你真正需要的是pack

packet = [ 0xFF, 0x30, 0x10, door, 0x01, 0xFE ].pack('C*')

这使得构造和解构任意二进制数据变得非常容易。该方法不仅支持无符号字符,还支持常用的各种其他类型。

你甚至可能想构建自己的方法来读写这个:

def write_packet(*bytes)
  sp.write(bytes.flatten.pack('C*'))
end

答案 1 :(得分:3)

试试这个:

door = 1    
packet = "\xFF\x03\x10" + door.chr + "\x01\xFE"