2014-12-07 80 views
0

這主要是一個紅寶石問題。解析從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運行它,但我認爲這將是一個可怕的解決方案。

有關如何做到這一點的一些想法會非常有幫助!

問候。

回答

0

我來了一句:

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 *'),雖然,但它的工作原理。如果這是更好的方法,我會很高興與另一個答案。

問候!

0

您可能只需要使用unpack,其格式爲g,或可能的e,具體取決於字節順序。

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

你指的是正在十六進制數字的字符串,並首先轉換爲整數之前將其轉換爲二進制字符串(這是[hex_string.to_i(16)].pack('L')部分)的例子(L指令是32個的整數)。您擁有的數據已經是二進制字符串,因此您只需將其直接轉換爲unpack的適當指令即可。

閱讀關於unpackpack的文檔。