gpt4 book ai didi

ruby - ruby 中的数据包创建

转载 作者:数据小太阳 更新时间:2023-10-29 07:48:46 25 4
gpt4 key购买 nike

我正在尝试创建一个数据包以使用 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

谁能帮我解决如何将数字正确转换为串行端口的正确十六进制表示法并连接到其他十六进制字符串的问题?提前致谢!

最佳答案

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

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

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

您甚至可能想构建自己的方法来读取和写入:

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

关于ruby - ruby 中的数据包创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7044680/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com