解析从i2c与红宝石覆盆子pi浮法float
问题描述:
这主要是一个红宝石问题。解析从i2c与红宝石覆盆子pi浮法float
我被困在试图从一个i2c设备解析一些字节到一个浮点值的红宝石。
长的故事:
我试图读取与树莓派和AtTiny85(设备)的I2C设备的浮点值。我能够通过i2ctools
实例来读取控制台它的值:
i2cset -y 0 0x25 0x00; sleep 1; i2cget -y 0 0x25 0x00; i2cget -y 0 0x25 0x00; i2cget -y 0 0x25 0x00; i2cget -y 0 0x25 0x00
给我:
0x3e
0x00
0x80
0x92
这意味着0.12549046,这是伏的值,我能够检查我的万用表,并确定。 (字节的顺序是0x3e008092)
现在我需要从一个红宝石脚本得到这个浮点值,我使用i2c gem。
上this site注释建议以下转换方法:
hex_string = '42880000'
float = [hex_string.to_i(16)].pack('L').unpack('F')[0]
# => 68.0
float = 66.2
hex_string = [float].pack('F').unpack('L')[0].to_s(16)
# => 42846666
但我一直没能得到十六进制值这个字符串。该代码部分:
require "i2c/i2c"
require "i2c/backends/i2c-dev"
@i2c = ::I2C.create("/dev/i2c-0")
sharp = 0x25
@i2c.write(sharp, 0)
sleep 1
puts @i2c.read(sharp, 4).inspect
穿屏幕
">\x00\x00P"
当字符“>”和“P”是在该位置的字节的ASCII值,但然后我不能知道在哪里/如何分割字符串并清理它,至少可以尝试上面显示的方法。
我可以编写一个C程序来读取值并将其printf到控制台或其他东西,并从ruby运行它,但我认为这将是一个可怕的解决方案。
有关如何做到这一点的一些想法会非常有帮助!
问候。
答
我来了一句:
bytes = []
for i in (0..3) do
bytes << @i2c.read_byte(sharp).unpack('*C*')[0].to_s(16)
bytes[i] = "00" unless bytes[i] != "0"
end
bytes = bytes.join.to_s
float = [bytes.to_i(16)].pack('L').unpack('F')[0]
puts float.to_s
不舒尔约解压( '* C *'),虽然,但它的工作原理。如果这是更好的方法,我会很高兴与另一个答案。
问候!