用ruby on raspberry pi解析i2c中的浮点

用ruby on raspberry pi解析i2c中的浮点,ruby,raspberry-pi,i2c,Ruby,Raspberry Pi,I2c,这主要是一个红宝石问题 我一直在尝试将i2c设备中的一些字节解析为ruby上的浮点值 长话短说: 我试图从一个带有raspberry pi和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 给我: 0

这主要是一个红宝石问题

我一直在尝试将i2c设备中的一些字节解析为ruby上的浮点值

长话短说:

我试图从一个带有raspberry pi和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)

现在我需要从ruby脚本中获取这个浮点值,我正在使用

对以下转换方法的评论:

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程序来读取值并将其打印到控制台或其他地方,然后从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
bytes=[]
因为我在(0..3)中做

字节您可能只需要使用
g
格式,或者可能使用
e
格式,具体取决于尾数

@i2c.read(sharp, 4).unpack('g')[0]
您所指的示例是,在转换为整数之前,先将十六进制数字字符串转换为二进制字符串(即
[hex_string.to_i(16)].pack('L')
部分)(
L
指令用于32位整数)。您拥有的数据已经是一个二进制字符串,因此您只需使用
解包
的相应指令直接转换它

阅读和的文档