我正在尝试使用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
有人能帮我正确地将数字转换为串口所需的十六进制表示法,并与其他十六进制字符串连接吗?提前感谢!
chr
可能会与 UTF-8 或默认字符集发生冲突。确保您的文件句柄以BINARY
模式打开,否则您可能会发现字符被转换,数据流将被破坏。Ruby 1.8 生活在字符编码的“无知是福”的世界中。当使用chr
时,对于door
值 > 127,我会收到Encoding::CompatibilityError
错误。pack
是处理这个问题的唯一明智的方法。 - tadman