解析从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 *'),虽然,但它的工作原理。如果这是更好的方法,我会很高兴与另一个答案。

问候!

您可能只需要使用unpack,其格式为g,或可能的e,具体取决于字节顺序。

@i2c.read(sharp, 4).unpack('g')[0] 

你指的是正在十六进制数字的字符串,并首先转换为整数之前将其转换为二进制字符串(这是[hex_string.to_i(16)].pack('L')部分)的例子(L指令是32个的整数)。您拥有的数据已经是二进制字符串,因此您只需将其直接转换为unpack的适当指令即可。

阅读关于unpackpack的文档。