Seriellen Port auslesen (USB-Relais-Board)

madu

madu

Aktives Mitglied
Thread Starter
Dabei seit
16.11.2005
Beiträge
4.682
Reaktionspunkte
577
Hallo!

Hoffe ich bin hier richtig bei den Terminal-Profis :)
Ich bin es nämlich nicht :Pfeif:

Folgende Ausgangslage:
Ich habe mir für ein Projekt ein USB-Seriell-8-Relais-Board besorgt. Nach Installation der Treiber (FTDI) wird dieses auch erkannt unter /dev/cu.usbserial-xxxxxxxx und ich kann aus dem Terminal jedes der 8 Relais einzeln oder auch zusammen ein- und ausschalten. Die Codes dazu gabs im Forum des Herstellers zu finden.
Diese sehen so aus: (Relais 1 an / Relais 1 aus)
Code:
echo -e '\xFF\x01\x01' > /dev/cu.usbserial-xxxxxxxx
echo -e '\xFF\x01\x00' > /dev/cu.usbserial-xxxxxxxx

Nach einigem googeln und probieren kann ich die Relais mittlerweile auch per AppleScript schalten. :)

Soweit so gut.

Nun sollte ich für mein Projekt aber auch den jeweils aktuellen Zustand der einzelnen Relais abfragen können. Gemäss Hersteller wird dies vom Board auch unterstützt und ich kenne auch den Code.
Dieser lautet:
Code:
echo -e '\xFF\x09\x00' > /dev/cu.usbserial-xxxxxxxx
Ein kurzes blinken einer LED zeigt mir an, dass das Board den Befehl erkennt und was zurückgibt, bloss was und wohin?? :confused:
Wie kann ich das auslesen was das Board ausgibt?
Ideal wäre, wenn ich das Output in eine Textdatei geschrieben bekäme, dann könnte ich diese wiederum mit AppleScript oder was immer auslesen und weiterverarbeiten.

Hat jemand eine Idee wie das gehen könnte?
Ach, und bitte bitte möglichst Terminal-Noob-freundlich formuliert... :noplan:
 
Nun sollte ich für mein Projekt aber auch den jeweils aktuellen Zustand der einzelnen Relais abfragen können. Gemäss Hersteller wird dies vom Board auch unterstützt und ich kenne auch den Code.
Dieser lautet:
Code:
echo -e '\xFF\x09\x00' > /dev/cu.usbserial-xxxxxxxx
Ein kurzes blinken einer LED zeigt mir an, dass das Board den Befehl erkennt und was zurückgibt, bloss was und wohin??

Das kann so nicht funktionieren. Der echo Befehl ist ein Ausgabebefehl, da kommt nichts zurück.

Versuch mal:
Code:
echo -e '\xFF\x09\x00' > /dev/cu.usbserial-xxxxxxxx
cat /dev/cu.usbserial-xxxxxxxx

Wenn da etwas sinnvolles zurück kommt und die Ausgabe in eine Datei soll:
Code:
echo -e '\xFF\x09\x00' > /dev/cu.usbserial-xxxxxxxx
cat /dev/cu.usbserial-xxxxxxxx > datei.txt

Ist aber nur ein Schuß ins blaue.
 
Das kann so nicht funktionieren. Der echo Befehl ist ein Ausgabebefehl, da kommt nichts zurück.

Versuch mal:
Code:
echo -e '\xFF\x09\x00' > /dev/cu.usbserial-xxxxxxxx
cat /dev/cu.usbserial-xxxxxxxx
Tut sich leider überhaupt nix :(

Aber Danke für den Versuch. :)

Weitere Vorschläge?
 
screen /dev/tty.usbserial-xxxxxxxx 9600
 
screen /dev/tty.usbserial-xxxxxxxx 9600
Danke für Deinen Beitrag.
Leider passiert auch da nicht wirklich was oder ich weiss nicht wie anwenden?

War gestern nacht beim googeln anderswo auch schon auf dieses "screen" gestossen, aber irgendwie bringt mich das auch nicht weiter.
Wenn ich den Befehl eingebe, zeigt mir das Terminal einfach eine leere Seite an. Wie schick ich denn da nun den Befehl oder bekomme was zurück?

Was ist eigendlich der Unterschied zwischen tty. und cu. ?
"Sehen" kann ich das Board sowohl unter /dev/tty.usbserial-xxxxxxxx wie auch unter /dev/cu.usbserial-xxxxxxxx, aber Befehle zum öffnen/schliessen kann ich nur an dev/cu. ... schicken.

Jemand noch weitere Ideen zu meinem Problem? :)
 
Du musst halt deinen "echo ..." absetzen.

Probier' mal:
echo -e '\xFF\x09\x00' > /dev/cu.usbserial-xxxxxxxx && cat /dev/cu.usbserial-xxxxxxxx

Die cu devices sind Calling Unix Devices, also ohne Handshake. Gut für's scripten geeignet.
Während die ttys (teletype) blockieren, wenn der Handshake nicht stimmt. Vereinfacht gesagt.

Was sagt denn:
sudo stty -F /dev/tty.usbserial-xxxxxxxx
 
Zuletzt bearbeitet:
Probier' mal:
echo -e '\xFF\x09\x00' > /dev/cu.usbserial-xxxxxxxx && cat /dev/cu.usbserial-xxxxxxxx
da passiert nix :(

Was sagt denn:
sudo stty -F /dev/tty.usbserial-xxxxxxxx
stty: illegal option -- -F
usage: stty [-a|-e|-g] [-f file] [options]

/edit:

sudo stty -f /dev/tty.usbserial-xxxxxxxx

sagt:

speed 9600 baud;
lflags: -icanon -isig -iexten -echo
iflags: -icrnl -ixon -ixany -imaxbel -brkint
oflags: -opost -onlcr -oxtabs
cflags: cs8 -parenb
 
Zuletzt bearbeitet:
Musst Du die (Relais-)Ports initialisieren?
Was ist es denn überhaupt für ein Board?
 
Initialisieren muss ich eigendlich nix.
Treiber musst ich halt installieren.
Sonst nur an USB anstöpseln und dann kann ich mit den Befehlen die Relais schalten (Beispielcode im Eingangspost)
FF 01 01 => Relais 1 on
FF 01 00 => Relais 1 off
FF 02 01 => Relais 2 on
FF 02 00 => Relais 2 off
usw.
FF 09 00 sollte den Status zurückgeben...
das da irgendwas passiert zeigt ein kurzes blinken der Tx-LED

Das Board ist von KMtronic:
USB Eight Channel Relay Controller - RS232 Serial controlled - 12V

Communication Parameters:
8 Data, 1 Stop, No Parity
Baud rate : 9600

Im dortigen Forum hat jemand eigendlich genau das geschafft was ich möchte, aber unter Linux. Sein Code sieht so aus:
Code:
#!/bin/bash
echo -e "\xFF\x09\x00" | ./cats -b9600 /dev/relais > ./test &
sleep .2
killall cats
Aber dieses "cats" versteht mein Terminal nicht... :(
 
Ich denke, Du benötigst eine Software über die Du mit dem Seriellen Port kommunizieren kannst.
Kermit wäre eine Möglichkeit.
Kermit kann so ziemlich alles, aber es ist nicht ganz einfach zu durchschauen.
Im Linuxbereich ist außerdem minicom weit verbreitet und unter Windows wird Hyperterminal benutzt, was aber m. W. nicht so flexibel ist.
 
cats hab ich hier gefunden: http://github.com/leucos/cats
lässt sich sogar auf osx kompilieren, du musst nur die zeilen 214-225 in cats.c auskommentieren (sollte die eigentliche funktion nicht beeinträchtigen).

kannste vielleicht mal berichten obs funktioniert, diese relais karte würde mich auch interessieren!
 
Ich habe mittlerweile eine wunderbare Lösung nur mit AppleScript erarbeitet, siehe weiter unten.
Erst ein paar Kommentare und Bemerkungen:

Ich denke, Du benötigst eine Software über die Du mit dem Seriellen Port kommunizieren kannst.
Kermit wäre eine Möglichkeit.
Kermit kann so ziemlich alles, aber es ist nicht ganz einfach zu durchschauen.
Im Linuxbereich ist außerdem minicom weit verbreitet und unter Windows wird Hyperterminal benutzt, was aber m. W. nicht so flexibel ist.
Hmm, und ich dachte immer per Terminal geht alles - wenn man nur weiss wie... :rolleyes:
Tönt für mich alles etwas kompliziert.

cats hab ich hier gefunden: http://github.com/leucos/cats
lässt sich sogar auf osx kompilieren, du musst nur die zeilen 214-225 in cats.c auskommentieren (sollte die eigentliche funktion nicht beeinträchtigen).

kannste vielleicht mal berichten obs funktioniert, diese relais karte würde mich auch interessieren!
Cats hatte ich auch schon gefunden.
Mein Problem: ich habe nicht die geringste Ahnung, wie ich sowas auf Terminalebene istalliere
Wenn das einfach geht und mir jemand erklärt wie, probier ich's mal aus.
Allerdings hab ich ja jetzt eine gute Lösung per AppleScript.

Auf meiner endlosen Suche nach einer für mich guten Lösung bin ich auch immer wieder auf dieses "Screen" gestossen. Ich vermute, damit müsste es irgendwie möglich sein, aber bin auch da nicht weitergekommen. Mit weiter oben empfohlenem Befehl kann ich zwar so einen "Screen" öffnen, aber das wars dann auch schon. Eine Verbindung scheint hergestellt, jedenfalls ist der Port dann "busy", aber wie ich da jetzt Befehle schicken oder gar empfangen soll, entzieht sich meiner Kenntnis. Ich scheitere da schon beim Versuch, Screen wieder zu beenden... Sollte gem. Anleitung mit ctrl-a + ctrl-\ gehen, aber meine Tastatur hat keinen direkt ansprechbaren Backslash. Mir blieb da immer nur das Ausstöpseln des USB-Kabels, um die Screen-Session zu beenden...

Ich habe dann eine Reihe von kleinen Programmen ausprobiert, auf die ich bei der Recherche gestossen bin; ZTerm, iTerm, goSerial und weitere. Mit allen kann ich zwar eine Verbindung herstellen, aber Befehle senden oder empfangen ging nicht - bzw. ich habe es nicht geschafft .
Das einzige Tool, mit dem es schliesslich geklappt hat, sowohl die Öffnen/Schliessen Kommandos zu senden als auch den Status-Befehl und die Rückgabe zu lesen war CoolTerm Mac. Damit bekomme ich als Antwort sowas wie "00 01 00 00 00 00 00 01", was in diesem Beispiel bedeutet, dass Relais 2 und 8 (01) geschaltet sind und die anderen (00) nicht. Zumindest hat mir das gezeigt, dass der Befehl stimmt und dass das Board wirklich den Status zurückschickt. Leider hat mich das aber in Bezug auf eine Automatisierung nicht weitergebracht, da ich das Output von CoolTerm nicht weiterverarbeiten kann.

Nun zu meiner Lösung:
Ich habe mich dann wieder SerialPort X zugewandt, das ich bereits zuvor probiert hatte, aber damit ebenfalls nicht weiterkam.
SerialPort X ist eine AppleScript Scripting-Addition für serielle Kommunikation.
Bisher scheiterte ich aber daran, damit meine Kommandos zu senden. Das Problem dabei war offenbar das Format der Kommandos, die wohl in ASCII umgewandelt werden müssen. Nach langem Try & Error hab ich die Lösung gefunden.
Das HEX Kommando FF 01 01 (Relais 1 ein) kann auch dezimal notiert werden und lautet dann 255, 1, 1. Mittels einer kleinen Routine kann ich die dezimale Notation nun in ASCII-Code umwandeln und dann klappt alles wunderbar.
Auf ähnliche Weise kann ich das Output vom Board wieder in ein für mich brauchbares Format umwandeln, mit dem ich arbeiten kann.
Hier mein Test-Code:
Code:
-- bei mehreren genutzen Ports kann der Port auch ueber eine Auswahlliste definiert werden:
-- set device to choose from list (serialport list)
-- set portRef to serialport open device

-- den seriellen Port definieren und oeffnen
set portRef to serialport open "/dev/cu.usbserial-A800dBFH"
delay 0.1
if portRef is equal to -1 then
    display dialog "konnte den Port nicht oeffnen" & return & portRef
else
    
    -- Befehl zum Schliessen von Relais 1
    set myCmd to MakeString({255, 1, 1})
    serialport write myCmd to portRef
    delay 1
    
    -- Befehl zum Schliessen von Relais 8
    set myCmd to MakeString({255, 8, 1})
    serialport write myCmd to portRef
    delay 1
    
    -- Befehl zum Oeffnen von Relais 1
    set myCmd to MakeString({255, 1, 0})
    serialport write myCmd to portRef
    delay 1
    
    -- Befehl zur Rueckgabe des Status
    set myCmd to MakeString({255, 9, 0})
    serialport write myCmd to portRef
    delay 1
    
    -- Output vom Relaisboard lesen
    set x to serialport bytes available portRef
    if x is greater than 0 then
        set reply to serialport read portRef
        delay 0.1
        -- Output umwandeln
        set output to TranslateString(reply)
    else
        display dialog "kein Output erhalten"
    end if
    
    -- den seriellen Port schliessen
    serialport close portRef
    return output
    
end if


-- Input umwandeln
on MakeString(theBytes)
    set thestr to ""
    repeat with i from 1 to length of theBytes
        set thestr to thestr & (ASCII character (item i of theBytes))
    end repeat
    return thestr
end MakeString

-- Output umwandeln
on TranslateString(theReply)
    set thestr to {}
    repeat with i from 1 to length of theReply
        set thestr to thestr & (ASCII number (item i of theReply))
    end repeat
    return thestr
end TranslateString
Als Output bekomme ich dann eine Liste mit z.B. folgendem Inhalt:
{0, 0, 0, 0, 0, 0, 0, 1} => Relais 8 ist ein, Rest ist aus
Damit stehen mir nun alle Wege offen, um in AppleScript (oder egal womit) damit weiterzuarbeiten.

Zu guter Letzt bin ich dann noch auf Pashua gestossen.
Damit hab ich mir eine nette kleine GUI gebastelt, alles in AppleScript.
Das sieht dann so aus:
attachment.php

Beim Starten werden damit die aktuellen Zustände der Relais ausgelesen und dann im Fenster die entsprechenden Checkboxen aktiviert. Ich kann damit einzelne Relais ein-/ausschalten oder auch gleich alle ein / alle aus und sehe beim Start den aktuellen Status und bin damit jetzt völlig happy

diese relais karte würde mich auch interessieren
Die Relais-Karte als solches kann ich empfehlen.
Der Preis ist ok, die meisten vergleichbaren Karten sind teurer.
Der Versand von Bulgarien in die Schweiz dauerte nur ein paar Tage, die Versandkosten betrugen läppische 4€, das ist billiger als ein Versand innerhalb der Schweiz!
Eine Anfrage an den Support per Email wurde innert 1 h zufriedenstellend beantwortet.
 

Anhänge

  • Relais-GUI.jpg
    Relais-GUI.jpg
    67,3 KB · Aufrufe: 725
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Waldschrahdt und preller
Hmm, und ich dachte immer per Terminal geht alles - wenn man nur weiss wie...
In diesem Fall könnte man screen verwenden, was unter Mac OS X zum Standardrepertoire gehört.
Wollte ich nicht empfehlen, weil kermit einfach vielseitiger und mächtiger ist.
Mit screen ist es etwas mühsamer.
 
Hallo madu,

allerbesten Dank für Deinen Beitrag und vor allem Deinen Erfahrungsbericht! Und dass Du auch noch ein Listing als Beispiel mitgepostet hast, das könnte beispielgebend für alle die sein, die immer alles ganz einfach nennen und dann aber doch nicht wirklich weiterhelfen. Ich freue mich schon darauf, dass Du vielleicht bald wieder ein "Problem" hast und hier landest und ich (wenigstens) mitlesen und mitlernen kann!
Wofür hast Du das Relais verwendet? Was könnte man damit sonst so anfangen?
 
Datum !??
Ob die Karte nach 5 Jahren noch im Einsatz ist… ;)
 
Üben?
Oder hat sich in den letzten fünf Jahren an den Befehlen was geändert?
 
Ob die Karte nach 5 Jahren noch im Einsatz ist… ;)
Ja, ist sie, und funktioniert fehlerfrei :)

Wofür hast Du das Relais verwendet? Was könnte man damit sonst so anfangen?
Ich habe die Karte in eine Box eingebaut und damit eine automatisierte einzeln schaltbare 8fach-Steckerleiste gebastelt.
Diese ist Teil meines Media-Centers, so dass je nach über Fernbedienung gewählter Funktion die entsprechenden Geräte (bwz. deren Netzgeräte) zu- oder ausgeschaltet werden. Konkret sind das mehrere externe Festplatten, Aktivboxen, Netzwerk-Hub, USB-Hub, DVB-T-Antennenverstärker und Hintergrundbeleuchtung.

IMG_3489.jpg IMG_3487.jpg IMG_3484.jpg

Ich bin z.Z. gerade dabei, eine weitere Steckerleiste für meinen Haupt-Arbeitsplatz zu basteln, die einen ähnlichen Zweck erfüllen soll. Das neue Relay (mittlerweile mit Gehäuse erhältlich) wird nächstens bestellt. :)

Die im alten Beitrag erwähnte Scripting-Addition "SerialPort X" ist mittlerweile unter einer neuen Adresse zu finden:
http://alteredhorizons.capnix.com/MacSoft.html
Ob sie unter neueren Systemen noch funktioniert, weiss ich allerdings nicht, mein Media-Center läuft mit 10.6.8.

Der Hersteller der Relais-Karte hat übrigens meinen Beitrag in seine FAQ aufgenommen:
http://sigma-shop.com/manuals/usb_one_relay_macintosh.pdf
 
  • Gefällt mir
Reaktionen: Waldschrahdt
Hallo madu,

der gute Eindruck bleibt! Ich würde gern noch ein paar Einzelheiten zur Programmierung fragen, die wohl aber den Rahmen des Forum sprengen (und mich ziemlich blamieren) würden. Ist es möglich, Dir eine PN (Privatnachricht) zu senden? Oder geht das in diesem Forum gar nicht?
 
Zurück
Oben Unten