Jump to content

[Python] [Ruby] Distance IR simple_example.py funktioniert, simple_example.rb nicht


Recommended Posts

Hallo Leute,

 

ich versuche gerade das Distance IR Beispiel auf einer OS X 10.8/Ruby 1.9.3 Umgebung zum Laufen zu bringen. Leider stosse ich dabei immer nur auf den folgenden Fehler:

 

simple_example.rb

~/.rvm/gems/ruby-1.9.3-p194/gems/tinkerforge-2.0.1/lib/tinkerforge/ip_connection.rb:155:in `unpack': '<' allowed only after types sSiIlLqQ (ArgumentError)

from ~/.rvm/gems/ruby-1.9.3-p194/gems/tinkerforge-2.0.1/lib/tinkerforge/ip_connection.rb:155:in `get_length_from_data'

from ~/.rvm/gems/ruby-1.9.3-p194/gems/tinkerforge-2.0.1/lib/tinkerforge/ip_connection.rb:733:in `receive_loop'

from ~/.rvm/gems/ruby-1.9.3-p194/gems/tinkerforge-2.0.1/lib/tinkerforge/ip_connection.rb:676:in `block in connect_unlocked'

 

Process finished with exit code 1

 

Ich habe dann nochmal das Python-Beispiel probiert und siehe da es funzt. Ich habe die korrekte UID mehrfach überprüft und bin sicher, dass sie bei beiden Beispielen korrekt gesetzt ist.

 

Muss ich meine Ruby-Umgebung noch irgendwie erweitern/einstellen, damit das geht?

 

Ich bin für jeden Tipp dankbar!

 

Viele Grüße,

 

Christian

 

P.S Warum gibt es eigentlich kein [Ruby] Prefix?

Link to comment
Share on other sites

Bei mir funktionierts:

 

olaf@pc:~/build20/ruby$ ls
example_simple.rb  tinkerforge
olaf@pc:~/build20/ruby$ cat example_simple.rb 
#!/usr/bin/env ruby
# -*- ruby encoding: utf-8 -*-

require 'tinkerforge/ip_connection'
require 'tinkerforge/bricklet_distance_ir'

include Tinkerforge

HOST = 'localhost'
PORT = 4223
UID = 'aUt' # Change to your UID

ipcon = IPConnection.new # Create IP connection
dir = BrickletDistanceIR.new UID, ipcon # Create device object

ipcon.connect HOST, PORT # Connect to brickd
# Don't use device before ipcon is connected

# Get current distance (unit is mm)
distance = dir.get_distance / 10.0
puts "Distance: #{distance} cm"

puts 'Press key to exit'
$stdin.gets
olaf@pc:~/build20/ruby$ ruby1.9.1 -I. example_simple.rb 
Distance: 10.5 cm
Press key to exit

olaf@pc:~/build20/ruby$

 

Allerdings gibt es in der ruby Doku in der Tat kein "C<" als Argument für unpack: http://www.ruby-doc.org/core-1.9.3/String.html#method-i-unpack

 

Da es bei 8bit Typen keinen unterschied zwischen little- und big-endian gibt, ist es dort auch nicht notwendig.

 

Kannst du mal einmal testweise alle "C<" in der ip_connection.rb durch "C" ersetzen?

Link to comment
Share on other sites

Das hat funktioniert :-)

 

Was bedeutet das jetzt für die Bindings? Warum hat es bei Dir funktioniert und bei mir nicht? Liegt es einfach nur an meinem OS X 10.8/Ruby 1.9.3 System? Oder kann das Problem auch anderweitig auftreten?

 

Vielen Dank aber für den Workaround!

 

Grüße,

 

Christian

Link to comment
Share on other sites

Alles klar, vielen Dank für die Hilfe! Ich hab Ruby Bindings 2.0.2 veröffentlicht, die sollten mit Ruby 1.9.3 "out of the box" funktionieren.

 

Warum hat es bei Dir funktioniert und bei mir nicht?

 

Naja, das "<" bei "C<" bei einem unpack Aufruf ist überflüssig. In Ruby 1.9.1 wird das "<" einfach ignoriert, Ruby 1.9.3 schmeißt eine Exception. Vermutlich hat keiner der Ruby Entwickler daran gedacht, dass diese Änderung existieren Code brechen kann.

Link to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

×
×
  • Create New...