用ruby on raspberry pi解析i2c中的浮点
这主要是一个红宝石问题 我一直在尝试将i2c设备中的一些字节解析为ruby上的浮点值 长话短说: 我试图从一个带有raspberry pi和AtTiny85(设备)的i2c设备读取浮点值。我能够通过i2ctools从控制台读取它的值 例如:用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
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位整数)。您拥有的数据已经是一个二进制字符串,因此您只需使用解包
的相应指令直接转换它
阅读和的文档