RS232 via Ruby auslesen

60 views
Skip to first unread message

Chris

unread,
Oct 6, 2013, 4:41:13 AM10/6/13
to leipzig...@googlegroups.com
Hi,

ich habe für ein Projekt die Anforderung, einen Datenstrom von einer RS-232-Schnittstelle einzulesen und weiterzuverarbeiten. Ich würde das gern mit Ruby machen, habe aber bisher zu wenig Erfahrungen damit. Ansteuern der RS-232 mit dem serialport-gem und byteweises Einlesen der Daten mittels getc bekomme ich hin. Ich würde allerdings statt mit getc gern mit IO.seek arbeiten, weil die Daten in jeweils 2 Feldern mit 20 bzw. 21 bit vorliegen und ich über diese Felder gern einen Zeiger wandern lassen möchte, der je nach den in den einzelnen Bits vorliegenden Steuerbefehlen bestimmte Operationen mit dem eigentlichen Payload durchführt.
Ich habe bereits ein Beispielprogramm erstellt, das einen in einer Datei aufgezeichneten Datenstrom verarbeiten kann, nur habe ich leider keine Idee, wie ich mit den "richtigen" Daten aus der Schnittstelle umgehen soll.

Danke
Chris

Folgend ist etwas Code, der illustriert, was gern machen würde. 

file = File.open("readin_bremen_2013_1.txt")

until file.eof?
  file.seek(3, IO::SEEK_CUR)
  buffer = file.read(2)
  
  case buffer
    when '0 '
      file.seek(5, IO::SEEK_CUR)
      event = file.read(3)
      heat = file.read(2)
      file.seek(26, IO::SEEK_CUR)
      # Weitere Operationen folgen ...
    end
end

Benjamin Knofe

unread,
Oct 6, 2013, 5:42:43 AM10/6/13
to leipzig...@googlegroups.com
ich kann nur aus linux sicht sprechen: wenn du dann z.b. einen RS232 zu USB konverter angeschlossen hast, bekommst du einfach ein /dev/ttyUSB0 von der du wie aus einer datei lesen kannst. für ruby sollte das am ende egal sein, obs eine richtige datei oder ne pseudogerätedatei ist. wenn du auf windows bist, habe ich absolut keinen plan :)

b

2013/10/6 Chris <del...@gmail.com>

--
Sie erhalten diese Nachricht, weil Sie Mitglied der Google Groups-Gruppe "Leipzig on Rails" sind.
Um Ihr Abonnement für diese Gruppe zu beenden und keine E-Mails mehr von dieser Gruppe zu erhalten, senden Sie eine Email an leipzigonrail...@googlegroups.com.
Weitere Optionen: https://groups.google.com/groups/opt_out

Tilo Dietrich

unread,
Oct 6, 2013, 9:04:34 AM10/6/13
to leipzig...@googlegroups.com
Hallo Chris,

zu Bens Idee ist mir noch eingefallen, dass auch die seriellen Ports selbst unter Linux als Character Devices ansprechbar sind. Das wären dann /dev/ttyS0 und dann hochgezählt.

Grüße
Tilo

Chris

unread,
Oct 7, 2013, 5:36:29 AM10/7/13
to leipzig...@googlegroups.com
Danke für die Anregungen. Ich bin auf einem Mac unterwegs und benutze zur Kommunikation mit der RS232 einen Keyspan USA-49GW 4fach Konverter. 
Das Teil ist auf dem Mac als /dev/tty.KeySerial1 verfügbar, ich kann es auch mit einem kleinen Testprogramm auslesen:

require "serialport"


# configure port
port_str
= "/dev/tty.KeySerial1"
baud_rate
= 9600
data_bits
= 8
stop_bits
= 1
parity
= SerialPort::NONE


sp
= SerialPort.new(port_str, baud_rate, data_bits, stop_bits, parity)


while true do
  puts sp
.gets
end


sp
.close


So weit, so gut. Leider klappt das nicht mehr, wenn ich o.g. zusammen mit IO.seek benutzen will - da passiert entweder überhaupt nichts, oder das Programm beschwert sich, dass ich sp anstelle eines File-Objektes benutze. 
Direktes Austauschen des Pfades in der ersten Zeile meines Code-Schnipsels aus der ersten Nachricht hilft auch nicht weiter:

file = File.open("readin_bremen_2013_1.txt")

ändern nach

 
file = File.open("/dev/tty.KeySerial1")

bringt leider nicht den gewünschten Erfolg. 

Ich habe erst am Wochenende wieder Zugriff auf das betreffende Gerät. Das ist leider ein recht unhandliches Teil, und ich kann Tests damit nur neben der Aufgabe, mit der ich eigentlich betraut bin, vornehmen. Nicht gerade ideale Voraussetzungen...
Bis dahin lese ich mal ein wenig über die IO-Klasse. Das kann sicher auch nicht schaden. 

Danke
Chris
Reply all
Reply to author
Forward
0 new messages